12 生成器
生成器
1.迭代器不能等价代换
def func():
yield "1"
yield "2"
g=func()
g.__next__() #用这种方式,一个个取值
func().__next__() #不用这种方式,因为这种方式,每次都是新创建一个迭代器,取出来的都是第一个值
生成器
1. 本质就是迭代器
两种方式写生成器
1. 生成器函数
2. 生成器表达式
2.生成器函数
函数内部有yield. yield返回 -> return
yield可以把函数分段执行
生成器函数被调用的时候. 返回生成器
def func():
yield
g = func() - 得到生成器
生成器的用法和迭代器基本一致
__next__() 开始执行生成器 . 执行到yield. 直到没有yield. 抛出StopIteration
send() 可以给上一个yield传值,send()不可以在第一个位置和最后一个位置出现
特点:
1. 省内存
2. 惰性机制, 不访问__next__() 就没有值.
3. 只能向前. 不能反复.
3.各种推导式(简单)
列表推导式 [结果 for循环 if判断]
字典推导式 {key: value for循环 if判断}
集合推导式 {key for循环 if判断}
4.生成器表达式(最难)
(结果 for循环 if判断)
惰性机制, 不访问__next__() 就没有值.
只能向前. 不能反复.
没有进行取值的时候就不执行代码
#打印 """ * *** ***** ******* ********* """ #思路:行 1 2 3 4 5 n # * 1 3 5 7 9 2*n-1 # 空白 4 3 2 1 0 # n=int(input("请输入行数:")) # for i in range(1,n+1): # print((n-i)*" "+"*"*(2*i-1)) #方案二 n = int(input("请输入你要打印多少行")) for i in range(1, n+1): # 方案一 for k in range(n-i): print(" ", end="") for j in range(2 * i - 1): print("*", end="") print() # 换行 #求1-100内所有的质数的和 #思路:先判断某个数是否为质数,写成函数方便调用 def func(n): if n==1: return False elif n>=2: for i in range(2,n):#此处其实2的值没有取到,2直接走了else,返回是质数 if n % i==0: return False else: return True sum=0 for i in range(1,101): if func(i): sum+=i print(sum)
#yield from lst def func(): lst = ["⿇花藤", "胡辣汤", "微星牌饼铛", "Mac牌锅铲"] lst2 = ["饼铛还是微星的好", "联想不能煮鸡蛋", "微星就可以", "还可以烙饼"] yield from lst # yield lst[0] # yield lst[1] # yield lst[2] # yield lst[3] yield from lst2 g=func()#通过生成器函数获取生成器 for i in g: print(i) #用生成器 每次取50件衣服 def func(): lst=[] for i in range(1,1000): lst.append("衣服%s"%i) if i%50==0: #每次取50件衣服 yield lst lst=[] #取完衣服下次,取之前用新的空的lst装 g=func() print(g.__next__())#取第一批50件衣服 print(g.__next__())#取第2批50件衣服
有疑问可以加wx:18179641802,进行探讨