python生成器的使用方法
什么是生成器?
生成器是一个包含了特殊关键字yield的函数。当被调用的时候,生成器函数返回一个生成器。可以使用send,throw,close方法让生成器和外界交互。
生成器也是迭代器,但是它不仅仅是迭代器,拥有next方法并且行为和迭代器完全相同。所以生成器也可以用于python的循环中,
生成器如何使用?
首先看一个例子:
#!/usr/bin/python
# -*- coding: utf-8 -*-
def flatten(nested):
for sublist in nested:
for element in sublist:
yield element
nested = [[1,2],[3,4],[5,6]]
for num in flatten(nested):
print num,
结果为1,2,3,4,5,6
递归生成器:
#!/usr/bin/python
# -*- coding: utf-8 -*-
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
for num in flatten([[1,2,3],2,4,[5,[6],7]]):
print num
结果为:1 2 3 2 4 5 6 7
让我们一起来看看生成器的本质
首先看下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
def simple_generator():
yield 1
print simple_generator
def repeater(value):
while True:
new = (yield value)
if new is not None: value = new
r = repeater(42)
print r.next()
print r.send('hello,world!')
<function simple_generator at 0x10c76f6e0>
42
hello,world!
可以看出:
1)生成器就是一函数
2)生成器具有next方法
3)生成器可以使用send 方法和外界交互。
相关推荐
-
浅谈Python生成器generator之next和send的运行流程(详解)
对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数. 然后第二个next调用,进入生成器函数后,从yield语句的下一句语句(第5行)开始执行,然后重新运行到yield语句,执行后,跳出生成器函数,后面再次调用next,依次类推. 下面是一个列子: def consumer(): r = 'here' for i in xrange(3): yield r r = '200 OK'+ str(i)
-
Python生成器(Generator)详解
通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了. 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间.在Python中,这种一边循环一边计算的机制,称为生成器(Generator). 简单生成器 要创建一个generator,有很
-
python生成器generator用法实例分析
本文实例讲述了python生成器generator用法.分享给大家供大家参考.具体如下: 使用yield,可以让函数生成一个结果序列,而不仅仅是一个值 例如: def countdown(n): print "counting down" while n>0: yield n #生成一个n值 n -=1 >>> c = countdown(5) >>> c.next() counting down 5 >>> c.next()
-
python生成器的使用方法
什么是生成器?生成器是一个包含了特殊关键字yield的函数.当被调用的时候,生成器函数返回一个生成器.可以使用send,throw,close方法让生成器和外界交互. 生成器也是迭代器,但是它不仅仅是迭代器,拥有next方法并且行为和迭代器完全相同.所以生成器也可以用于python的循环中, 生成器如何使用? 首先看一个例子: 复制代码 代码如下: #!/usr/bin/python# -*- coding: utf-8 -*- def flatten(nested): for subli
-
Python生成器的使用方法和示例代码
本文是<Effect Python 编写高质量Python代码的59个有效方法>的学习笔记.主要记录生成器的使用方法和示例代码. 返回队列的函数 如果函数要产生一系列结果,那么最简单的做法就是把这些结构都放在一份列表里,然后将其返回给调用者. def index_words(text): """用append方法将这些此的首字母索引添加到result列表中,并在函数结束时将其返回给调用者.""" result = [] if text
-
python 生成器生成杨辉三角的方法(必看)
用Python写趣味程序感觉屌屌的,停不下来 #生成器生成展示杨辉三角 #原理是在一个2维数组里展示杨辉三角,空的地方用0,输出时,转化为' ' def yang(line): n,leng=0,2*line - 1 f_list = list(range(leng+2)) #预先分配,insert初始胡会拖慢速度,最底下一行,左右也有1个空格 #全部初始化为0 for i,v in enumerate(f_list): f_list[v] = 0 ZEROLIST = f_list[:] #预
-
python 生成器协程运算实例
一.yield运行方式 我们定义一个如下的生成器: def put_on(name): print("Hi {}, 货物来了,准备搬到仓库!".format(name)) while True: goods = yield print("货物[%s]已经被%s搬进仓库了."%(goods,name)) p = put_on("bigberg") #输出 G:\python\install\python.exe G:/python/untitled
-
Python yield与实现方法代码分析
yield的功能类似于return,但是不同之处在于它返回的是生成器. 生成器 生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器). 如果一个函数包含yield关键字,这个函数就会变为一个生成器. 生成器并不会一次返回所有结果,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用. 由于生成器也是一个迭代器,那么它就应该支持next方法来获取下一个值. 基本操作 # 通过`yield`来创建生成器 def f
-
Python生成器以及应用实例解析
本文研究的主要是Python生成器及其应用,具体如下. 一.定义 可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象 二.生成器的两种形式(Python有两种不同的方式提供生成器) 1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果.yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行 yield的功能: 把函数的结果做生迭代器(以一
-
python生成器推导式用法简单示例
本文实例讲述了python生成器推导式用法.分享给大家供大家参考,具体如下: 1.生成器推导式是继列表推导式后的有一中python推导式,他比列表推导式速度更快,占用的内存也更少. 2.使用生成器对象时,可以根据需要将他转化为列表或者元组,也可以是哟个生成器对像__next__()方法或内置函数next()进行遍历,其具有惰性求值的特点,进行一次遍历后便不能再次方位内部元素,即访问一次立马清空生成器对象 >>> g = ((i+2)**2 for i in range(10)) >
-
python 生成器和迭代器的原理解析
一.生成器简介 在python中,生成器是根据某种算法边循环边计算的一种机制.主要就是用于操作大量数据的时候,一般我们会将操作的数据读入内存中处理,可以计算机的内存是比较宝贵的资源,我认为的当要处理的数据超过内存四分之一的大小时就应该使用生成器. 二.生成器有什么特点? 1.和传统的容器相比,生成器更节省内存. 2.延迟计算,在我们需要结果时就调用一下生成器的next()方法即可. 3.可迭代,你可以像遍历list一样,遍历生成器 三.如何创建生成器? 在python中有两种方式创建生成器:生成
-
Python生成器定义与简单用法实例分析
本文实例讲述了Python生成器定义与简单用法.分享给大家供大家参考,具体如下: 一.什么是生成器 在Python中,由于受到内存的限制,列表容量肯定是有限的.例如我们创建一个包含一亿个元素的列表,Python首先会在内存中开辟足够的空间来存储这个包含一亿个元素的列表,然后才允许用户去使用这个列表,这就可能会导致以下问题: 1.内存中没有足够的内存空间开存储这个列表,从而导致列表无法创建 2.即使列表成功创建,然而仍会消耗很长的时间,导致程序效率低下 3.若用户只想访问列表前面的几个元素,则后面
-
Python生成器generator用法示例
本文实例分析了Python生成器generator用法.分享给大家供大家参考,具体如下: 生成器generator本质是一个函数,它记住上一次在函数体中的位置,在生成器函数下一次调用,会自动找到该位置,局部变量都保持不变 l = [x * 2 for x in range(10)] # 列表生成式 g = (x * 2 for x in range(10)) print(l,g) # l打印的是一个列表,g则是一个generator的内存地址 一次性打印获取generator的所有元素: for
随机推荐
- JavaScript的原型继承详解
- Tomcat报错: JDBC unregister 解决办法
- File的API和常用方法详解_动力节点Java学院整理
- WPF中不规则窗体与WindowsFormsHost控件兼容问题的解决方法
- PHP异步调用socket实现代码
- 获取3个数组不重复的值的具体实现
- 基于Android"今日事今日毕"的使用介绍
- 几种MySQL中的联接查询操作方法总结
- js调用浏览器打印模块实现点击按钮触发自定义函数
- 详解nginx如何配置HTTPS
- 注册表编辑器的注册表修改
- 详解Java使用sqlite 数据库如何生成db文件
- Eclipse创建java程序可执行jar包教程
- 原生JS实现 MUI导航栏透明渐变效果
- Visual Studio 2010配置OpenCV的方法
- Android EditText实现扁平化的登录界面
- javascript正则表达式学习之位置匹配
- Python实现的tcp端口检测操作示例
- windows10下mysql 8.0 下载与安装配置图文教程
- jQuery实现可编辑的表格