文档章节

黄哥漫谈Python 生成器

黄哥Python培训
 黄哥Python培训
发布于 2016/08/07 07:51
字数 771
阅读 67
收藏 2
点赞 0
评论 0

黄哥漫谈Python 生成器

何为生成器(Generators) 下面的黄哥用大白话说明。 当Python 函数不用return 返回值,用yield关键字的时候,函数的返回值为生成器对象。

图中代码,函数没有用return 返回值,用yield 输出值,函数的调用返回值为生成器对象, 生成器对象,用p.next()方法返回一个值,函数执行暂停,下次再调用next()方法时,从 暂停处开始执行,print 输出值。再执行第二个yield 返回值。

像上面函数的返回值为生成器对象的函数叫做生成器函数。

生成器是一个可迭代对象,可以用for循环迭代。

特别需要注意的是,初学者容易出现的一个错误是,生成器用next()方法,到最后一个yield 返回值时,再用一次,会报错误StopIteration。

下面图片中p是生成器,用了二次next()方法,相当于返回值都返回完了,再循环迭代没有输出。见过初学者一直问为啥这样,黄哥说“你可以想像成指针”前面已经指到尾部了。所以

for 循环 没有输出。

增强的生成器,有send()和close()方法。

增强的生成器中,除yield可以输出值,也可以从外部send值到生成器内部。这个时候,yield 是表达式,可以输出值,也可以接收值赋值给其他变量。

有近一步学习的,请看

PEP 342 -- Coroutines via Enhanced Generators

https://www.python.org/dev/peps/pep-0342/

下面讲讲生成器实例代码。

1、利用生成器生成可以无限取值的斐波拉切函数。

	#!/usr/bin/env python
	# -*- coding: utf-8 -*-
	# Author: 黄哥python培训 qq:1465376564


	def fib():
	    a, b = 0, 1
	    while True:
	        yield a
	        a, b = b, a + b

	p = fib()
	print [p.next() for i in xrange(101)]

2、求PI值。

	#!/usr/bin/env python
	# -*- coding: utf-8 -*-
	# Author: 黄哥python培训 qq:1465376564
	"""
	1 - 1/3 + 1/5 - 1/7 + ...

	"""


	def pi_series():
	    total = 0
	    i = 1.0
	    j = 1
	    while True:
	        total = total + j / i
	        yield 4 * total
	        i += 2
	        j = j * -1


	def main(g, n):
		for i in range(n):
			yield g.next()

	if __name__ == '__main__':
	    print list(main(pi_series(), 8))

	#[4.0, 2.666666666666667, 3.466666666666667, 2.8952380952380956, 3.3396825396825403, 2.9760461760461765, 3.2837384837384844, 3.017071817071818]

3、生成器处理大日志文本文本。

		# coding:utf-8

		import time
		start_time = time.time()


		def find_ip(path):
		    for line in open(path):
		        s = line.find('"Sogou web spider')
		        if s >= 0:
		            yield line[:s].strip()

		p = find_ip("bigfile.txt")
		p = list(set(list(p)))
		for item in p:
		    print item

		print time.time() - start_time, "seconds"

4、生成器函数也可以玩递归。

		#!/usr/bin/env python
		# -*- coding: utf-8 -*-
		# Author: 黄哥python培训 qq:1465376564


		def spread_list(lst):
		    tmp = []
		    for item in lst:
		        if isinstance(item, list):
		            tmp = spread_list(item)
		            for item2 in tmp:
		                yield item2
		        else:
		            yield item

		l = [1, 2, 3, 4, 5, [6], [7, 8, [9, [10]]]]
		l2 = [[3, 7, [9, 6]], [2, [3, 4], 10], 99, 28]
		l3 = []
		l4 = [3, 4, 5, 8]
		lst = spread_list(l)
		print list(lst)
		lst = spread_list(l2)
		print list(lst)
		lst = spread_list(l3)
		print list(lst)
		lst = spread_list(l4)
		print list(lst)

		# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
		# [3, 7, 9, 6, 2, 3, 4, 10, 99, 28]
		# []
		# [3, 4, 5, 8]

如何训练自己的编程思路

部分免费Python免费视频

感恩!感谢黄哥Python培训学员的支持和肯定

© 著作权归作者所有

共有 人打赏支持
黄哥Python培训
粉丝 40
博文 21
码字总数 14219
作品 0
海淀
更深入的理解 Python 中的迭代

深入探讨 Python 的 循环来看看它们在底层如何工作,以及为什么它们会按照它们的方式工作。 Python 的 循环不会像其他语言中的 循环那样工作。在这篇文章中,我们将深入探讨 Python 的 循环来...

01% ⋅ 05/26 ⋅ 0

人人都能学会的python编程教程15:高级特性2

生成器 如果你想要一百万个数,而这些数里只有一百个数是你经常要用的,剩下的都几乎不怎么会用到,那么如果直接把这一百万个数全部放在list中是不明智的因为这会浪费较多存储空间,生成器就...

