在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']