📜  Python | 生成器表达式

📅  最后修改于: 2020-01-18 14:50:44             🧑  作者: Mango

Python中,要创建迭代器,我们可以同时使用常规函数和生成器。生成器的编写就像普通函数一样,但是我们使用yield()而不是return()返回结果,作为实现迭代器的工具,它更强大。由于它可以按需评估元素,因此实施起来更容易,更方便。与遇到返回语句时会完全终止的常规函数​​不同,生成器使用yield语句,该函数的状态从上一次调用中保存,并且在下次调用生成器函数时可以拾取或恢复该状态。与列表相比,生成器的另一个巨大优势是它占用更少的内存。
除此之外,还有两个功能_next_()_iter_()使生成器功能更紧凑,更可靠。
范例:

# Python代码,展示生成器的yield()和next().
def generator():
    t = 1
    print '第一个结果 ',t
    yield t
    t += 1
    print '第二个结果 ',t
    yield t
    t += 1
    print '第三个结果 ',t
    yield t
call = generator()
next(call)
next(call)
next(call)

输出:

第一个结果  1
第二个结果  2
第三个结果  3

发生成器函数和正常函数之间的区别

  • 一旦函数暂停,将控件转移到调用方。
  • 当函数终止时,StopIteration在其他调用时自动引发。
  • 连续调用之间会记住局部变量及其状态。
  • 生成器函数包含一个或多个yield语句而不是return语句。
  • 由于方法_next_()_iter_()都是自动实现的,因此我们可以使用next()来遍历项目

还有许多其他表达式可以简单地编码,类似于列表推导,但我们使用括号代替括。这些表达式设计用于封闭函数立即使用生成器的情况。生成器表达式允许创建没有yield关键字的生成器。但是,它不共享使用yield函数创建的生成器。范例:

# Python代码,展示生成器
generator = (num ** 2 for num in range(10))
for num in generator:
    print(num)

输出:

0
1
4
9
16
25
36
49
64
81

我们还可以使用生成器表达式生成列表:

string = '芒果'
li = list(string[i] for i in range(len(string)-1, -1, -1))
print(li)

输出:

[果','芒']