python3 学习笔记
// r 不转义
print(r'\t ')
//'''多行
print('''afa
afa
afaff''')
10//3 =>3
内存中统一用unicode编码 当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码
Python 3版本中,字符串 str 类型 是以Unicode编码的
ord/chr
b'ABC' bytes类型,每个字符只一个字节
encode.('utf-8/ascii') //结果bytes
len('中文') //2
list
类型可不同,pop(1) 删除index为1的元素
append/insert/pop
tuple
list(range(5)) //[0,1,2,3,4]
dict
key一定要是不可变对象 str 不可变 可作key
d.get('k') //不存在返回None
d.get('k',-1) //不存在返回-1
'k' in d //用in 判断在不在
set
set([1,2,3])
无序不重复元素集合,看成是dict的key的集合
add/remove
多个变量可以同时接收一个tuple,按位置赋给对应的值 返回一个tuple可以省略括号
默认参数必须指向不变对象
def add_end(L=None):
if L is None:
L = []
L.append('END')
return L
调用时 *nums表示把nums这个list的所有元素作为可变参数传进去
定义时 *nums nums为有多个传入的值组成的tuple
定义时 * 后面再用参数为 关键字参数
for k,v in d.items()
from collections import Iterable
isinstance('abc',Iterable) // 是否可迭代
for i, value in enumerate(['A', 'B', 'C']): // 像java一样
>>>generater
把一个列表生成式的[]改成(),就创建了一个generator
如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator
把list、dict、str等Iterable变成Iterator可以使用iter()函数
Iterator表示的是一个数据流,计算是惰性的,只有在需要返回下一个数据时它才会计算
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量
argv至少有一个元素,因为第一个参数永远是该.py文件的名称
环境变量PYTHONPATH 会被自动添加到模块搜索路径
private __xxx
__name是因为Python解释器对外把__name变量改成了_classname__name
type/isinstance/dir/getattr/steattr/hasattr
给实例绑定属性的方法是通过实例变量,或者通过self变量
不加self的类中定义的变量是 类变量
千万不要把实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性
from types import MethodType
s.set_age = MethodType(set_age, s) # 给实例绑定一个方法
Student.set_score = set_score #给class绑定方法
__slots__ = ('name', 'age') # 定义class的时候 用tuple定义允许绑定的属性名称
__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
@property装饰器就是负责把一个方法变成属性调用的
__len__/__str__/__repr__/__iter__/__next__/__getitem__/__setitem__/__delitem__
__getattr__ __call__直接调用实例
metaClass
class ModelMetaclass(type):
class Model(dict, metaclass=ModelMetaclass):
io
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!'
StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO
shutil模块提供了copyfile()的函数,你还可以在shutil模块中找到很多实用函数,它们可以看做是os模块的补充
序列化,在Python中叫pickling
print(json.dumps(s, default=lambda obj: obj.__dict__)) #对像转为json
print(json.loads(json_str, object_hook=dict2student)) #json转对象
加个?就可以让d+采用非贪婪匹配