什么是生成器
在Python中,一边循环一边计算的机制,称为生成器:generator。
python学习网,大量的免费
,欢迎在线学习!
普通函数用 return 返回一个值,和 Java 等其他语言是一样的,然而在 Python 中还有一种函数,用关键字 yield 来返回值,这种函数叫生成器函数,函数被调用时会返回一个生成器对象,生成器本质上还是一个迭代器,也是用在迭代操作中,因此它有和迭代器一样的特性,唯一的区别在于实现方式上不一样,后者更加简洁
最简单的生成器函数:
>>> def func(n):
... yield n*2
...
>>> func
<function func at 0x00000000029F6EB8>
>>> g = func(5)
>>> g
<generator object func at 0x0000000002908630>
>>>
func 是一个生成器函数,调用该函数时返回的对象是生成器 g 。该生成器对象的行为与迭代器的行为非常相似,可用于 for 循环等场景。注意yield对应的值不会在函数调用时立即返回,而是只有在调用next方法时才会返回(本质上for循环也调用了next方法)
>>> g = func(5)
>>> next(g)
10
>>> g = func(5)
>>> for i in g:
... print(i)
...
10
那么为什么要使用生成器呢?显然,使用生成器在力方面比迭代器高几个级别,它的代码更少冗长,并且在性能上同样高效,为什么不使用它呢?让我们看看使用生成器实现斐波那契数列是多么容易。
def fib(n):
prev, curr = 0, 1
while n > 0:
n -= 1
yield curr
prev, curr = curr, curr + prev
print([i for i in fib(10)])
#[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
生成器表达式
列表推导在上一篇文章《这样写代码更优雅》中有介绍。生成器表达式与列表推导非常相似,但两者返回的对象不同。前者返回生成的Handler对象,后者返回列表对象。
>>> g = (x*2 for x in range(10))
>>> type(g)
<type 'generator'>
>>> l = [x*2 for x in range(10)]
>>> type(l)
<type 'list'>
生成器的优点前面已经介绍过了,就是在对海量数据进行迭代时,生成器显然更适合。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何理解 python Tanh 函数10/04
- ♥ 如何使用列表理解11/12
- ♥ python内置函数是什么意思09/07
- ♥ python中更新更新字典的方法09/10
- ♥ 什么是python语言08/20
- ♥ 如何使用 Python Flashtext 模块?12/17
内容反馈