python基础-生成器
生成器
-
概念:但凡在函数内部定义了一个yield,调用函数时,函数体代码不会执行,会返回一个结果,该结果就是生成器。本质上是迭代器,一个自定义的迭代器。
# python内获取迭代器的方式 def iter_func(): list1 = [1, 2, 3, 8, 4] # 获取一个迭代器 iter_list = list1.__iter__() while True: try: # 捕获异常 # 执行__next__取值 print(iter_list.__next__()) except StopIteration: break # 执行iter_func iter_func() # 自定义一个迭代器 def func(): print("hello world!") yield "dawn" res = func() # 直接调用,返回了一个生成器:<generator object func at 0x000002376172F1C8> print(res) # 如何获取生成器的内容呢? # 生成器的本质是迭代器,迭代器对象取值通过.__next__ # 通过__next__ 取值时,才会执行函数体代码。 print(res.__next__())
输出结果:
hello world! dawn
-
生成器如何实现:通过
yield
关键字实现。yield
只能在函数内部定义
-
每一次yield 都会往生成器传一个值。
-
可以保存函数的暂停状态
def yield_func(): print("自定义生成器开始……") print("第一个yield:") yield "yield--1" print("第二个yield:") yield "yield--2" print("第三个yield:") yield "yield--3" print("最后一个yield:") yield "yield--4" print("查看,是否还有yield") res = yield_func() print(res.__next__())
输出:
自定义生成器开始…… 第一个yield: yield--1
-
yield 和 return
- 相同点:返回值的个数无限制
- 不同点:return 有且只能返回一个值;yield 可返回多个值
# yield def yield_func(): list1 = [2, 3, 4, 1] dict1 = {"name": "dawn", "age": 18, "hobby": "read"} tuple1 = (1, 'a', 2, 'b') set1 = {23, 34, 'e'} yield list1 yield dict1 yield tuple1, set1 # return def return_func(): list1 = [2, 3, 4, 1] dict1 = {"name": "dawn", "age": 18, "hobby": "read"} tuple1 = (1, 'a', 2, 'b') set1 = {23, 34, 'e'} return list1,tuple1 #此处代码执行不到,函数代码题遇到return 以后就结束了 return dict1
-
使用yield 自定义一个range
""" python2:range(1,5) ---→ [1,2,3,4] python3:range(1,5) ---→ range对象 ---→ 生成器 ---→ 迭代器 range(start,stop,step) """ def my_range(start,end,step=1): while start < end: yield start start += move