day13-01 生成器

TOC

一、什么是生成器

1 生成器的定义

生成的工具
生成器是一个‘自定义’的迭代器,本质上是一个迭代器。

# python内置的迭代器:
list1 = [1, 2, 3]
iter_list = list1._iter_()  # 迭代器对象,python内置生成的迭代器


# 自定义的迭代器
def func(start, end, move=1):
    while start < end:
        yield start
        start += move


iter_func = func(1, 4)
print(iter_func.__next__())
#可以像使用迭代器那样调用._next_()
print(iter_func.__next__())

1
2

Process finished with exit code 0

1.2 如何实现生成器

但凡在函数内部定义了yield,调用函数时,函数体代码不会执行,会返回函数的结果,该结果就是一个生成器。

yield:

  • 每一次yield都会往生成器对象中添加一个值
  • yield只能在函数内部定义
  • yield可以保存函数的暂停状态

1.2.1 yield与return的区别

相同点:

  • 都可以返回无限制的值

不同点:

  • yield可以返回多次值,return只能返回一次
def func():
    print('开始准备下蛋')
    print('1---火鸡蛋1')
    yield '火鸡蛋1'
    print('2---火鸡蛋2')
    yield '火鸡蛋2'
    print('3---火鸡蛋3')
    yield '火鸡蛋3'
    print('取最后一个蛋,查看是否有')


res = func()  # func将值给了res,那res现在就是迭代器对象
# 注意: 当我们通过._next_()取值的时候,才会执行函数体代码
# 迭代器对象._next_()可以写成next(),例如:
```python
print(next(res))
print(next(res))
print(res.__next__())
print(res.__next__())  # StopIteration报错

1.3 生成器的应用

1.3.1 利用生成器自定义range

利用for+range循环取值

# python内置的for循环方法
for i in range(1, 11):
    print(i)
# python2中:range(1, 5)返回的是一个列表[1, 2, 3, 4]
# python3中:range(1, 5)返回的是一个range对象--->生成器--->迭代器
res = range(1, 5)
print(res)

>>> range(1, 5)

自定义range功能,创建一个自定义的生成器

def my_range(start, end, move=1):
    while start < end:
        yield start
        start += move


for i in my_range(1, 4):
    print(i)


>>> 1
>>> 2
>>> 3

Process finished with exit code 0

猜你喜欢

转载自www.cnblogs.com/cnhyk/p/11890774.html