Python中三大器有迭代器,生成器,装饰器,本文主要讲述生成器。主要从生成器的概念,本质,以及yield关键字的使用执行过程。

本质:生成器是一类特殊的迭代器,使用了yield关键字的函数不再是函数,而是生成器。(使用了yield的函数就是生成器)

1.yield关键字有两点作用

  1.1 yield语句一次返回一个结果,保存当前运行状态(断点),然后暂停执行,挂起函数的状态,以便下次重它离开的地方继续执行,即将生成器(函数)挂起

  1.2.将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用

      1.2.1 可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数)

    1.2.2 Python3中的生成器可以使用return返回最终运行的返回值,而Python2中的生成器不允许使用return返回一个返回值(即可以使用return从生成器中退出,但return后不能有任何表达式)。

2. 优点

  2.1 使用生成器函数代码量更少。

  2.2 生成器的好处是延迟计算,一次返回一个结果,不会一次生成所有的结果,这对于大数据量处理,将会非常有用,即省内存。

3. 生成方法

  3.1 生成器表达式【使用与推算算法笔记简单的】

  3.2 生成器函数【generator非常强大。如果推算的算法比较复杂,用类似列表生成式的 for 循环无法实现的时候,还可以用函数来实现】

4.代码实现

4.1 创建生成器方法1 ,把列表产生式的[]换成(),即生成器表达式。

In [1]: li=[2*x for x in range(6)]

In [2]: li
Out[2]: [0, 2, 4, 6, 8, 10] In [3]: type(li)
Out[3]: list In [4]: li=(2*x for x in range(6)) In [5]: li
Out[5]: <generator object <genexpr> at 0x7fef38260780> In [6]: for item in li:
...: print(item)
...:
0
2
4
6
8
10

4.2 创建生成器方法2,使用yield关键字。

在使用生成器实现的方式中,我们将原本在迭代器__next__方法中实现的基本逻辑放到一个函数中来实现,但是将每次迭代返回数值的return换成了yield,此时新定义的函数便不再是函数,而是一个生成器了。必须捕获StopIteration错误,返回值包含在StopIteration的value中。

def fib(num):
i = 0; num1, num2 = 0, 1
while i < num:
yield num1
num1, num2 = num2, num1 + num2
i += 1
return "none" gen_fib = fib(3)
# for item in gen_fib:
# print(item)
print(gen_fib.__next__())
print(gen_fib.__next__())
print(gen_fib.__next__())
try:
print(gen_fib.__next__())
except StopIteration as e:
print(e.args)
print(e.value) # 0
# 1
# 1
# ('none',)
# none

4.3 使用send()唤醒函数

我们除了可以使用next()函数来唤醒生成器继续执行外,还可以使用send()函数来唤醒执行。使用send()函数的一个好处是可以在唤醒的同时向断点处传入一个附加数据。

必须首先使用next(f),或者f.__next__()启动,才可以使用send()函数。__next__(相当于None)。首先,使用__next__启动,当Python解释器遇到yield关键字时,停止往下执行,即yield左边赋值不再执行。当再次调用__next__,或者send时,开始执行yield左边赋值操作。temp的值是send的参数值,和i无关,如果使用的是__next__唤醒,而不是send唤醒,那么temp的值是None。

def fun():
i = 0
while i < 5:
temp = yield i
print("temp:", temp)
i += 1 f = fun()
f.__next__()
f.__next__()
f.send("我是send")
# 结果
# temp: None
# temp: 我是send

Python生成器笔记的更多相关文章

  1. Python学习笔记之生成器、迭代器和装饰器

    这篇文章主要介绍 Python 中几个常用的高级特性,用好这几个特性可以让自己的代码更加 Pythonnic 哦 1.生成器 什么是生成器呢?简单来说,在 Python 中一边循环一边计算的机制称为 ...

  2. python学习笔记(六)文件夹遍历,异常处理

    python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...

  3. python自学笔记

    python自学笔记 python自学笔记 1.输出 2.输入 3.零碎 4.数据结构 4.1 list 类比于java中的数组 4.2 tuple 元祖 5.条件判断和循环 5.1 条件判断 5.2 ...

  4. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  5. 【Python学习笔记之二】浅谈Python的yield用法

    在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...

  6. Python学习笔记(十一)

    Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...

  7. Python学习笔记(十)

    Python学习笔记(十): 装饰器的应用 列表生成式 生成器 迭代器 模块:time,random 1. 装饰器的应用-登陆练习 login_status = False # 定义登陆状态 def ...

  8. 【python学习笔记】9.魔法方法、属性和迭代器

    [python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...

  9. Python机器学习笔记:使用Keras进行回归预测

    Keras是一个深度学习库,包含高效的数字库Theano和TensorFlow.是一个高度模块化的神经网络库,支持CPU和GPU. 本文学习的目的是学习如何加载CSV文件并使其可供Keras使用,如何 ...

随机推荐

  1. ubuntu lapack安装与使用

    https://blog.csdn.net/zouyu1746430162/article/details/53374693 https://blog.csdn.net/mlnotes/article ...

  2. Json---Linux下使用Jsoncpp

    一.安装 scons 下载地址:http://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.tar.gz/download ...

  3. 图形界面至少要有一个顶级Swing容器

    图形界面至少要有一个顶级Swing容器 顶级Swing容器为其它Swing组件在屏幕上的绘制和处理事件提供支持 常用的顶级容器: JFrame(框架):表示主程序窗口 JDialog(对话框):每个J ...

  4. JAVA编程环境JDK与JRE运行环境与API核心ClassMap

    JDK(Java Development Kit)称为Java开发包或Java开发工具,是一个编写Java的Applet小程序和应用程序的程序开发环境.JDK是整个Java的核心1.Java运行环境( ...

  5. IntelliJ IDEA 2017 汉化包及教程

    一.准备 官网下载IntelliJ IDEA 2017 并安装好 下载汉化包 (百度云链接:http://pan.baidu.com/s/1slS9ZMP 密码:gp79) 二.汉化 此处有两种方法, ...

  6. C++编程经验-返回局部变量的讨论(转)

    返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗?  返回指向局部变量的指针才有问题, 函数退栈之后,局部变量消失, 指针将指向未知区域,所以出现问题.   返回局部 ...

  7. 简单入门dos程序

    --1.关机程序 注意:文件保存为.bat echo 晚安了,宝贝! @echo off shutdown -s -t exist --2.快捷/批量启动程序 title "程序系统启动&q ...

  8. python程序的输入输出(acm的几个小程序)

    1,  A+B Problem : http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1000 #! ...

  9. UISegmentedControl: 增加代理方法

    UISegmentedControl 没有代理方法可以设置,不能在选择之前做预处理.为此,重写了 UISegmentedControl 创建文件 RFSegmentedControl,继承自 UISe ...

  10. “A configuration with this name already exists” error in eclipse run configurations

    “A configuration with this name already exists” error in eclipse run configurations Is there a way t ...