Python生成器的用法
生成器,一定情况下可以节省很多空间
比如:
>>> b = (x for x in range(10))
>>> b
<generator object <genexpr> at 0x02A17120> 这就是一个生成器,
占的内存空间要比列表小得多
需要取值的话,可以用next()函数,或者__next__()方法,比如取上面的b的值:
>>> next(b)
0
>>> b.__next__()
1
>>> next(b)
2
>>> b.__next__()
3
>>>……
Ps:当然也可以使用for遍历b的值
生成器的另外一种写法和应用:
斐波那契数列是说后面一个数始终是前面两个数的和,比如:1,1,2,3,5,8,13,21……,可以使用下面的方式来创建这样的一组数:
def createNum():
print("start----------------")
a,b = 0,1
for i in range(5):
#只要函数里面有yield这个关键字,就表示这个函数是一个生成器
yield b
a,b = b,a+b
print("stop--------")
a = createNum()
走第一次next(a),上面这个函数的执行步骤:
1、 执行print("start----------------")
2、 a = 0, b = 1
3、 第一次循环,走到yield b,打印一个b出来,当前是1,遇到yield,程序会停止往下运行
4、 走第二次next(a),程序继续执行,从刚才停止的位置yield b的下面开始,也就是执行:a,b = b,a+b,此时b=0+1=1,然后进行第二次for循环,又一次执行到yield b,打印b的值为1,又一次停止运行。
5、 再次走next(a),重复上面的步骤,打印2出来
6、 直到for循环完毕,再次走next(a),抛出异常:StopIteration
这个生成器的作用就是说你可以事先定义一个可以生成很多斐波那契数列的数值的一个函数,这个函数占用空间很小,到需要用的时候,再用next函数去生成,需要多少个就next多少次
另外,还有一种情况,可以完成两个函数交叉调用:
def test1(): #定义一个带有yield None的生成器
while True:
print(“----111------”)
yield None
def test2(): #定义另外一个带有yield None的生成器
while True:
print(“----222------”)
yield None
a = test1() #创建两个生成器对象
b = test2()
def test(): #定义一个函数,调用生成器对象
while True:
a.__next__()
b.__next__()
test()
结果:
----111------
----222------
----111------
----222------
----111------
----222------
----111------
----222------
……
Python生成器的用法的更多相关文章
- Python生成器主要用法
代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = '人生入戏' def use(name): print(" ...
- 浅谈Python在信息学竞赛中的运用及Python的基本用法
浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...
- python之函数用法xrange()
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法xrange() #xrange() #说明:返回一个生成器 #xrange做循环的性 ...
- 用Python 的一些用法与 JS 进行类比,看有什么相似?
Python 是一门运用很广泛的语言,自动化脚本.爬虫,甚至在深度学习领域也都有 Python 的身影.作为一名前端开发者,也了解 ES6 中的很多特性借鉴自 Python (比如默认参数.解构赋值. ...
- Python高阶用法总结
目录 1. lambda匿名函数 1.1 函数式编程 1.2 应用在闭包 2. 列表解析式 3. enumerate内建函数 4. 迭代器与生成器 4.1 迭代器 4.3 生成器 5. 装饰器 前言: ...
- python操作redis用法详解
python操作redis用法详解 转载地址 1.redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用 ...
- 【python之路29】python生成器generator与迭代器
一.python生成器 python生成器原理: 只要函数中存在yield,则函数就变为生成器函数 #!usr/bin/env python # -*- coding:utf-8 -*- def xr ...
- Generator - Python 生成器
Generator, python 生成器, 先熟悉一下儿相关定义, generator function 生成器函数, 生成器函数是一个在定义体中存有 'yield' 关键字的函数. 当生成器函数被 ...
- Python回调函数用法实例详解
本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...
随机推荐
- 详解JavaScript错误捕获和上报流程
怎么捕获错误并且处理,是一门语言必备的知识.在JavaScript中也是如此. 那怎么捕获错误呢?初看好像很简单,try-catch就可以了嘛!但是有的时候我们发现情况却繁多复杂. Q1: 同步可以t ...
- 使用Jquery获取指定属性的值
使用Jquery获取指定属性的值 <input type="hidden" value="{$time}" name="time" i ...
- nyoj 206-矩形的个数 (a*b*(a+1)*(b+1)/4)
206-矩形的个数 内存限制:64MB 时间限制:1000ms 特判: No 通过数:16 提交数:37 难度:1 题目描述: 在一个3*2的矩形中,可以找到6个1*1的矩形,4个2*1的矩形3个1* ...
- 看源码学编程系列之kafka(一)
kafka 由于它自身的高性能发送与消费能力,而受到广大企业的喜欢,所以我们就先看看kafka 一些源码实现如下: public void run() { int messageNo = 1; whi ...
- objc里的伪指针TaggedPointer
如果你看过我前面两篇objc函数枢纽msgSend和你印象中的NSString是这样吗,相信已经多次看过它的身影了,到底它是何物何作用,我今日就来揭开谜团.我之所为称呼它为伪指针,是因为它像幽灵一样, ...
- 2019-9-9:渗透测试,docker下载dvwa,使用报错型sql注入dvwa
docker下载dvwa镜像,报错型注入dvwa,low级 一,安装并配置docker 1,更新源,apt-get update && apt-get upgrade &&am ...
- 新闻实时分析系统-Kafka分布式集群部署
Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cloudera.Apache Storm.Spa ...
- 【RocketMQ源码学习】- 5. 消息存储机制
前言 面试官:你了解RocketMQ是如何存储消息的吗?我:额,,,你等下,我看下这篇文字, (逃 由于这部分内容优点多,所以请哥哥姐姐们自备茶水,欢迎留言! RocketMQ存储设计是高可用和高性能 ...
- leetcode 114二叉树转换成链表
解法一 可以发现展开的顺序其实就是二叉树的先序遍历.算法和 94 题中序遍历的 Morris 算法有些神似,我们需要两步完成这道题. 将左子树插入到右子树的地方 将原来的右子树接到左子树的最右边节点 ...
- 记一次uboot中gunzip解压速度慢的问题排查
背景 在项目中需要用到解压功能,之前还记录了下,将uboot解压代码移植到另外的bootloader中时,碰到的效率问题.最终查明是cache的配置导致的. https://www.cnblogs.c ...