1、简单生成器:将列表推导式的[ ]改为()
- # 列表生成式
- _list = [i for i in range(10)]
- print(type(_list)) #
- print(_list) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- # 生成器
- _generator = (i for i in range(10))
- print(type(_generator)) #
- print(_generator) #
at 0x7fbcd92c9ba0> - # 生成器对象取值
- print(f"第一次迭代数据是:{_generator.__next__()}") # 第一次迭代数据是:0
- print(f"第二次迭代数据是:{next(_generator)}") # 第二次迭代数据是:1
- # 注意从第三个元素开始了!
- for x in _generator: # for循环只能隐式的触发了StopIteration异常,就终止迭代了,但是在程序中不会显示出来
- print(x) # 2,3,4,5,6,7,8,9
2、函数对象生成器:使用yield关键字,函数就变成了一个generator
- def gen_generator():
- yield "start"
- for i in range(2):
- yield i
- yield "end"
-
-
- gen = gen_generator()
- print(f"从gen对象取到的第一个值为:{next(gen)}") # 从gen对象取到的第一个值为:start
- print(f"从gen对象取到的第二个值为:{next(gen)}") # 从gen对象取到的第二个值为:0
- print(f"从gen对象取到的第三个值为:{next(gen)}") # 从gen对象取到的第三个值为:1
- print(f"从gen对象取到的第四个值为:{next(gen)}") # 从gen对象取到的第四个值为:end
- # print(f"从gen对象取到的第五个值为:{next(gen)}") # 抛出StopIteration异常
-
-
- # 等同于
- gen2 = (i for i in ["start", 0, 1, "end"])
- for v in gen2:
- print(v)
send()概念:暂时保留先不进行,等待需要时再进行。作用与next()作用相似。
send()使用:传递值给yield返回(可以指定yield想返回啥就返回啥),如果传None,则等同于next(generator)。
- def genterator_test():
- while True:
- print("--1-")
- num = yield 100 # 需要send传递值才能有num
- print("--2--", "num=", num)
-
-
- g = genterator_test()
-
- # 等同于next(generator)
- print(g.send(None)) # --1-
- # 100
-
- # 给上一次挂起的yield设置返回值
- print(g.send(11)) # --2-- num= 11
- # --1-
- # 100
-
- # 给上一次挂起的yield设置返回值
- print(g.send(22)) # --2-- num= 22
- # --1-
- # 100
can't send non-None value to a just-started generator因为生成器just-started generator,是没有Python yield语句来接收这个值的。 - def genterator_test():
- while True:
- print("--1-")
- num = yield 100 # 需要send传递值才能有num
- print("--2--", "num=", num)
-
-
- g = genterator_test()
-
-
- print(next(g)) # 第一次调用next,跑到 yield 100,遇到yield,执行结束。结果是:--1- 100
-
- print(next(g))
- """
- 第二次调用next,继续从上一次状态继续执行,此时,需要注意,
- 我们执行的起点是:num = yield 100,并且这个num值并不是100,而是通过send()传递过来的值,
- 即:n = send(),但是我们没有调用send()方法,所以,num自然而然为None,
- 所以,此时是执行print(next(g)),结果是:--2-- num= None --1- 100
- """
- # yield
- def gen_generator2():
- yield [1, 2, 3]
-
- s = gen_generator2()
- print(next(s)) # [1, 2, 3]
- # print(next(s)) # StopIteration
-
-
- # yield from
- def gen_generator3():
- yield from [1, 2, 3]
-
- s1 = gen_generator3()
- print(next(s1)) # 1
- print(next(s1)) # 2
- print(next(s1)) # 3