python基础2-生成器generator、迭代器iterator
1、生成器
1)列表生成式,使列表更简洁
print([i*2 for i in range(10)]) a = [] for i in range(10): a.append(i*2) print(a) b = [] def func(x): return x**2 c = [ func(i) for i in range(10)] print(c)
2)生成器
g = (i*2 for i in range(10)) # print(g) # for j in g: # print(j) #生成器:只有在调用时才会生成相应的数据;只记录当前位置,只有一个__next__()方法,在2.7里是next()方法 print(g.__next__())
3)斐波那契数列
def fib(max): n,a,b=0,0,1 while n<max: print(b) a,b = b,a+b n = n+1 return 'done' #使用for循环,return done 这个done就不会打印 fib(10) #生成max个fibonacci
4)抓取异常
def fib(max): n,a,b=0,0,1 while n<max: #print(b) yield b #只要有yield出现,就不是函数啦,而是一个生成器 a,b=b,a+b n = n+1 return '--done--' #return的作用就是异常的时候打印的消息 f=fib(4) print(f) print(f.__next__()) print("*".center(20,"-")) # print(f.__next__()) # print(f.__next__()) # print(f.__next__()) # print(f.__next__()) while True: try: x = next(f) print('f:',x) except StopIteration as e: print('Generator return value:',e.value) break
5)生成器并行
#生成器并行 单线程下的并行效果,异步io的雏形,epool,我们称之为协程,比线程还小的单位 #next()只会调用yield,不会给yield传值 # 而send也是调用yield,还可以给yield传值 import time def consumer(name): print("%s 准备吃包子啦!"%name) while True: baozi = yield print("包子[%s]来啦,被[%s]吃了!"%(baozi,name)) c = consumer("老头") c.__next__() c.send("西葫芦馅") #c.__next__() c = consumer("罗利宇") c.__next__() b1="韭菜鸡蛋馅" c.send(b1) def producer(name): c = consumer('A') c2 = consumer('B') c.__next__() c2.__next__() print("[%s]开始准备做包子啦!"%name) for i in range(3): time.sleep(1) print("[%s]做了1个包子,分两半!"%name) c.send(i) c2.send(i) producer("老头") #可以直接作用于for循环的数据类型: #一类是集合数据类型,如list,tuple,dict,set,str等 #一类是generator,包括生成器和带yield的generator function #可以直接作用于for循环的对象统称为可迭代对象:Iterable #使用isinstance()判断一个对象是否是Iterable对象 from collections import Iterable print(isinstance([],Iterable)) print(isinstance((x for x in range(10)),Iterable)) #可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator #通过dir查看所有的方法,如果有next()方法,就说明是一个迭代器,只是可迭代的话不一定有next() from collections import Iterator print(isinstance((x for x in range(10)),Iterator)) #生成器一定是迭代器,迭代器不一定是生成器 生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator, 把list、dict、str等Iterable变成Iterator,可以使用iter()函数 from collections import Iterator print(isinstance([],Iterator)) print(isinstance(iter([]),Iterator)) a = [1,2,3] b = iter(a) print(b.__next__()) print(b.__next__()) print(b.__next__()) # print(b.__next__()) #在3.0 python中range是迭代器,在2.0中range是列表,xrange才是迭代器 print(range(10)) #在2.7 f有next方法,就是迭代,但是next不能直接用 for line in f.xreadlines() 才能用next(),且只能用next
6)匿名函数
#匿名函数只是没有名字 #函数即变量,只要在调用前,函数定义完毕就ok calc = lambda x:x*3 print(calc(3))
#alt能直接选中前边的某几列,然后一体删除
#ctrl+/多行注释或取消

浙公网安备 33010602011771号