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回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...
随机推荐
- workspaces only allow trusted client with self-signed cert
1. 生成ca. openssl genrsa -out CA_neonone.workspace.key 2048 openssl req -x509 -new -nodes -key CA_neo ...
- 详解在Linux系统中安装JDK
本文以在CentOS 7.6中安装JDK8为例进行安装,其他系统和版本都是大同小异的. 下载 进入Oracle官方网站的下载页面. 首先,接受许可协议,如下图: 然后,根据Linux系统的位数选择要下 ...
- C++学习第一天(打卡)
C++和C最大的区别可能就是添加了面向对象的编程. using namespace std 是其中oop的一个特性. using namespace std 可以使程序使用std名称空间里面的定义. ...
- 【2018寒假集训 Day1】【位运算】桐桐的运输方案
桐桐的运输方案(transp) [问题描述] 桐桐有 N 件货物需要运送到目的地,它们的重量和价值分别记为: 重量:W1,W2,…,Wn: 价值:V1,V2,…,Vn: 已知某辆货车的最大载货量为 X ...
- php+redis实现注册、删除、编辑、分页、登录、关注等功能
本文实例讲述了php+redis实现注册.删除.编辑.分页.登录.关注等功能.分享给大家供大家参考,具体如下: 主要界面 连接redis redis.php <?php //实例化 $red ...
- Xftp工具连接 报错: 无法与 “ 目标IP ” 连接
这里是OpenSSH升级导致 查看sshd_config [root@sdw1 glibc]# vim /etc/ssh/sshd_config 查找后进行修改 [root@sdw1 glibc]# ...
- UVA439 骑士的移动 Knight Moves
#include<bits/stdc++.h> using namespace std; char a,c; int b,d; ][]; ]={,,,-,,-,-,-}; ]={,-,,, ...
- myql数据库,sql横排转竖排以及竖排转横排,oracle的over函数的使用
一.引言 前些日子遇到了一个sql语句的横排转竖排以及竖排转横排的问题,现在该总结一下,具体问题如下: 这里的第二题和第三题和下面所讲述的学生的成绩表是相同的,这里给大家留一下一个念想,大家可以自己做 ...
- 升级Xcode7&iOS9后,出现NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -980X)
在info.plist里面添加如下内容即可: <key>NSAppTransportSecurity</key> <dict> <key>NSAllow ...
- Android DataBinding不能自动生成ViewDataBinding类的解决方法
如果Build.gradle和Layout文件配置正确,仍无法生成ViewDataBinding类. 经测试,Gradle的sync无效,clean project无效,invalidate and ...