文档章节

What does the yield keyword do in Python? (引用)

zshgss
 zshgss
发布于 2015/02/26 10:51
字数 449
阅读 10
收藏 0
点赞 0
评论 0

When you create a list, you can read its items one by one, and it's called iteration:

>>> mylist = [1, 2, 3]>>> for i in mylist:...    print(i)123

Mylist is an iterable. When you use a list comprehension, you create a list, and so an iterable:

>>> mylist = [x*x for x in range(3)]>>> for i in mylist:...    print(i)014

Everything you can use "for... in..." on is an iterable: lists, strings, files... These iterables are handy because you can read them as much as you wish, but you store all the values in memory and it's not always what you want when you have a lot of values.

Generators

Generators are iterators, but you can only iterate over them once. It's because they do not store all the values in memory, they generate the values on the fly:

>>> mygenerator = (x*x for x in range(3))>>> for i in mygenerator:...    print(i)014

It is just the same except you used () instead of []. BUT, you can not perform for i in mygenerator a second time since generators can only be used once: they calculate 0, then forget about it and calculate 1, and end calculating 4, one by one.

Yield

Yield is a keyword that is used like return, except the function will return a generator.

>>> def createGenerator():...    mylist = range(3)...    for i in mylist:...        yield i*i...>>> mygenerator = createGenerator() # create a generator>>> print(mygenerator) # mygenerator is an object!<generator object createGenerator at 0xb7555c34>>>> for i in mygenerator:...     print(i)014

Here it's a useless example, but it's handy when you know your function will return a huge set of values that you will only need to read once.

To master yield, you must understand that when you call the function, the code you have written in the function body does not run. The function only returns the generator object, this is a bit tricky :-)

Then, your code will be run each time the for uses the generator.

Now the hard part:

The first time the for calls the generator object created from your function, it will run the code in your function from the beginning until it hits yield, then it'll return the first value of the loop. Then, each other call will run the loop you have written in the function one more time, and return the next value, until there is no value to return.

The generator is considered empty once the function runs but does not hit yield anymore. It can be because the loop had come to an end, or because you do not satisfy a "if/else" anymore.


本文转载自:http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python

共有 人打赏支持
zshgss
粉丝 1
博文 1
码字总数 0
作品 0
青岛
程序员
转-深入探讨Ruby与Python语法比较

自:http://developer.51cto.com/art/200912/169306.htm 1. Ruby的case可以匹配很多东西:范围/数组,对象,正则表达,python没有case/switch而使用if/else比较死板点 2. python的缩进很漂亮...

玉龙
2011/10/12
0
0
Python中如何使用yield,对于庞大迭代的优化处理

一直困扰于yield的使用,今天看到一篇不错的解释,虽然都是英文,不过不要紧,可以跳开,直接看代码的部分就能懂 Improve Your Python: 'yield' and Generators Explained Posted on Apr 07...

青鸾之旅
2013/08/02
0
3
云计算Python自动化:Python标识符讲解

开发人员在程序中自定义的一些符号和名称。标示符是自己定义的,如变量名,函数名等。在日常生活中,标示符是用来指定某个东西、人,要用到它,他或她的名字;在数学中解方程时,我们也常常用到...

长沙千锋
05/15
0
0
Python Tips, Tricks, and Hacks

一、快速技巧 1.1、4 种引号 ' ''' " """ print """I wish that I'd never heard him say, '''She said, "He said, 'Give me five dollars'"'''""" 1.2、对象/变量的真与假 my_object = 'Tes......

大数据之路
2013/07/23
0
0
python生成式生成器详细解答

Python得yield关键字,yield是python中的生成器 了解生成器需要先了解什么是生成式,切片的目的是从已有的列表中切出一部分返回,而生成式的目的则是从无到有的构建一个列表 一个生成式的案例...

开源中国段子手
2015/07/21
0
0
【原创】Python 之快速性能优化(第一部分)

本文为翻译,原文地址:《Quick Python Performance Optimization: Part I》 This is part I of a two part series of blog post on performance optimization in python. Aim is to just e......

摩云飞
2013/11/19
0
0
从python协程理解tornado异步

