1 # -*- coding:utf-8 -*- 2 # LC 3 # 列表生成式 4 def func(x): 5 print(x) 6 return 2*x 7 print([ func(i) for i in range(10) ]) 8 9 a = [ i*2 for i in range(1000000000000)] #此列表生成式会占用大量内存空间,在没有调用的情况下,列表已经存在于内存中 10 len(a) 11 # 生成器 12 b = ( i*2 for i in range(1000000000000)) #生成器,只有在调用b的时候,才会按着规则进行运算,将结果返回给b,使用的时候才占用内存,速度快 13 #生成器不支持切片 14 b[100] #这种无法直接取出来 15 for i in b: 16 print(i) 17 18 #生成器 19 #1.只有在调用的时候,才会生成相应的数据 20 #2.只记录当前的位置 21 #3.只有一个__next()__方法 22 23 #fibnacci函数 24 #函数生成器,使用yield,用了yield的函数,就不在是一个函数,而是一个生成器 25 def fib(max): 26 n,a,b = 0,0,1 27 while(n<max): 28 n += 1 29 yield b #yield是会返回当前值给函数,执行一次,__next__方法会调用yeild值 30 a,b = b,a+b 31 return "---done---" 32 from collections import Iterator 33 34 f = fib(1) 35 print("-------",isinstance(f,Iterator)) 36 while True: 37 try: 38 g = f.__next__() 39 print("function generator:",g) 40 except StopIteration as e: 41 print("Generator is stop,value is ",e.value) 42 break 43 #send 会唤醒当前生成器,并传递一个值给yeild 44 45 def consumer(name): 46 print("%s 准备开始吃包子了"%name) 47 while True: 48 baozi = yield 49 print("包子{%s}来了,{%s}请吃吧!"%(baozi,name)) 50 51 def producer(name): 52 c1 = consumer("A") #此步骤仅是将函数变成生成器,而生成器不会执行,如果要执行则需要调用__next__方法,__next__方法遇到yield则中断 53 c2 = consumer("B") 54 next(c1) #等于c1.__next__()方法 55 next(c2) 56 print("%s 做包子了"%name) 57 for i in range(6): 58 print("包子[%s]好了,分成两份"%i) 59 c1.send(i) 60 c2.send(i) 61 62 producer("lvcheng") 63 64 #1. 函数的执行流程是按着顺序执行,遇到return和最后一行的时候函数才结束执行,生成器是在每次调用__next__()的时候,在遇到yield语句的时候返回,并在下一次调用的时候,继续在上一次yield执行的位置继续 65 #2. 可以通过for循环的对象称为可迭代对象,可以通过isinstance()判断一个对象是否为可迭代对象,列表,元组,字典,字符串都是可迭代对象,而整数则不是 66 from collections import Iterable #导入Iterable可以判断一个对象是否为可迭代对象 67 print(isinstance([],Iterable)) #True 68 print(isinstance({},Iterable)) #True 69 print(isinstance((),Iterable)) #True 70 print(isinstance("abcd",Iterable)) #True 71 print(isinstance((x for x in range(10)),Iterable)) #True 72 print(isinstance(100,Iterable)) #False 73 74 #迭代器 75 #1. 可以被next()函数调用并不断返回下一个值的对象称为迭代器 76 #2. 可以同isinstance()判断一个对象是否是Iterator 77 #3. 生成器都是迭代器,但列表,字符串,字典等不是迭代器,可以使用iter()函数变成迭代器 78 from collections import Iterator 79 print(isinstance((x for x in range(10)),Iterator)) #True 80 print(isinstance([],Iterator)) #False 81 print(isinstance(iter([]),Iterator)) #True