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)

以上是 Python“三大器”之生成器 的全部内容, 来源链接: utcz.com/z/530470.html

回到顶部