生成器

生成器

一、什么是生成器

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

二、如何实现生成器

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

三、yield

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

四、yield与return的区别

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

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

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
相关文章
相关标签/搜索