通过列表表达式可以直接生成列表,不过列表一旦生成就需要为所有元素分配内存,有时候会很消耗资源。

所以,如果列表元素可以按照某种算法推算出来,这样就不必创建完整的list,从而节省大量的内存空间。

在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。

创建列表

法一:

test = range(10)

print type(test)

#

法二:

test = [item for item in range(10)]

print type(test)

#

创建生成器

test = (item for item in range(10))

print type(test)

#

生成器是一个可以自动推导后续元素的对象,为了得到其元素,我们可以直接通过 next() 方法:

test = (item for item in range(10))

print type(test)

print test.next()

print test.next()

print test.next()

#

#

#

#

另外一种方式是用 for 可以直接迭代生成器的所有元素:

test = (item for item in range(10))

print type(test)

for item in test:

print item

#

#

#

#

#

#

#

#

#

#

#

注意,每一次调用 next() 都使得生成器推导出下一个元素,使得生成器的元素减少:

test = (item for item in range(10))

print type(test)

print test.next()

print test.next()

#至此,生成器中只还有8个元素

for index, item in enumerate(test):

print index, '=', item

#

#

#

# 0 = 2

# 1 = 3

# 2 = 4

# 3 = 5

# 4 = 6

# 5 = 7

# 6 = 8

# 7 = 9

用函数创建生成器

如果函数中包含 yield ,那么该函数就变成了一个生成器。

函数类型的生成器的特点是:在每次调用 next() 的时候执行,遇到 yield 语句就完成一个元素的推导并返回,再次执行 next() 时从上次返回的 yield 语句处继续向后执行:

def func(): def func():

print 'one' print 'one'

yield 1 yield 1

print 'two' print 'two'

yield 2 yield 2

print 'three' print 'three'

yield 3 yield 3

test = func() test = func()

test.next() test.next()

test.next() test.next()

for item in test: for item in test:

print item item

# one # one

# two # two

# three # three

# 3 # 此时并没有打印生成器的最后一个元素值

生成器函数应用示例

用生成器产生斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:

直接打印元素:

def func(max):

before = 0

after = 1

while after < max:

print before

before, after = after, before + after

func(10)

#

#

#

#

#

#

使用列表保存结果:

def func(max):

list = []

before = 0

after = 1

while after < max:

list.append(before)

before, after = after, before + after

return list

my_list = func(10)

print my_list

# [0, 1, 1, 2, 3, 5]

使用生成器:

def func(max):

before = 0

after = 1

while after < max:

yield before

before, after = after, before + after

test = func(10)

print test

for item in test:

print item

#

#

#

#

#

#

#

十三&period; Python基础&lpar;13&rpar;--生成器进阶

十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...

十二&period; Python基础&lpar;12&rpar;--生成器

十二. Python基础(12)--生成器 1 ● 可迭代对象(iterable) An object capable of returning its members one at a time. ...

(转)python基础学习-----生成器和迭代器

在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了 ...

Python基础之生成器

1.生成器简介 首先请确信,生成器就是一种迭代器.生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中.另外,对于生成器的特殊语法支持使得编写一个生成器比 ...

Python基础 &lpar;yield生成器&rpar;

如果在一个函数中使用了yield,那么这个函数实际上生成的是一个生成器函数 ,返回的是一个generator object.生成器是实现迭代的一种方式 特点: 其实返回的就是可以的迭代对象 和迭代的方 ...

python基础&lpar;八&rpar;生成器&comma;迭代器&comma;装饰器&comma;递归

生成器 在函数中使用yield关键字就会将一个普通的函数变成一个生成器(generator),普通的函数只能使用return来退出函数,而不执行return之后的代码.而生成器可以使用调用一个next ...

Python基础(生成器)

二.生成器(可以看做是一种数据类型) 描述: 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我 ...

Day12 Python基础之生成器、迭代器&lpar;高级函数&rpar;(十)

1. 列表生成式 我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7 ...

python基础之生成器迭代器

1 生成器: 为什么要有生成器? 就拿列表来说吧,假如我们要创建一个list,这个list要求格式为:[1,4,9,16,25,36……]这么一直持续下去,直到有了一万个元素的时候为止.如果我们要创建 ...

随机推荐

C&plus;&plus;代码重构——从C global到C&plus;&plus; template

在学数据结构的时候,我常有这样目标--写出能够最大程度复用的代码(算法正确,封装优秀).我常想--如何能在短时间内达成"算法正确,封装优秀"这样的目标.经过一段时间的摸索,我的结论 ...

1029-对c语言文法的理解

→| →| →&lt ...

2013 Multi-University Training Contest 2

HDU-4611 Balls Rearrangement 题意:具体题意不大清楚,最后要处理一个这样的表达式:sum{ |i % a - i % b| },0 <= i < N 的取值很大 ...

【宽搜】BAPC2014 J Jury Jeopardy &lpar;Codeforces GYM 100526&rpar;

题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...

ubuntu安装XHProf

1. 安装XHProf wget http://pecl.php.net/get/xhprof-0.9.2.tgz tar zxf xhprof-0.9.2.tgz cd xhprof-0.9.2 s ...

利用poi向excle写入数据

import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import org ...

学习在&period;NET Core中使用RabbitMQ进行消息传递之持久化(二)

前言 上一节我们简单介绍了RabbitMQ和在安装后启动所出现的问题,本节我们开始正式进入RabbitMQ的学习,对于基本概念请从官网或者其他前辈博客上查阅,我这里不介绍基础性东西,只会简单提一下,请 ...

Spring NoSuchBeanDefinitionException

转http://www.baeldung.com/spring-nosuchbeandefinitionexception 1. Overview In this article, we are di ...

Linux学习(2)- 正则表达式基础

Linux学习(2)- 正则表达式基础 一.基础正则表达式介绍与练习 学习内容 正则表达式特殊符号 [:alnum:]代表英文大小写字母及数字 [:alpha:]代表英文大小写字母 [:blank:] ...

H5——video百花齐放(浏览器自带的播放器)

前言 手机自带浏览器的H5播放器 真是百花齐放啊(各个手机厂家有各个厂家的控件UI) 需求 手机浏览器木有控件条 自动播放 全屏处理 监控进度条 快进后退 自动播放 自动播放就给跪了 ios 安卓 为 ...