Python“三大器”之生成器

Python“三大器”之生成器[Python常见问题]

生成器

1、什么是生成器

  生成的工具

  生成器是一个"自定义"的迭代器,本质上就是一个迭代器

 

 

2、如何实现生成器

  yield:生成器

  每一次yield都会往生成器对象中添加一个值

    yield只能在函数内部定义

    yield可以保存函数的暂停状态

# python内置的迭代器
# 可迭代对象
list1 = [1, 2, 3]
# 迭代器对象:python内置的迭代器
list_iter = list1.__iter__()
# 自定义的迭代器
def func():
    print("from func")
    yield 1, "bear", "pig"
    # return 1, "bear", "pig"

res = func()
# 当通过__next__取值时,才会执行函数体代码
print(res.__next__())

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

 

  用公鸡下蛋例子来解释生成器生成过程:

def func():
    print("公鸡开始准备下蛋---")
    print("下蛋---1")
    yield "鸡蛋1"
    print("下蛋---2")
    yield "鸡蛋2"
    print("下蛋---3")
    yield "鸡蛋3"
    print("下蛋---4")
    yield "鸡蛋4"
    print("取最后一个蛋,查看是否下蛋成功")


res = func()
# 当通过__next__取值时,才会执行函数体代码
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())

# next(迭代器对象)  也可以取值
print(next(res))
print(next(res))
print(next(res))
print(next(res))

  上面例子中的next()作用等同于.__next__(),只不过使用方法不同

  【迭代器对象.__next__()   ==  next(迭代器对象)

 

 

3、yield和return的区别

  相同点:

    返回值的个数都是无限制的

  不同点:

    return只能返回一次值

    yield可以返回多个值

def func():
    print("from func")
    yield 1, "bear", "pig"
    yield 2, "apple", "orange"
    # return 1, "bear", "pig"

res = func()
print(res.__next__())
print(res.__next__())

 

 

4、自定义生成器

  在python2中,range(1, 5)生成一个列表[1, 2, 3, 4]

  在python3中,range(1, 5)生成range对象,这个对象又是一个生成器,而生成器的本质是一个迭代器,所以range(1, 5)是一个迭代器对象

# 自定义range功能,创建一个自定义的生成器
def my_range(start, end, move=1):
    while start < end:
        yield start
        start += move

range_iter = my_range(1, 5, 2)
print(range_iter)

for line in range_iter:
    print(line)