3 -14 迭代 和列表 生成器
列表生成式 执行效率高 简洁
a = []
for i in range(5):
a.append(i*2)
print(a)
列表形式
[a * 2 for a in range(5)] ##列表形式 执行效率低 主要是先完成生成 再展现 占用内存
##同样 可以传入函数 还执行
def aa(name): print('ni hao %s'%name ) print [a * 2 for a in range(5)] [aa(i) for i in range(5)]
生成器 :当你调用的时候还会给出结果 从而大大提高了调度性能
b = (a * 2 for a in range(50000))
print(b)
<generator object <genexpr> at 0x000000000256D3A8> ### 返回的只是一个内存地址
方法 b.next ()
python 3.x 是 b.__next__() 只能调取下一个 没有别的 方法再调取 上一个
>>> a [1, 2, 3, 4, 5, 6, 7, 8] >>> c = iter(a) >>> >>> c <listiterator object at 0x0000000002E26C18> ###iter(a) 将列表a 变成一个生成器
斐波那契
def aa(num): n,a,b = 0,0,1 while n < 10: print(b) a,b = b,a+b n+=1 aa(10)
列表生成
def aa(num): n,a,b = 0,0,1 while n < 10: yield (b) ###当启用yield的时候生成的结果是一个内存地址 变成了生成器 a,b = b,a+b n+=1 aa(10) ###返回值就变成了一个生成器 ###结果 <generator object aa at 0x00000000025AD3A8> cc = aa(10) print(cc.next()) print('-----------') ### 目前达到了随意进出一个程序 来执行想要的操作 print(cc.next()) print('============')
通过yeild 实现单线 并多线程任务 send语法运用
def aa(name): print('%s 过来玩'%name) while True: shop = yield print('%s 买了一个%s'%(name,shop)) ###此时 已经不是一个函数了 变成了一个生成器 # c = aa('lining') # c.next() # list = ['bao','jiucai','taozi'] # c.send(list) def bb(name): c = aa('a') c1 =aa('b') c.next() ##位置关键点 c1.next() ##位置关键点 print('开始生产包子啦') for i in range(10): print('2个包子。。。。。') c.send(i) c1.send(i) bb('th') ## 运行