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

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

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

创建列表

法一:
test = range(10)
print type(test)
# <type 'list'> 法二:
test = [item for item in range(10)]
print type(test)
# <type 'list'>

创建生成器

test = (item for item in range(10))
print type(test)
# <type 'generator'>

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

test = (item for item in range(10))
print type(test)
print test.next()
print test.next()
print test.next()
# <type 'generator'>
#
#
#

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

test = (item for item in range(10))
print type(test)
for item in test:
print item
# <type 'generator'>
#
#
#
#
#
#
#
#
#
#

注意,每一次调用 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
# <type 'generator'>
#
#
# 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 # <generator object func at 0x7f228e111730>
#
#
#
#
#
#

python 基础——generate生成器的更多相关文章

  1. 十三. Python基础(13)--生成器进阶

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

  2. 十二. Python基础(12)--生成器

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

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

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

  4. Python基础之生成器

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

  5. Python基础 (yield生成器)

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

  6. python基础(八)生成器,迭代器,装饰器,递归

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

  7. Python基础(生成器)

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

  8. Day12 Python基础之生成器、迭代器(高级函数)(十)

    https://www.cnblogs.com/yuanchenqi/articles/5769491.html 1. 列表生成式 我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7 ...

  9. python基础之生成器迭代器

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

随机推荐

  1. OC三种方法实现定时器

    在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 在iOS中有很多方法完成定时器的任务,例如 NSTimer.CADisp ...

  2. EasyMock问题总结

    1. java.lang.IllegalStateException: missing behavior definition for the preceding method call getBid ...

  3. java正则表达式语法详解及其使用代码实例

    原文地址 译者序(下载代码) 正则表达式善于处理文本,对匹配.搜索和替换等操作都有意想不到的作用.正因如此,正则表达式现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率. ...

  4. Linux(Centos)配置OpenSSH无密码登陆<转>

    最近在搭建Hadoop环境需要设置无密码登陆,所谓无密码登陆其实是指通过证书认证的方式登陆,使用一种被称为"公私钥"认证的方式来进行ssh登录.   " 公私钥" ...

  5. 使用 preferredStatusBarStyle 设置状态栏颜色

    iOS9之前,在plist文件中 插入一个新的key,名字为View controller-based status bar appearance,并将其值设置为NO. 然后敲入代码: [UIAppl ...

  6. tomcat如何简单调优

    我们在javaEE开发的过程中,经常会进行tomcat调优操作,下面我们来简单讲解一下tomcat调优. 1) 去掉web.xml的监视,提前将jsp编译成servlet. 2)在物理内存允许的范围内 ...

  7. div 中如何加各种边框(转)

    边框风格属性(border-style)  这个属性用来设定上下左右边框的风格,它的值如下: none (没有边框,无论边框宽度设为多大) dotted (点线式边框) dashed (破折线式边框) ...

  8. JQueryMobile页面跳转参数的传递解决方案

    在JQueryMobile开发手机端应用使用可能需要考虑相关的页面跳转带来的参数问题.因为JQueryMobile其实也是HTML5实践的结果.HTML5中有localStorage和sessionS ...

  9. Mysql权限控制 - 允许用户远程连接

    Mysql为了安全性,在默认情况下用户只允许在本地登录,可是在有此情况下,还是需要使用用户进行远程连接,因此为了使其可以远程需要进行如下操作: 一.允许root用户在任何地方进行远程登录,并具有所有库 ...

  10. cdoj 1150 排名表 拓扑排序

    排名表 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1150 Descrip ...