1、生成器
1.1、c = ( i*2 for i in range(10)) #用括号括起来,就变成一个生成器generator,生成器其实是一个内存的起始点
print(c.__next__()) #生成器只能用__next__()一个一个调用出来
for i in c: #可以通过for语句进行输出生成器的元素,c是可以进行迭代的对象
print(i)
1.2、通过yield关键字,可以让一个函数变成生成器
def fib(max):
n,a,b = 0,0,1
while n < max:
#print(b)
yield b
a,b = b,a+b
n += 1
return 'done'
data = fib(10)
print(data.__next__) #遇到yield直接打断程序的执行,直接返回一个b=1的值
print(data.__next__) #再次执行时候,从a,b = b,a+b开始执行,此句意思是
tuple = (a,a+b)
a= tuple(0) b = tuple(a+b),此时 a=0,b=1
然后n=1,继续执行while语句,都yield程序中断,返回b=1
print(data.__next__) #再次执行,此时从a=tuple(0)=1, b=tuple(1)=2,到yield程序中断,返回值b=2
因为生成器是一个可以迭代的对象,所以可以用for循环:
for i in fib(6):
print(i)
1.3、生成器并行
def consumer(name):
print("%s 准备吃包子啦!" %name)
while True:
baozi = yield #直接中断生成器
print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
c = consumer("ChenRonghua") #变成生成器
c.__next__() #只是唤醒生成器,不做任何传值操作
b1 = "韭菜馅"
c.send(b1) #即做唤醒又传值
2、装饰器
2.1、高阶函数:把函数当成参数传递的一种函数
def add(x,y,f):
return f(x) + f(y)
print(add(-8,11,abs)) #abs是取绝对值
python内置的高阶函数:
map()函数:它接收一个函数f和一个list,并且把list的元素以此传递给函数f,然后返回一个函数f处理完所有list元素的列表
def f2(x):
return x*x
l = [1,2,3,4]
print(map(f2,l))
执行结果:[1,4,9,16]
2.2、实现装饰器知识储备:
1、函数即“变量”
2、高阶函数
3、嵌套函数
高阶函数 + 嵌套函数 = 装饰器
装饰器:
定义:本质是函数,(装饰其它函数)就是为其他函数添加附加功能
原则:1、不能修改被装饰的函数的源代码
2、不能修改被装饰的函数的调用方式
def timer(func): #timer(test1) func=test1
def deco(*args,**kwargs): #可以是无数变量和字典
start_time = time.time()
func(*args,**kwargs) #相当于执行的test1()
stop_time = time.time()
print("the func run time is %s" %(stop_time - start_time))
return deco
@timer #test1=timer(test1),因为timer(test1)执行之后会返回deco的内存地址
def test1():
time.sleep(3)
print('in the test1')
test1() #相当于执行的deco()
3、匿名函数
add = lambda x, y : x+y add(1,2) # 结果为3
4、JSON序列化和反序列化
4.1、JSON序列化:
import json
info = {
'name':'alex',
'age':22,
}
f = open("test.text","w")
f.write(json.dumps(info))
f.close()
info是字典,如果存起来之后,只能以字符串存储,如果想要拿出来只能是字符串了,不能是字典格式了,json是一种中间格式,
可以将info以字典格式放到json文件中
4.2、JSON反序列化
import json
f = open("test.text","r")
data = json.loads(f.read())
print(data["age"])
print(data["name"])
JSON反序列化自后,就变成字典格式了,而且可以对字典格式的数据进行KEY调用