编程老司机 ⋅ 05/10 ⋅ 0

Python进阶系列连载(13)——Python内置高阶函数filter(下)

前言 进阶部分连载继续~ 如果还没看过我的入门连载部分,先看: https://ask.hellobi.com/blog/wangdawei/10288 当然,小编的免费入门课程已经有咯,看过连载的朋友可以看看视频再快速梳理一...

ID王大伟 ⋅ 04/28 ⋅ 0

运维如何通过学习python学会编程

运维如何通过学习python学会编程 运维必须懂开发,特别是python开发,已经形成大家的共识,不懂开发的运维,路会越走越窄。 黄哥,从2012年底,从事python教学过程中,接触到很多运维的朋友。...

黄哥Python培训 ⋅ 2016/03/01 ⋅ 0

Python的三大神器,你知道是哪三大吗?史上最详细的入门教程!

Python的三大神器:装饰器.迭代器与生成器!这就是Python的三大神器,好了废话不多说。直接来上干货吧! 生成器 仅仅拥有生成某种东西的能力,如果不用next方法是获取不到值得。 创建一个生成...

q1622479435 ⋅ 06/08 ⋅ 0

Python高级编程和异步IO并发编程

Python高级编程和异步IO并发编程 网盘地址:https://pan.baidu.com/s/1eB-BsUacBRhKxh7qXwndMQ 密码: tgba 备用地址(腾讯微云):https://share.weiyun.com/5Z3x9V0 密码:7cdnb2 针对Pytho...

人气王子333 ⋅ 04/23 ⋅ 0

python有趣用法汇总(持续更新)

使用python过程中经常会不经意间遇到非常有趣的用法,于是特意搜集了一些 有趣的用法 1.for-else用法 循环正常结束则执行else语句。一般用于循环找符合条件的元素,如果找到则调出循环,不会...

p柯西 ⋅ 06/05 ⋅ 0

python2和python3的filter

python3的filter支持无限序列生成器,但是python2会死掉,是实现机制不同了吗?

python2015 ⋅ 2015/08/29 ⋅ 2

Python 迭代器和 生成器

一直以为 Python 的生成器是指 列表生成, 好吧,我读书少。 其实呢,生成器是 使用yield 返回实现了迭代器协议的generator 对象。 如下: def init(self, *args):self._data = list(args)d...

MtrS ⋅ 2014/12/22 ⋅ 0

python2.x和python3.x的区别

Python的3.0版本,常被称为Python3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。 为了不带入过多的累赘,Python3.0在设计的时候没有考虑向下相容。许多针对早期Python版本...

leejia1989 ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

两道面试题,带你解析Java类加载机制

在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa{ static { System.out.println("爷爷在静态代码块"); }} cl...

1527 ⋅ 19分钟前 ⋅ 0

SpringCloud(Data Flow)

dataflow-server

赵-猛 ⋅ 29分钟前 ⋅ 0

深入理解Java虚拟机

这本书我读到第8章,之后就是在读不下去了。 读到后面是一种痛苦的体验,太多的东西是不全面的,大量的专有名词是没有解释的,读到最后很多东西仅仅是一个侧面,所以我觉得,这本书不适合初学...

颖伙虫 ⋅ 34分钟前 ⋅ 0

B树和B+树的总结

B树 为什么要B树 磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的...

浮躁的码农 ⋅ 37分钟前 ⋅ 0

NanoPi NEO core/ Ubuntu16.04单网卡配置3个IP地址(2个静态,1个动态)

配置 root@NanoPi-NEO-Core:/etc/network# cat interfacesauto loiface lo inet loopbackallow-hotplug eth0iface eth0 inet static address 172.31.188.249 netmask 255.......

SamXIAO ⋅ 今天 ⋅ 0

三步为你的App集成LivePhoto功能

摘要:LivePhoto是iOS9新推出的一种拍照方式,类似于拍摄Gif图或录制视频片段生成图片。如果没有画面感,可以联想《哈利波特》霍格沃茨城堡的壁画,哈哈,很炫酷有木有,但坑爹的是只有iphone6S以...

壹峰 ⋅ 今天 ⋅ 0

centos7 git安装

由于centos中的源仓库中git不是最新版本,需要进行源码安装。 1、查看yum仓库git信息 [root@iZm5e3d4r5i5ml889vh6esZ zh]# yum info gitLoaded plugins: fastestmirrorLoading mirror s...

xixingzhe ⋅ 今天 ⋅ 0

input file 重复上传同一张图片失效的解决办法

解决办法 方法一:来回切换input[type='file']的type属性值,可以是‘text’,'button','button'....,然后再切换回来‘file’ 方法二:每次取消图片预览后,重置input[type='file']的value的...

时刻在奔跑 ⋅ 今天 ⋅ 0

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难去根...

xiaomin0322 ⋅ 今天 ⋅ 0

WampServer默认web服务器根目录位置

安装WampServer之后的web服务器根目录默认位置在WampServer安装目录下的www:

临江仙卜算子 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部