python中生成器
1.简介
通过列表生成式,我们可以直接创建一个列表,但是受到内存的限制,列表容量肯定是有限的。
如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?
在Python中,这种一边循环一边计算的机制,称为生成器:generator。
2.示例
2.1列表生成式的[]改成(),就创建了一个generator:
s = (x * x for x in range(5))
print(s) # <generator object <genexpr> at 0x02474A80>
# 可以通过next(s)不断获取返回值;或者使用for循环
for x in s:
print(x)
2.2yield关键字
# 非波拉契数列:
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print b
a, b = b, a + b
n = n + 1
使用yield 关键字:
# 把fib函数变成generator,只需要把print b改为yield b.
def fib1(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1 f = fib1(6)
print f # <generator object fib1 at 0x026E4B20>
for x in f:
print x
说明:
1.generator和函数的执行流程不一样。
2.函数是顺序执行,遇到return语句或者最后一行函数语句就返回。
3.generator的函数在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
例如该生成器:
第10行首次调用该生成器,运行到yield n停止(对应结果为16,17行);11行从yield n继续,由于是while循环体,在遇到yield n后再次停止(对应结果为18,19行);
12行与11行类似。
def create_counter(n):
print "create counter"
while True:
yield n
print 'increment n'
n += 1 cnt = create_counter(1)
print cnt
print next(cnt)
print next(cnt)
print next(cnt) # output
# <generator object create_counter at 0x0000000001D141B0>
16 # create counter
17 # 1
18 # increment n
19 # 2
20 # increment n
21 # 3
python中生成器的更多相关文章
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- python中生成器对象和return 还有循环的区别
python中生成器对象和return 还有循环的区别 在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因 ...
- python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解
python中"生成器"."迭代器"."闭包"."装饰器"的深入理解 一.生成器 1.生成器定义:在python中,一边 ...
- Python中生成器和yield语句的用法详解
Python中生成器和yield语句的用法详解 在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" ...
- Python 中生成器的原理
生成器的使用 在 Python 中,如果一个函数定义的内部使用了 yield 关键字,那么在执行函数的时候返回的是一个生成器,而不是常规函数的返回值. 我们先来看一个常规函数的定义,下面的函数 f() ...
- python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解
一.生成器 1.什么是生成器? 在python中,一边循环一边计算的机制,称为生成器:generator. 2.生成器有什么优点? 1.节约内存.python在使用生成器时对延迟操作提供了支持.所谓延 ...
- Python中生成器,迭代器,以及一些常用的内置函数.
知识点总结 生成器 生成器的本质就是迭代器. 迭代器:Python中提供的已经写好的工具或者通过数据转化得来的. 生成器:需要我们自己用Python代码构建的 创建生成器的三种方法: 通过生成器函数 ...
- 2018.8.13 python中生成器和生成器表达式
主要内容: 1.生成器和生成器函数 2.列表推导式 一.生成器 生成器是指就是迭代器,在python中有三种方式来获取生成器: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的转换也 ...
- python中生成器及迭代器
列表生成式 列表生成式是python内部用来创建list的一种方法,其格式形如: L = [x*8 for x in range(10)] print(L) 此时会得到结果:[0, 8, 16, 24 ...
随机推荐
- error: pcap library not found! 解决方法
参考: error: pcap library not found! error: pcap library not found! 解决方法 $ sudo apt-get install libsql ...
- JavaScript中 call和apply
call()方法和apply()方法的作用相同,他们的区别在于接收参数的方式不同. 对于call(),第一个参数是this值没有变化,变化的是其余参数都直接传递给函数.(在使用call()方法时,传递 ...
- JavaScript的sort方法
说明 array.sort()用于对数组进行排序,返回数组,方法默认是“升序”排序,原数组会发生改变 简单点:比较函数两个参数a和b,返回a-b升序,返回b-a升序 普通数组(降序) var arr ...
- Spring (一)
Spring是一个开源框架,是一个基于IOC和AOP来架构多层的JavaEE 架构 默认是单例模式 IOC就是 Inversion of Control public class Girl { pri ...
- eclipse maven maven-compiler-plugin 报错 完全解决
报错如下: Maven install失败 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:comp ...
- [原][粒子特效][spark]事件action
深入浅出spark粒子特效连接:https://www.cnblogs.com/lyggqm/p/9956344.html group调用action的地方: 可以看到使用action的可以是出生一次 ...
- [osg]osg绘制动态改变顶点的几何体
最简单的顶点数据更新方法是预先获取setVertexArray()所用的数组数据,并对其进行更新.但是对于开启显示列表支持的几何体(这是默认的情况)来说,有一个问题需要特别需要引起注意,即显示列表中的 ...
- 力扣(LeetCode)453. 最小移动次数使数组元素相等
给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数.每次移动可以使 n - 1 个元素增加 1. 示例: 输入: [1,2,3] 输出: 3 解释: 只需要3次移动(注意每次移动 ...
- echarts 拼图和折线图的封装 及常规处理
1.html <div id="wrap"></div> 2.js ; (function ($) { $.fn.extend({ echartsPie: ...
- js实现文件的上传和输出,拖拽上传图片
js文件上传 文件下载 以前的文件的下载都是在服务器,现在也是放在服务器比较好,有时候为了一些开发的方便,我们临时把处理的数据就放在了本地,然后自己访问.这个也是可以的. 1.利用html5的 Fil ...