列表生成器_创建和调用练习
1 # Author:CallMeV 2 # DATE :2019-11-08 3 # Time : 17:53 4 5 a = (x for x in range(5))#创建列表生成器的第一种方法 6 print(a) #<generator object <genexpr> at 0x000001E1FBA3FF20> 7 8 print(next(a)) # 0 调用方式:next()内置方法 9 print(next(a)) # 1 10 print(next(a)) # 2 11 print(next(a)) # 3 12 print(next(a)) # 4 13 14 b = (x**2 for x in range(5)) 15 16 for i in b: # 调用方法2,for循环遍历,列表生成器本身就是一种可迭代对象(iterable) 17 print(i) 18 19 #创建列表生成器的第二种方法 20 def foo(): 21 print('ok1') 22 yield 1 23 print('ok2') 24 yield 2 25 26 g = foo() 27 print(foo) # <function foo at 0x000001B09C31C1F0> 28 print(foo()) # <generator object foo at 0x000001B09C32FDD0> 29 a = next(g) 30 print(a) 31 b = next(g) 32 print(b) 33 34 def foo1(): 35 print('ok1') 36 yield 1 37 print('ok2') 38 yield 2 39 40 for i in foo1(): 41 print(i) 42 43 #斐波那契数列 44 def fib(max): 45 n,a,b = 0,0,1 46 while n < max: 47 yield a 48 a , b = b , a + b 49 n = n + 1 50 for i in fib(10): 51 print(i)
生成器对象的好处在于:节省内存,现算现用,过后内存回收,对于大量数据来讲很好;
缺点在于:不像列表那么灵活,想要哪个就可以拿哪个(eg:想吃第三道菜,必须把前两道吃完)
1 # send 方法 和yield类似。但可是给yield之前的参数传值 2 def bar(): 3 print('ok1') 4 count = yield 1 5 print(count) 6 print('ok2') 7 yield 2 8 9 g = bar() 10 set = g.send(None) #第一次必须传None 11 print('第一次返回值>>',set) # 1 12 set = g.send('eee') 13 print('第二次返回值>>',set) # 2

浙公网安备 33010602011771号