前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python学习笔记4.1-python高级之生成器

python学习笔记4.1-python高级之生成器

作者头像
锦小年
发布2018-01-02 14:10:55
5500
发布2018-01-02 14:10:55
举报
文章被收录于专栏:锦小年的博客

生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器)。 如果一个函数包含yield关键字,这个函数就会变为一个生成器。 生成器并不会一次返回所有结果,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用。 由于生成器也是一个迭代器,那么它就应该支持next方法来获取下一个值。

1 基本操作

代码语言:javascript
复制
# 通过`yield`来创建生成器
def func():
   for i in xrange(10);
        yield i

# 通过列表来创建生成器
[i for i in xrange(10)]
代码语言:javascript
复制
# 调用如下
>>> f = func()
>>> f # 此时生成器还没有运行
<generator object func at 0x7fe01a853820>
>>> f.next() # 当i=0时,遇到yield关键字,直接返回
0
>>> f.next() # 继续上一次执行的位置,进入下一层循环
1
...
>>> f.next()
9
>>> f.next() # 当执行完最后一次循环后,结束yield语句,生成StopIteration异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> 

除了next函数,生成器还支持send函数。该函数可以向生成器传递参数

代码语言:javascript
复制
>>> def func():
...     n = 0
...     while 1:
...         n = yield n #可以通过send函数向n赋值
... 
>>> f = func()
>>> f.next() # 默认情况下n为0
0
>>> f.send(1) #n赋值1
1
>>> f.send(2)
2
>>> 

2 应用

最经典的例子,生成无限序列。

常规的解决方法是,生成一个满足要求的很大的列表,这个列表需要保存在内存中,很明显内存限制了这个问题。

代码语言:javascript
复制
def get_primes(start):
    for element in magical_infinite_range(start):
        if is_prime(element):
            return element

如果使用生成器就不需要返回整个列表,每次都只是返回一个数据,避免了内存的限制问题。

代码语言:javascript
复制
def get_primes(number):
    while True:
        if is_prime(number):
            yield number
        number += 1

其实生成器很好理解,就是按照规定一次生成一个元素的机制,利用生成器 生成的对象一定就是一个可迭代对象,因为每一次只生成了一个元素。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 基本操作
  • 2 应用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档