Python-生成器进阶2
今日内容:
生成器进阶内容:
计算移动平均值(例子)
def wrapper(func): # 生成器预激装饰器
def inner(*args,**keargs):
g = func(*args,**keargs)
g.__next__()
return g
return inner
@wrapper
def average_func():
total = 0
count = 0
average = 0
while True:
value = yield average
total += value
count += 1
average = total/count
g = average_func()
print(g.send(30))
send关键字:
首先,send和next工作的起止位置是完全相同的
send可以把一个值作为信号量传递到函数中去
在生成器执行伊始,只能使用next
只能用send传递参数的时候,必须在生成器中有一个未被返回的yield
列表推导式和生成器表达式:
new_l = []
for i in [1,3,5]:
new_l.append(i*i)
print(new_l)
#下边是列表推导式
print([i*i for i in [1,3,5]])
总结:
1.把列表解析的[]换成()得到的就是生成器表达式
2.列表解释与生成器表达式都是一种遍历方式,只不过生成器表达式更节省内存
3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。
例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和
sum(x ** 2 for x in range(4))
到这里,两天的迭代器和生成器就写完了。
本章小结:
可迭代对象:
拥有__iter__方法
特点:惰性运算
例如:range(),str,list,tuple,dict,set
迭代器Iterator:
拥有__iter__方法和__next__方法
例:
iter(range()),iter(str),iter(list),iter(tuple),iter(dict),iter(set)等
生成器Generator:
本质:迭代器,所以拥有__iter__方法和__next__方法
特点:惰性运算,开发者自定义
使用生成器的优点:
1.延迟计算,一个返回一个结果,也就是说,她不会一次生成所有的结果,这对于大数据处理,将会非常有用。
#列表解析 sum([i for i in range(100000000)])#内存占用大,机器容易卡死 #生成器表达式 sum(i for i in range(100000000))#几乎不占内存
2.提高代码可读性
生成器相关的面试题:
def demo():
for i in range(4):
yield i
g=demo()
g1=(i for i in g)
g2=(i for i in g1)
print(list(g1))
print(list(g2))
def add(n,i):
return n+i
def test():
for i in range(4):
yield i
g=test()
for n in [1,10]:
g=(add(n,i) for i in g)
print(list(g))
面试题2

浙公网安备 33010602011771号