Python|生成器

01

列表生成式的缺点

通过列表生成式,我们可以直接创建一个列表。但是,内存数量有限,列表容量肯定不能超过内存大小。

再有,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面10%的元素,那后面绝大多数元素占用的空间都白白浪费了。

02

解决办法

如果列表元素中的元素可以按照某种算法推算出来,那是否可以在循环过程中,推算出我们需要的一定数量的元素呢?

这样地话,我们就可以灵活地创建需要数量的list,从而节省大量的空间。

在Python中,这种一边循环一边计算的机制,称为生成器:generator

03

创建generator

下面介绍两种创建generator的方法

第一种方法很简单,只要把一个列表生成式的 [] 改成 (),就创建了一个generator

g = ( x * x for x in range(10) )

g is a generator object

第二种方法是函数中带有yield,那么此函数就不再是函数了,而是一个generator,

def generatorfun(): print('step 1') yield(10) print('step 2') yield 30

04

generator特殊之处

最难理解的就是generator和函数的执行流程不一样。

函数是顺序执行,遇到return语句或者最后一行函数语句就返回。

变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

通过03节的例子体会这个执行顺序:

gen = generatorfun() print(next(gen)) print(next(gen))

以上输出:

step 1 10 step 2 30

因此,调用第二个next(gen)时,是从第一个yield后一句代码开始执行的。

05

通过捕获去拿返回值

generator对象实际使用时,一般嵌入在for循环中,generator函数的返回值如何拿到呢?

必须捕获StopIteration错误,返回值包含在StopIteration的value中。

def generatorfun(): print('step 1') yield(10) print('step 2') yield 30 return "Okay" gen = generatorfun() while True: try: print(next(gen)) except StopIteration as e: print("return value: "+ e.value) break

输出为:

step 1 10 step 2 30 return value: Okay

原文发布于微信公众号 - 算法channel(alg-channel)

原文发表时间:2018-01-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张俊红

python中的小魔法(一)

? 总第101篇 if-else的简洁写法 #常规写法 if a>b: c=a else: c=b #简洁写法 c=a if a>b...

2704
来自专栏开源优测

[快学Python3]函数

一、一个基本的函数 概述 简单的说,函数就是一种代码组织方式,让你可以实现单一、或关联功能的封装,以便高复用。 函数定义 下面我们看一看在Python中函数定义...

2806
来自专栏数据结构与算法

P3368 【模板】树状数组 2(树状数组维护差分序列)

题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N、M,...

3346
来自专栏大闲人柴毛毛

Java基础全面解析——Java语言基础

高级编程语言的组成:关键字、标识符、注释、常量与变量、语句、函数、数组,下面一一介绍各个组成元素。 a)  关键字 i.  定义:关键字是一些英文单词,但在ja...

2967
来自专栏个人随笔

房上的猫:while循环与do-while循环,debug的调试运用

一.循环结构  1.循环不是无休止进行的,满足一定条件的时候循环才会继续,称为"循环条件",循环条件不满足的时候,循环退出  2.循环结构是反复进行相同的或类似...

38511
来自专栏五分钟学算法

五分钟学会一个有意思的排序:计数排序

由于LeetCode上的算法题很多涉及到一些基础的数据结构,为了更好的理解后续更新的一些复杂题目的动画,推出一个新系列 -----《图解数据结构》,主要使用动画...

1036
来自专栏机器学习算法与Python学习

python基础语法(1)

从今天起,将进行python的一个系列学习,从基本的语法学起,后期会推出一些关于web开发,网络爬虫以及用python的第三方库进行数据挖掘与机器学习等高级的开...

38214
来自专栏Golang语言社区

Golang语言”奇怪用法“有哪些?

1,go的变量声明顺序是:”先写变量名,再写类型名“,此与C/C++的语法孰优孰劣,可见下文解释: http://blog.golang.org/gos-dec...

32410
来自专栏决胜机器学习

PHP数据结构(二十一) ——希尔排序

PHP数据结构(二十一)——希尔排序 (原创内容,转载请注明来源,谢谢) 一、概述 希尔排序,又称缩小增量排序,也属于插入排序类方法,时间上有较大改进。前面...

3407
来自专栏小白的技术客栈

Python基础语法-内置数据结构概览

本文内容非常简单,主要介绍接下来要讲的内容。那就是Python的内置数据结构。今天只是简单介绍一下Python都有哪些内置数据结构,这样就可以循序渐进地进行学习...

3477

扫码关注云+社区