博客原文地址:http://www.v2steve.com/2015/05/31/python/pytornadoasync/ 刚接触tornado时候最疑惑的问题就是tornado.gen.coroutine是怎么实现的。如何在代码中用同步格式实现异步效果。看...

__Steve__
2015/05/31
0
0
Python yield 使用浅析(转载)

Python yield 使用浅析 转载http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ 以下是理解归纳 如何生成斐波那契數列 def fab(max): 执行 fab(5) 问题是print太多了 解决...

okker
2013/12/16
0
0
Python核心编程(第二版)学习笔记02 【第3章 Python基础】

Python核心编程(第二版)学习笔记02 【第3章 Python基础】 2009-4-16 20:45 Tony 1 python语句基本规则和特殊字符: 反斜杠 继续上一行 分号 ; 将两个语句连接在一行中 冒号 : 将代码块的头...

Free Man
2009/04/16
0
0
Iterator, Generator 与 Yield

Iterator Iterator(迭代器) 是一种常见的对象,它允许调用者方便的遍历该对象中的元素,广泛的运用于多种编程语言,如 Python, Java 和 Ruby 等。以 Python 为例,Iterator 需要实现两种方法...

koala bear
2016/10/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Dubbo 源码解读 —— 可支持序列化及自定义扩展

一、概述 从源码中,我们可以看出来。目前,Dubbo 内部提供了 5 种序列化的方式,分别为 fastjson、Hessian2、Kryo、fst 及 Java原生支持的方式 。 针对不同的序列化方式,对比内容如下: 名...

Ryan-瑞恩
11分钟前
0
0
MySQL内存设置—— MySQL server has gone away

set global max_allowed_packet=268435456

一梦心草
20分钟前
0
0
推导式

列表、集合和字典推导式 列表推导式是Python最受喜爱的特性之一。它允许用户方便的从一个集合过滤元素,形成列表,在传递参数的过程中还可以修改元素。形式如下: [expr for val in collect...

火力全開
25分钟前
0
0
maven配置文件settings.xml详解

settings.xml有什么用? 如果在Eclipse中使用过Maven插件,想必会有这个经验:配置settings.xml文件的路径。 settings.xml文件是干什么的,为什么要配置它呢? 从settings.xml的文件名就可以...

浮躁的码农
30分钟前
0
0
MakeCode图形化编程语言学习笔记:micro:bit编程练习题[图]

MakeCode图形化编程语言学习笔记:micro:bit编程练习题[图]: 基础训练题: Q1:摇晃micro:bit编程板,随机出现7个小动物图标中的一个,并且前后相邻两次出现的小动物不重复。 注:七个小动物...

原创小博客
30分钟前
0
0
Redis 压力测试说明

Redis 压力测试说明 redis压力测试 2014-03-24 21:41:07| 分类: 默认分类 | 标签:redis |举报|字号 订阅 这几天对比测试mongodb、redis、pg的性能,主要是在消息队列、消息处理、用户经纬度...

舒文joven
31分钟前
0
0
拉姆达表达式 追加 条件判断 Expression>

public static class PredicateBuilder {   /// <summary>   /// 机关函数应用True时:单个AND有效,多个AND有效;单个OR无效,多个OR无效;混应时写在AND后的OR有效   /// </summary...

Lytf
43分钟前
0
0
【HAVENT原创】Spring Boot + Kafka 消息日志开发

最近因为部门需要将服务程序的各种日志发送给 Kafka 进行分析,所以写一个 Kafka 消息日志操作类,主要用来保存日志到 Kafka 以便查询。 一、pom.xml 增加配置 <!-- HH: 引入 kafka 模块 ...

HAVENT
43分钟前
0
0
7、Git命令解析

1、创建版本库 cd E:mkdir myRepositorypwdls -ah======git init 2、添加文件到仓库 添加git add readme.txt提交git commit -m "i wrote a readme file"【为什么Git添加...

丑陋的皮囊
44分钟前
0
0
ImageMagick批量压缩图片

#!/bin/shfor img in `find ./image -name "*.jpg"`; donewimg=`basename $img` convert -quality 75% $img ./ok/$newimg echo ./ok/$newimgdone...

dworry
44分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部