wxg学习笔记-老男孩day4
一、装饰器:
本质:是函数,由高阶函数和嵌套函数结合而成。
功能:装饰其他函数,在不改变被装饰函数源代码和调用方式的前提下为其添加附加功能。
原则:1.不能修改被装饰函数的源代码 2.不能修改被调用函数的调用方式
函数就是变量,定义一个函数相当于把函数体(地址)赋值给函数名。
1 def foo(): 2 print("in the foo") 3 bar() 4 5 def bar(): 6 print("in the bar") 7 8 foo()
在foo()调用之前,对foo和bar的解释已经完成,内存中已经建立储存这两个函数的空间;若对bar的定义在对foo的调用之后,则会报错,因为调用foo()时内存中还没有bar()
装饰器示例1:
被装饰函数带参数:
装饰器本身带参数:
二、迭代器&生成器&列表生成式
列表生成式:[fun(i) for i in range(10)]
生成器:不创建完整的list,而在循环过程中不断推算出后续元素,从而节省大量的空间。成为生成器(generator)
(i*2 for i in range(10))
生成器只有调用才会生成相应数据(只记住当前数据),故不支持切片和直接按照下标取元素,只能通过next()取下个元素。
用函数做生成器和生成器的循环:
用生成器做并行:待补充
迭代器:
可直接作用于for循环的数据类型有以下几种:
一是集合数据类型:如list,tuple,dict,set,str等
一类是generator:包括生成器和带yield的generator function
这些课直接作用于for循环的对象统称为可迭代对象:Iterable
可以使用isinstance()判断一个对象是否是可Iterable对象。
from collections import Iterable isinstance([],Iterable) isinstance('abc',Iterable)
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator.
可以使用isinstance()判断一个对象是否是Iterator
isinstance((x*x for x in range(10)),Iterator)
生成器不但可以作用于for循环,还可以被next()调用并返回下一个值,直到最后抛出StopIteration错误,表示无法继续返回下一个值。
所以,生成器都是迭代器,但list、dict、str虽然是可迭代对象,但不是迭代器。
把list、dict、str等Iterable变成Iterator,可以使用iter()函数:
a = [1,2,3]
b = iter(a)
range()生成的就是一个迭代器。
三、内置函数
all()——对可迭代对象操作,若所有元素为真(非零),则返回真,否则返回FALSE
any()——若一个元素为真(非零),则返回真
ascii()——把一个数据变成可打印的字符串形式
bin()——十进制转二进制
bool()——判断真假(是否为零)
bytes()——转为二进制
bytearray()——转为可修改的二进制
callable()——判断对象是否可调用(后面能加()的就可以调用),例如list不可调用,fun()可以调用
chr()——把ascii码转为对应字符
ord()——返回字符对应的ascii码,和chr()互逆
dir()——查看对象所有可操作方法
divmod(a,b) ,返回a/b的商和余数
eval()字符串变成代码
exec()——读字符串为可执行代码并执行。
匿名函数:对不重复使用的函数可用匿名函数,不需要显式地定义函数,直接传入匿名函数更方便。
1 def sayhi(n): 2 print(n) 3 等价于 4 sayhi = lambda n: print(n)
filter(function,iterable)
map(function,iterable)
map接收两个参数,其中一个是iterable,map将函数作用于序列的每个元素,将结果以iterator返回。
map(lambda n: n * 2,range(10))
把range(10)中的每个值传给lambda操作。
reduce(function,iterable):把一个函数作用在一个序列上,这个函数必须接收两个参数,reduce把函数结果作为一个参数和序列的下一个元素再次传入函数做累计计算,效果就是:
reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3)x4)
frozenset():将参数转为不可变集合
globals()——返回当前程序中所有全局变量的k-v格式。
hash()——简历对象和数字映射关系
hex()——转为十六进制
id()——返回内存地址
locals()——在函数模块内打印局部变量k-v值
oct()——转为八进制
pow(x,y)——x的y次方
round(小数,位数)——保留指定位数的小数
sorted()——将seq排序
reversed(seq)——将seq颠倒顺序
若a是一个字典:
sorted(a.items())——按key排序
sorted(a.items(),key = lambda x:x[1]),其中a.items()是生成一个列表,x表示这个列表中的元素,x[1]表示元素的第二项,即value,若是改为x[0],则是按照key排序。
sum()——把可迭代的对象求和
zip(*args)——将多个可迭代对象元素一一组合(按最少的)。
四、序列化和反序列化:
json序列化:将内存上的对象以字符串形式放入硬盘。
json反序列化:将文件对象转为可执行代码
对于比较复杂的对象序列化使用pickle代替json.并且打开方式是wb或者rb,即以二进制形式打开
对同一个文件:load和dump只操作一次,否则会内容重复出错。
五、软件目录结构规范:
print(__file__)#返回当前程序相对路径
print(os.path.abspath(__file__))#返回当前程序绝对路径
sys.path.append() #添加环境变量
要调用其他路径的模块,首先应当添加该模块所在目录为环境变量。