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回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...
随机推荐
- nyoj 44-子串和(子串和最大问题)
44-子串和 内存限制:64MB 时间限制:5000ms Special Judge: No accepted:12 submit:48 题目描述: 给定一整型数列{a1,a2...,an},找出连续 ...
- TCP/IP网络基础知识
TCP/IP是一组用于实现网络互联的通信协议,通常称为TCP/IP协议族.包括TCP.IP.UDP.ICMP.RIP.TELNETFTP.SMTP.ARP.TFTP等. 一.TCP/IP模型将协议分为 ...
- Java中的工具类究竟如何命名?
先来几个例子 JDK自带工具类 Arrays.asList(); Objects.equals(); Collections.sort(); Spring框架工具类 StringUtils.isEmp ...
- 使用MongoDB的Spring Boot和MongoTemplate教程
在本教程中,我们将构建一个Spring Boot应用程序,该应用程序演示如何使用MongoTemplate API访问MongoDB数据库中的数据. 对于MongoDB,我们将使用mLab,它提供了M ...
- Spring IOC 的简单使用
Spring IOC (Inversion Of Control反转控制容器 一.对于IOC容器的简单理解 在java开发中将程序中的对象交给容器管理,而不是在对象的内部管理. 那么两个简单的问题去分 ...
- 仿微信 即时聊天工具 - SignalR (一)
话不多说,先上图 背景: 微信聊天,经常会遇见视频发不了,嗯,还有聊天不方便的问题,于是我就自己买了服务器,部署了一套可以直接在微信打开的网页进行聊天,这样只需要发送个url给朋友,就能聊天了! 由于 ...
- 【设计模式大法】Iterator模式
Iterator模式 --一个一个遍历 在Java中的for语句中 i++的作用是让 i 的值在每次循环后自增1,这样就可以访问数组中的下一个元素.下下一个元素.再下下一个元素,也就实现了从头至尾逐一 ...
- PHP的常用字符串处理
一.拼接字符串 拼接字符串是最常用到的字符串操作之一,在PHP中支持三种方式对字符串进行拼接操作,分别是圆点.分隔符{}操作,还有圆点等号.=来进行操作,圆点等号可以把一个比较长的字符串分解为几行进行 ...
- Django ORM-objects-QuerySet
Django ORM ORM执行查看原生SQL的两种方法 1.在setting中配置 LOGGING = { 'version': 1, 'disable_existing_loggers': Fal ...
- CSS浮动和各种定位
CSS定位 css定位机制 文档流:元素按照在HTML中的位置决定排布的过程 块级元素是从上到下的,内联元素是从左到右的 浮动 position布局 position css position属性用于 ...