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

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

1 基本操作

# 通过`yield`来创建生成器
def func():
   for i in xrange(10);
        yield i

# 通过列表来创建生成器
[i for i in xrange(10)]
# 调用如下
>>> 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函数。该函数可以向生成器传递参数

>>> 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 应用

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

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

def get_primes(start):
    for element in magical_infinite_range(start):
        if is_prime(element):
            return element

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

def get_primes(number):
    while True:
        if is_prime(number):
            yield number
        number += 1

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Petrichor的专栏

python: isinstance函数

isinstance() 与 type() 区别: type() 不会认为子类是一种父类类型,不考虑继承关系。而isinstance() 会认为子类是一种父...

1195
来自专栏calmound

Xtu 1150 Assembly Line

http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1150 题意:任意多个ABC三个数,...

2737
来自专栏十月梦想

each()list()while遍历数组

each()函数:需要一个数组作为参考,each函数返回1,0,key,value键值,0,key返回键,1,value对应的值,

851
来自专栏靠谱PM

JavaScript基本语法(三)

一、数组的概念: 所谓数组,就是将多个元素(通常是同一类型)按一定顺序排列放到一个集合中,那么这个集合我们就称之为数组。

502
来自专栏武军超python专栏

2018年9月9日正则表达式随堂记

*********************** 今天遇到的新单词: element n元素,要素 multibyte n多字节 sequence n数列...

1004
来自专栏程序员互动联盟

【java基础】Java中instanceof关键字的理解

java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或...

3349
来自专栏互联网杂技

安静100分钟理解js面向对象

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head>...

3388
来自专栏程序员互动联盟

【编程基础】C语言逻辑运算符

C语言关系运算符和逻辑运算符几乎无所不在,比如在循环语句、分支语句、逻辑判断等语句块中都会出现。学好这部分对学好C语言具有重要作用。 C语言中有一共有如下6中...

3486
来自专栏10km的专栏

javabean:boolean和Boolean类型的getter方法名是有区别的

javaBean中,要设置或获取某个property的值,就需要相应的get和set方法,对于primitive和自定义类类型的属性(如:property),g...

1769
来自专栏java初学

static关键字

28610

扫码关注云+社区