飘逸的python - yield简明教程

发现还有很多人对yield不理解,云里雾里,于是试着用文字表述.

只要函数含有yield语句,它就返回一个生成器.所以我们与其把其看成函数定义,不如看作是生成器定义.函数用return返回,而生成器用yield返回.

接下来是yield的行为.

比如

def html():
    yield 'header'
    for i in range(5):
        yield i
    yield 'footer'

h = html()#此时h变量就是一个生成器.
for x in h:#遍历生成器
    print x

怎么理解这个函数呢?

使用"yield消除技术",用一个结果变量来收集yield的东西并返回.

于是转换成

def html():
    ret = []
    ret.append('header')
    for i in range(5):
        ret.append(i)
    ret.append('footer')
    return ret

可以看到,yield语句没了,所有东西都在ret这个序列.

生成器的强大魔法在于它是延迟执行的,在需要的时候它才去执行代码,它"记住"了yield的执行位置,获取下一个结果的时候从上一次yield的位置继续往下走.

所以生成器相对于list,它每个时刻只保存一个当前结果,节省了内存,缺点是无法用下标索引,遍历一次就没了.另一个好处是可以生成无穷序列,如cycle.

需要注意的是,当我们调用函数的时候,它并不开始执行函数体代码,只是返回一个生成器.

比如

def A():
    print 'hehe'
    yield 1
    yield 2

当我们A()时,并不会print ‘hehe‘,而只有当我们遍历的时候,它才开始执行,从函数体第一行代码直到第一个yield,而后继续往下执行代码到下一个yield,如此下去.

时间: 2024-11-06 09:09:39

飘逸的python - yield简明教程的相关文章

python 入门 简明教程

使用源文件 现在让我们重新开始编程.当你学习一种新的编程语言的时候,你编写运行的第一个程序通常都是“Hello World”程序,这已经成为一种传统了.在你运行“Hello World”程序的时候,它所做的事只是说声:“Hello World”.正如提出“Hello World”程序的Simon Cozens[1]所说:“它是编程之神的传统咒语,可以帮助你更好的学习语言.” 启动你选择的编辑器,输入下面这段程序,然后把它保存为helloworld.py. 例3.2 使用源文件 #!/usr/bi

《Python简明教程》总结

Python经典教程<Python简明教程> 目录: 为什么Python 安装Python 体验Python Python数据类型 运算符与表达式 控制流 函数 模块 数据结构 解决问题 面向对象 输入输出 异常 标准库 更多的内容

[学习笔记] Python标准库简明教程 [转]

1 操作系统接口 os 模块提供了一系列与系统交互的模块: >>> os.getcwd() # Return the current working directory '/home/minix/Documents/Note/Programming/python/lib1' >>> os.chdir('~/python') # Change current working directory Traceback (most recent call last): File

python中sys.argv的说明(读《python简明教程》的困惑解答)

在阅读<python简明教程>的时候,第8章.14章有对sys模块的使用,其中关于sys.argv的说明有一点困惑,让自己思索了好久,后来才恍然大悟,在这里分享一下我所理解到的,以便于和我有一样困惑的python学习者能够更好的理解. 以下代码来自于<python简明教程>8.1: 例8.1 使用sys模块 #!/usr/bin/python # Filename: using_sys.py import sys print 'The command line arguments

Python的入门级试用(简明教程)

声明:借鉴Python 简明教程 用 Python 编写的传统的 'Hello World' 程序.使用 Python 运行你的程序的方法有两种:使用交互式解释器提示符或者使用源文件.现在我们来看一下如何使用这两种方法. 一.使用交互式解释器提示符(>>>) 1.使用windows 7系统为例:win+R启动命令窗口如下图所示: 输入cmd--->回车-->python,如下图所示: 输入python--->回车,如下图所示: 在这里你应该会看到 >>>

Gevent简明教程

Gevent简明教程 发表于 2015-11-28 |  分类于 技术| |  阅读次数 5159 前述 进程 线程 协程 异步 并发编程(不是并行)目前有四种方式:多进程.多线程.协程和异步. 多进程编程在python中有类似C的os.fork,更高层封装的有multiprocessing标准库 多线程编程python中有Thread和threading 异步编程在linux下主+要有三种实现select,poll,epoll 协程在python中通常会说到yield,关于协程的库主要有gre

Lisp简明教程

此教程是我花了一点时间和功夫整理出来的,希望能够帮到喜欢Lisp(Common Lisp)的朋友们.本人排版很烂还望多多海涵! <Lisp简明教程>PDF格式下载 <Lisp简明教程>ODT格式下载 具体的内容我已经编辑好了,想下载的朋友可以用上面的链接.本人水平有限,如有疏漏还望之处(要是有谁帮我排排版就好了)还望指出!资料虽然是我整理的,但都是网友的智慧,如果有人需要转载,请至少保留其中的“鸣谢”页(如果能有我就更好了:-)). Lisp简明教程 整理人:Chaobs 邮箱:[

appium简明教程(11)——使用resource id定位

上一节乙醇带大家了解了appium的定位策略.实际上appium的控件定位方式是完全遵守webdriver的mobile扩展协议的. 这一节将分享一下如何使用resource id来定位android策略. 什么是resource id,这个不属于本文的范畴,大家可以点这里了解. 我们可以有两种方式来使用resource id进行定位: 使用 findElement(By.id("resourceId")) 的方式.这也是原生的webdriver定义的方法,不过竟然在appium的官方

appium简明教程(4)——appium client的安装

appium client是对webdriver原生api的一些扩展和封装.它可以帮助我们更容易的写出用例,写出更好懂的用例. appium client是配合原生的webdriver来使用的,因此二者必须配合使用缺一不可. 从本节开始,教程的内容将涵盖3个语言,ruby/python/java. 安装appium client ruby篇(一定要在线安装) ruby的appium client叫做appium lib,为什么是这样就不解释了,总之是历史原因. 首先update rubygem和