Python 教程之控制流(17)生成器表达式

85 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

Python中,要创建迭代器,我们可以同时使用常规函数和生成器。生成器的编写方式与普通函数类似,但我们使用 yield() 而不是 return() 来返回结果。它作为实现迭代器的工具更强大。它易于实现且更方便,因为它提供了按需元素的评估。与常规函数不同,常规函数在遇到返回语句时完全终止,生成器使用 yield 语句,其中函数的状态从上次调用中保存,并且可以在下次调用生成器函数时拾取或恢复。与列表相比,生成器的另一个巨大优势是它需要更少的内存。

除此之外,另外两个函数 next() 和 iter() 使生成器函数更加紧凑可靠。例:

# 用于说明 generator, yield() and next()的Python 程序
def generator():
	t = 1
	print ('First result is ',t)
	yield t

	t += 1
	print ('Second result is ',t)
	yield t

	t += 1
	print('Third result is ',t)
	yield t

call = generator()
next(call)
next(call)
next(call)

输出:

First result is  1
Second result is  2
Third result is  3

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

  • 函数生成后,该函数将暂停,控制权将转移给调用方。
  • 当函数终止时,将在进一步的调用中自动引发停止站点。
  • 局部变量及其状态在连续调用之间被记住。
  • 生成器函数包含一个或多个 yield 语句,而不是返回语句。
  • 由于像 next() 和 iter() 这样的方法是自动实现的,我们可以使用 next() 循环访问这些项。

还有各种其他表达式可以简单地编码,类似于列表理解,但我们使用括号而不是括号。这些表达式设计用于封闭函数立即使用生成器的情况。生成器表达式允许创建没有 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 = 'geek'
li = list(string[i] for i in range(len(string)-1, -1, -1))
print(li)

输出:

['k', 'e', 'e', 'g']