python基础

注释快捷键

  ctrl + \  (注释与取消注释)

转义

  使用 r " " 代表 " " 中的不转义,

print('\\\t\\byy')
print(r'\\\t\\byy')

>>>\ \byy
>>>\\\t\\byy

  对于参数为路径的,为什么要带r‘’, 因为,路径中有“\",  "\"为转义符,带上r”“,代表不转义,否则会报错

path3 = os.path.dirname(r'C:\Users\viruser.v-desktop\PycharmProjects\hexin\practice\pickle.txt')

 

sep

end

  print()的参数,sep:值与值得分隔符,默认为空格;  end:以什么结尾

  print()默认在字符串末尾增加换行符结尾,对于输出后不想换行时,可增加:end = “”

 

字符串

  编码

    ascii  : 一个字节

    unicode: 通常为2个字节,

    utf - 8 :可变长编码,字母等为一个字节,汉字通常为三个字节,生僻字等为四-六个字节

   在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码

  s.encode:  编码

print(b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore'))   # 忽略编码中无法被编码部分

  s.decode:解码

  len(s) : 字符串长度

 

 内置数据类型

  list 、  tuper、  dict 、  set

 

  list: 有序可变列表,可随时添加和删除元素  

    创建list: L1 = [1, 2, 3]

    使用索引访问list,当索引超出范围时,提示indexError

 

  tuper:有序列表,初始化后不可变

    创建tuper: t1 = (1,2,3), 定义tuper只有一个元素时,必须加一个逗号,t = (1,) (用以和数学中t =(1)区分,数学中该括号为小括号,不为元组)

 

  dict:使用键-值存储(键不重复),具有极快的查找速度(也成为map),可添加和删除键值

    当字典中key不存在时,报错提示 “key error”

    判断key是否存在方法:

     “key” in dict

     dict.get(‘key’)

  dict中的key为不可变对象(需要通过key计算位置(哈希算法));

  不可变对象:字符串、整数等均可作为key,list为可变对象不能作为key

dict  = {"yuyu":12, "hahau":13}
dict['bubu'] = 34
print(dict)
print('yuyu' in dict)    # 使用in判断key是否存在,结果为true/false
print(dict.get("bubu"))   # 使用get判断key是否存在,不存在时返回None
key = [1,2,3]
dict[key]  = 'lala'   #  使用列表作为可以,报错提示typeError
print(dict)


>>>
{'yuyu': 12, 'hahau': 13, 'bubu': 34}
True
34
Traceback (most recent call last):
  File "C:/Users/viruser.v-desktop/PycharmProjects/hexin/practice/practice.py", line 115, in <module>
    dict[key]  = 'lala'
TypeError: unhashable type: 'list'

 set : 集合,无重复元素

    创建set: s = set([1,2,3])

    重复元素在set中会自动被过滤

s1 = set([1,2,3])
s2 = set([1,4,5,6,2])
s1.add(2)  #  在集合中增加重复元素会被自动过滤掉
print(s1)
print(s1 & s2)  # 交集
print(s1 | s2)  # 并集

>>>
set([1, 2, 3])
set([1, 2])
set([1, 2, 3, 4, 5, 6])

  内置数据类型小结:

  tuple:不可变列表,代码更安全,需要对列表防止修改时,可使用tuple代替list

  list:随着元素增加查找和插入的时间增加;占用空间小

  dict:查找和插入速度极快,不会随着key是增加而变慢; 但需要占用大量内存

    set :与dict的唯一区别为没有存储对应的value,与dict一样不可放入可变元素(无法判断两个元素是否相等)

 

  可变对象与不可变对象:

  可变对象:list,dict,set等,对该变量操作后,对象值发生变化

  不可变对象:str,对str变量操作后,实际是创建了新的变量,原变量内容不变

  

L1 = [1,2,3]
L1.append(4)
a = 'abc'
b = a.replace('a', 'A')  # replace替换a字符串中值,a指向的对象不变,使b指向创建的新对象'Abc'
print("L1的值为:{0}\na的值为:{1}\nb的值为:{2}".format(L1, a, b))  

>>>
L1的值为:[1, 2, 3, 4]
a的值为:abc
b的值为:Abc

 

函数

  内置函数:

    http://docs.python.org/3/library/functions.html   (可查看内置函数有哪些,及内置函数的用途)

    调用函数时,参数数量错误/参数类型错误均会报错:typeError,(具体错误原因查看错误信息)

print(hex(25print(hex(255))  #将255转换为16进制5))  

>>> oxff

    

    参数类型检查  :使用内置函数:isinstance()

def my_abs(x): 
    if x >= 0:
        return x
    else:
        return -x

print(my_abs('a'))

>>> a

#  上述my_abs 的定义未对参数类型进行检查,应添加定义只允许整数和浮点数类型的参数
def my_abs(x):
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type for my_abs():{0}'.format(type(x)))
    if x >= 0:
        return x
    else:
        return -x

print(my_abs('a'))

>>>
Traceback (most recent call last):
  File "C:/Users/viruser.v-desktop/PycharmProjects/hexin/practice/practice.py", line 129, in <module>
    print(my_abs('a'))
  File "C:/Users/viruser.v-desktop/PycharmProjects/hexin/practice/practice.py", line 123, in my_abs
    raise TypeError('bad operand type for my_abs():{0}'.format(type(x)))
TypeError: bad operand type for my_abs():<type 'str'>

 

  函数参数

    位置参数:调用函数,按位置输入参数,例power(x),x就为位置参数

def power(x):   #  计算x2
    return x * x

    

    默认参数: (默认参数降低调用函数的难度,对于有多个参数,其中几个参数基本不变时可采用默认参数)

def power(x,n=2):  # 默认求x2,求xn时,需输入n对应的值
    s = 1
    while n>0:
        n = n -1
        s = s*x
    return s

      默认参数必须指向不可变对象

def add_end(L=[]):   # 可修改 L = None
    L.append('end')
    return L

print(add_end([1,2,3]))
print(add_end(['x','y']))
print(add_end())
print(add_end())  # 当默认参数为可变时,定义是,L=[],首次调用时 L=['end']即L的值被改变,,即每次调用时,默认参数的值会被改变,不再是[]
>>> [1, 2, 3, 'end'] ['x', 'y', 'end'] ['end'] ['end', 'end']

 

    可变参数:可变参数允许传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple

         当参数已经是一个list或者tuple时,可将该list/tuper直接作为可变参数传入

def calc(*numbers):  # 求 a2 + b2 + c2.....
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum


print(calc())
print(calc(5, 6, 7))
num = [1, 2, 3, 5, 7, 8, 9]
print(calc(*num))  # 将该list/tuper直接作为可变参数传入

    

    关键字参数:允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

def person(name, age, **kw):
    print('name:{0};age:{1};other:{2}' .format(name, age, kw))

person("雨雨", 23, city = 'bj',score = '100')

#  在python2以ascii编码,因此不能直接print(name,age),print(name,age)返回为一个元组,而name为汉字,age为数字,,统一使用ascii编码时汉字会乱码。

      命名关键字参数  :限制关键字参数的名字

def person(name, age, *, city, job):
    print(name, age, city, job)

>>> person('Jack', 24, city='Beijing', job='Engineer')

Jack 24 Beijing Engineer

>>>kw = {'city':'bj', 'score':'100'}  
person("雨雨", 23, **kw)

 

  递归函数

# coding=utf-8
"""
  删除列表中相邻重复元素,例,当abbac,删除重复元素bb后,为aac,继续删除aa
"""
def transfer (s):
    m = len(s)
    for i in range(1, m):
        if s[i] == s[i-1]:
            s.remove(s[i])
            s.remove(s[i-1])
            return transfer(s)   # 此处必须使用return 代表外层函数的结束,若无return代表调用函数执行完继续执行外层函数
    print(s)

s = ['a','b','b','a','c','a']
transfer(s)

 

python 特性

  切片:切片可应用于list、tuper、字符串    

l = [1,2,3,4]
print(l[x:y:z])   #x默认为0,y默认为最后一个,z默认为1  

 

  迭代:迭代可应用于list、tuper、字典、字符串等可迭代对象上

  判断对象是否可迭代 ?

list = [1,2,3,4,5]
dict = {'a':1, 'b':2, 'c':3}
char = ('ABC')

for L in list:
    print(L)
for i, L in enumerate(list):  # 同时迭代list中的索引和值
    print(i, L)

for key in dict:   # 迭代字典中的key
    print(key)
for value in dict.values():  # 迭代字典中的value
    print(value)
for key, value in dict.items():  # 同时迭代字典中的key和value
    print(key,value)

for ch in char:
    print(ch)

 

  列表生成式 :创建list的生成式

# 生成list:1,2,3,4,5,6....
L1 = list(range(1,22))

#  生成[1*1,2*2,3*3...]
L2 = [x * x for x in range(1,11)]

# 生成[2*2, 4*4, 6*6..]等偶数的平方
L3 = [x * x for x in range(1,11) if x % 2 == 0]

# 列出当前目录下多有文件和目录名
import os
L4 = [d for d in os.listdir('.')]

# 使用两个变量生成列表
d = {'x': 'A', 'y': 'B', 'z': 'C' }
L5 = [m + '=' + n for m, n in d.items()]

# 把list中所有字符串变成小写
L = ['Hello', 'World', 'IBM', 'Apple']
L6 = [s.lower() for s in L]

# 将列表中所有大写字母变为小写,其余不变
Ln = ['Hello', 'World', 18, 'Apple', None]
L7 = [s.lower() if isinstance(s,str) else s for s in Ln ]

  

  生成器:当列表元素可通过某种算法推算出来时,可在循环过程中不断推算出后续的元素

定义生成器的两种方法:

第一种:将列表生成式中的【】变为()

g = (x * x for x in range(10))  # 将列表生成式中的[]变成()该g为一个生成器

# print(g.next())  # 需要获取列表的下一个数据时,不断获取g.next()

''' for n in g:    # 可通过循环输出所有列表元素
        print(n)
'''
for n in range(0,5):   #也可设定输出区间内的列表元素
    print(g.next())

第二种:yield  :遇到yield时返回,下次执行从上次返回的yield语句出继续执行

# 斐波拉契数列
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
'''
 m = fib(10)   # 创建一个generator的对象,然后不断调用next获取下一个返回值
 print(next(m))
'''
for n in fib(10): # 使用循环不断调用yield
    print(n)

例:杨辉三角

'''杨辉三角'''
def triangles():
    L = [1]
    while True:
        yield(L)
        L.append(0)
        L = [L[i]+L[i-1] for i in range(len(L))]
        
m = triangles()
for t in range(10):
    print(m.next())

 

  迭代器:可以被next()函数调用并不断返回下一个值得对象成为迭代器 :  Iterator

  凡是可以作用于for的为可迭代对象:Iterable,如list、dict、str; 但可以通过iter()函数获得一个Iterrator对象

m = [1,2,3] # Iterable
L = [x for x in range(10)]  # Iterator

M = iter(m)  
print(M.next())

 

posted @ 2021-06-19 16:34  小小鱼鱼儿  阅读(63)  评论(0编辑  收藏  举报