生成器

生成器

1、什么是生成器

生成器是一个自定义的迭代器,本质上是一个迭代器,内置有.__ iter__ () 和. __ next__()

2、如何实现生成器

  • 在函数内部定义yield
  • 调用函数时,函数体代码不会执行
  • 会返回一个值,这个返回值就是生成器

3、yield

  • 每次yield都会往生成器对象中添加一个值
  • yield只能在函数内部定义
  • yield让函数执行暂停,下次调用从上次暂停位置继续执行,直到重新遇到yield再次被暂停

4、yield与return的区别

相同点:返回值的个数都是无限制的

不同点:return只能返回一次,函数便终止执行后续代码,yield可以多次使用,让函数执行暂停,下次调用从上次暂停位置继续执行,直到重新遇到yield再次被暂停

def func():
    print("函数体代码")
    yield
    yield 2
    yield 3, 4, '5', '6'  # yield返回多个值也是默认返回成元组,可修改成其他的类型返回出去
    yield ['7', 8, 9]

# 正常执行不会执行函数体代码
# res是一个迭代器,如果不赋值给res会重复执行第一个yield
res = func()
# 当我们通过__next__取值时,才会执行函数体代码。
# res.__next__()  # 执行函数体代码,得到返回值none但没打印返回值,所以没有
print(res.__next__())
# yield可以保存函数的暂停状态,下次在上次基础上执行直到遇到下次yield
print(res.__next__())
print(res.__next__())
# print(res.__next__())  # StopIteration报错
>>>
函数体代码
None
2
(3, 4, '5', '6')

# next(迭代器对象)相当于迭代器对象.__next__()
next(res)  # 执行函数体代码,得到返回值none但没打印返回值,所以没有
print(next(res))
print(next(res))
print(next(res))
>>>
函数体代码
2
(3, 4, '5', '6')
['7', 8, 9]

# 如果不报错想自动执行
while True:
    try:
        print(next(res))
    except StopIteration:
        break

自定义range,实现range功能

def my_range(start,end,move=1):
    while start < end:
        yield start
        start += move
        
for i in my_range(1,5):
    print(i)
>>>
1
2
3
4

for i in my_range(1,6,2):
    print(i)
>>>
1
3
5
posted @ 2019-11-14 20:59  Mr沈  阅读(244)  评论(0编辑  收藏  举报