生成器
有时候,序列或集合内的元素的个数非常巨大,如果全制造出来并放入内存,对计算机的压力是非常大的。比如,假设需要获取一个10**20次方如此巨大的数据序列,把每一个数都生成出来,并放在一个内存的列表内,这是粗暴的方式,有如此大的内存么?如果元素可以按照某种算法推算出来,需要就计算到哪个,就可以在循环的过程中不断推算出后续的元素,而不必创建完整的元素集合,从而节省大量的空间。在Python中,这种一边循环一边计算出元素的机制,称为生成器:generator。

生成生成器:

g = (x * x for x in range(1, 4))
g
<generator object <genexpr> at 0x1022ef630>

可以通过next()函数获得generator的下一个返回值,这点和迭代器非常相似:

next(g)
1
next(g)
4
next(g)
9
next(g)
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
next(g)
StopIteration
------------------------------------------------
但更多情况下,我们使用for循环。
for i in g:
print(i)

除了使用生成器推导式,我们还可以使用yield关键字。

def createNums():
print("----func start------")
a,b = 0,1
for i in range(5):
# print(b)
print("--1--")
yield b
print("--2--")
a,b = b,a+b # a,b = 1, 1 a,b = 1,2
print("--3--")
print("----func end------")
g= createNums()
next(g) # 如果想得到yield的值,可以打印next(g)

在 Python中,使用yield返回的函数会变成一个生成器(generator)。 在调用生成器的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行next()方法时从当前位置继续运行。

# 斐波那契函数
def fibonacci(n):
a = 0
b = 1
counter = 0
while True:
if counter > n:
return
yield a # yield让该函数变成一个生成器
a, b = b, a + b
counter += 1 fib = fibonacci(10) # fib是一个生成器
print(type(fib))
for i in fib:
print(i, end=" ")

生成器是可以循环的,相比next来说,for循环更友好

a = createNums()
这两种取值方式是一样的!!!
a.__next__()
next(a) for i in a:
print(i)

send

def test():
i = 0
while i<5:
temp = yield i
print(temp)
i+=1 t = test()
next(t)
next(t)
t.send("juran")
next(t)
--------------------------------------------
t = test()
t.send("juran")
Traceback (most recent call last):
File "/Users/binbin/Desktop/Python/demo.py", line 179, in <module>
t.send("juran")
TypeError: can't send non-None value to a just-started generator 如何解决这个错误?
> next(t)
t.send("juran") > send(None)

生成器的应用
实现多任务

def test1():
while True:
print("--1--")
yield None def test2():
while True:
print("--2--")
yield None t1 = test1()
t2 = test2()
while True:
next(t1)
next(t2)

Python函数-5 生成器的更多相关文章

  1. python函数-迭代器&生成器

    python函数-迭代器&生成器 一.迭代器 1 可迭代协议 迭代:就是类似for循环,将某个数据集内的数据可以“一个挨着一个取出来” 可迭代协议: ① 协议内容:内部实现__iter__方法 ...

  2. Python函数04/生成器/推导式/内置函数

    Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...

  3. Python函数(十一)-生成器

    首先看一下什么是列表生成式 >>> [i*2 for i in range(10)] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] >>> ...

  4. python——函数之生成器

    1 生成器函数的含义    生成器是一个返回可以迭代对象的函数,它是一个特殊的迭代器,但迭代器的抽象层级更高且比较复杂需要实现很多方法.相较迭代器而言,生成器简单使用. 2 生成器的创建方式 2.1 ...

  5. python 函数之装饰器,迭代器,生成器

    装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...

  6. Python —— 函数高级特性(切片、迭代、列表生成式、生成器、迭代器)

    一.切片(Slice) 在很多编程语言中,针对字符串提供了很多截取函数(i.e.  substring),目的就是对字符串切片.python中没有针对字符串的截取函数,需要通过“切片”来完成. 取一个 ...

  7. Python函数——列表推导式、生成器与迭代器

    列表推导式 产生背景 现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求你把列表里的每个值加1,你怎么实现? 第一种方法: a = [1,3,4,6,7,7,8,9 ...

  8. python中的生成器函数是如何工作的?

    以下内容基于python3.4 1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函 ...

  9. python函数、装饰器、迭代器、生成器

    目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递 ...

随机推荐

  1. 扩展NSDate类实现快捷使用 —— 昉

    获取当前日期和时间: +(NSDate *)getCurrentDate{ NSDate *now = [NSDate date]; return now; } 将日期转换为字符串: +(NSStri ...

  2. 动画推荐-By胡罗

    常用16种视图切换动画 系统自带的动画,结构清晰,代码简单 带弹性动画的分享菜单-https://github.com/KittenYang/KYShareMenu 第一眼以为用的是Pop动画,看了下 ...

  3. 配置docker的DNS

    方式一:在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS: { "dns" : [ "114.114.114.114 ...

  4. 《PHP程序员面试笔试宝典》——什么是职场暗语?

    本文摘自<PHP程序员面试笔试宝典> 文末有该书电子版下载. 随着求职大势的变迁发展,以往常规的面试套路因为过于单调.简明,已经被众多"面试达人"们挖掘出了各种&quo ...

  5. [源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)

    [源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3) 目录 [源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3) 0x00 摘要 0x01 回顾 0x0 ...

  6. Solution -「多校联训」I Love Random

    \(\mathcal{Description}\)   给定排列 \(\{p_n\}\),可以在其上进行若干次操作,每次选取 \([l,r]\),把其中所有元素变为原区间最小值,求能够得到的所有不同序 ...

  7. Mac欺骗实验

    实验目的 1.掌握MAC欺骗的原理 2.学会利用MacMakeUp软件工具进行伪造源MAC地址的MAC欺骗. 实验内容 使用MacMakeUp伪造主机mac地址,进行mac欺骗实验. 实验环境描述 1 ...

  8. React函数类组件及其Hooks学习

    目录 函数类组件 函数式组件和类式组件的区别: 为什么要使用函数式组件? Hooks概念及常用的Hooks 1. useState: State的Hook 语法 useState()说明: setXx ...

  9. Oracle之非关系数据库

    什么是非关系型数据库? 非关系型数据库它的全称是Not Only SQL(简称 NoSQL数据库)是用于存储和检索数据的非关系数据库系统.在当今世界,我们不应该只以没有预定义固定模式的表格式存储所有数 ...

  10. idea常用快捷键及配置

    目录 常用快捷键 常用配置 配置修改项 版本2019.1.3,配置.破解插件见网盘 2020.3.4 链接:https://pan.baidu.com/s/1WHsS8-yvHGf1iRopLbKIu ...