第一种方法:
# 创建生成器,第一种方式 list1 = (x for x in range(10)) print(list1) # 输出结果:<generator object <genexpr> at 0x0000019B5954D6D0>
结论:生成器只会将你要生成数据的方式存储起来,等到需要用的时候才会执行,用一次,执行一次;
# 使用生成器 print(next(list1)) print(next(list1)) print(next(list1)) print(next(list1)) """ 输出结果: 0 1 2 3 """
第二种方式:
基础知识
# 如何交换两个变量的值? # 第一种方法: a,b = 10,20 a,b = b,a print(a) print(b) # 第二种方法: a = a + b # a=10+20=30 b = a - b # b=30-20=10 a = a - b # a=30-10=20
a,b = 10,20 # a=10 b=20 a,b = a+b,a # a=10+20=30 b=10
用函数写斐波那契数列(后面的数是前两个数之和)
def createNum(): a , b = 0,1 for i in range(5): print(b) a , b = b , a+b createNum() """ 输出结果: 1 1 2 3 5 """
程序执行逻辑:
第一轮: a=0 b=1 i=0 b=1 输出:1 a=1 b=0+1=1 第二轮: a=1 b=1 i=1 b=1 输出:1 a=1 b=1+1=2 第三轮: a=1 b=2 i=2 b=2 输出:2 a=2 b=1+2=3 第四轮: a=2 b=3 i=3 b=3 输出:3 a=3 b=2+3=5 第五轮: a=3 b=5 i=4 b=5 输出:5 a=5 b=3+5=8
用生成器写斐波那契数列(后面的数是前两个数之和)
只要函数中含有yield关键字,这个函数就变成了生成器
a,b = 10,20 # 用生成器写斐波那契数列(后面的数是前两个数之和) def createNum(): print("----1-----") a , b = 0,1 for i in range(100): print("----2-----") yield b print("-----3----") a , b = b , a+b print("-----4----") num = createNum() print(num) print(next(num)) print(next(num)) print(num.__next__()) """ 输出结果: ----1----- ----2----- 1 -----3---- -----4---- ----2----- 1 -----3---- -----4---- ----2----- 2 """
send方法
def createNum(): a,b = 0,1 for i in range(5): tempfile = yield b print(tempfile) a,b = b,a+b c = createNum() # next(c) c.__next__() # send给 yield b 传递值 c.send("lili") # 输出结果:lili
总结:send(),next(),_ _ next_ _ 都能让生成器往下执行一次
send()给 yield b 整体传递值
""" 生成器的运用 """ # 创建生成器 def test1(): while True: print("---1---") yield None def test2(): while True: print("---2---") yield None # 只是定义了生成器(存储了数据生成的方式,等待调用) 协程处理\协处理器 t1 = test1() t2 = test2() while True: t1.__next__() t2.__next__()