Python:生成器的简单理解

一、什么是生成器

在Python中,由于受到内存的限制,列表容量肯定是有限的。例如我们创建一个包含一亿个元素的列表,Python首先会在内存中开辟足够的空间来存储这个包含一亿个元素的列表,然后才允许用户去使用这个列表,这就可能会导致以下问题:

  1、内存中没有足够的内存空间开存储这个列表,从而导致列表无法创建

  2、即使列表成功创建,然而仍会消耗很长的时间,导致程序效率低下

  3、若用户只想访问列表前面的几个元素,则后面列表绝大多数元素占用的空间就都白白浪费了

为了有效解决以上的问题,Python中引入了一种“一边循环,一边计算”的新机制,即当用户需要使用某个对象时,Python才根据事先设计好的规则开辟内存空间创建这个对象供用户使用,而不是像列表一样事先将所有的对象都创建完毕之后再提供给用户使用。这种机制在Python中成为生成器(generator)。

二、生成器的创建

A、生成器推到式

与列表推到式类似,只不过生成器推导式使用()而非[],并且最终返回的是生成器而非列表

1 g=((i+2)**2 for i in range(2,30)) #g是一个生成器
2 print(g) #g为空,里面包含任何元素

B、yield关键字

在一个函数定义中包含yield关键字,则这个函数就不再是一个普通的函数,而是一个生成器(generator)

[说明]:yield指令可以暂停一个函数并返回其中间结果,使用该指令的函数将保存执行环境,并在必要时恢复

 1 def fib(max):
 2     n,a,b=0,0,1
 3     while n<max:
 4         #print(b)
 5         yield b
 6         a,b=b,a+b
 7         n+=1
 8     return ‘done‘
 9
10 f=fib(6)
11 print(f)

[注]:普通函数和变成生成器的函数的不同:

普通函数是顺序执行的,遇到return或是最后一行函数语句就返回。而变成生成器的函数在每次调用__next__()方法时执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行

1 f=fib(6)
2 print(f)
3 print(f.__next__())
4 print(f.__next__())
5 print(‘暂停一下‘)
6 print(f.__next__())
7 print(f.__next__())

三、生成器方法

1.close()方法:手动关闭生成器函数,后面的调用会直接返回StopIteration异常

1 def func():
2     yield 1
3     yield 2
4     yield 3
5
6 g=func()
7 g.__next__()
8 g.close() #手动关闭生成器
9 g.__next__() #关闭后,yield 2和yield 3语句将不再起作用

时间: 2024-07-29 13:09:53

Python:生成器的简单理解的相关文章

python @装饰器 简单理解

个人学python 好久了,但是一直是这里挑点哪里挑点那样学,有点力不从心.最近又想看看装饰器怎么用,就又研究了一下下. 简单点的: #!/usr/bin/python def say(key):                              # 创建一个小函数 print 'your first love!' return key @say def hold(): print 'this is sercod world!' hold() 简单讲一下就是   @say def hol

4.利用python生成器实现简单的“生产者消费者”模型

假如说,没有生成器这种对象,那么如何实现这种简单的"生产者消费者"模型呢? import time def producer(): pro_list = [] for i in range(10000): print "包子%s制作ing" %(i) time.sleep(0.5) pro_list.append("包子%s" %i) return pro_list def consumer(pro_list): for index,stuffe

python中HTMLParser简单理解

找一个网页,例如https://www.python.org/events/python-events/,用浏览器查看源码并复制,然后尝试解析一下HTML,输出Python官网发布的会议时间.名称和地点. 1 from html.parser import HTMLParser 2 from html.entities import name2codepoint 3 4 class MyHTMLParser(HTMLParser): 5 6 in_title = False 7 in_loca

python 进程线程简单理解

简单的理解 1.线程:最小的执行单元:进程:最小的资源单元 2.一个程序至少有一个进程,一个进程至少有一个线程(线程可以理解为线程的容器) 3.进程在执行过程中拥有独立的内存单元,而多个线程共享内存 4.每一个独立的线程都有 程序的入口,顺序执行的序列和程序出口,但是线程不能独立执行,必须由应用程序提供多个线程执行控制 5.进程是系统进行资源分配和调度的一个独立单元 多线程的代码开启 import threading import time def sing(): print("begin to

Python之简单理解装饰器(1)

装饰器是Python高级应用的一部分,其应用也很广泛.网上对其介绍和讲解也是五花八门,我在这里就对其进行简单介绍,并对如何渐进理解使用装饰器进行说明,以便和大家共同学习.如有更高见解,也请大家留言指正. 装饰器概念简单理解 循序渐进装饰器 装饰器概念简单理解 装饰器按照我的理解,就是在不改变原有函数代码的情况下,对原有函数进行功能的扩展. 这里先写个简单的装饰器,给大家有个概念性的认识. def anotherone(func):  #定义装饰器     def inner():        

如何简单理解Python中的if __name__ == &#39;__main__&#39;:

简单概括: if __name__ == '__main__': 在模块里面用于放测试代码,因为导入模块就会执行模块的代码,但是模块的测试代码我们是不需要执行的,我们只需要模块的功能,这是就要用到if __name__ == '__main__': 当别人调用这个模块的时候if__name__就不等于"__main__"了 __name__是模块的路径了,所以if__name__是不等于__main__的,不满足条件,不执行if __name__ == '__main__':下面的代码

python 生成器和迭代器

迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stoplteration异常,以终止迭代(只能往后走不能往前退) 2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法) 3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象. 迭代:重复做一件事 iterable(可迭代)对象 支持每次返回自己所包含的一个成员的

Python生成器、迭代器、装饰器

Python迭代器 迭代器是访问集合内元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束. 迭代器不能回退,只能往前进行迭代.这并不是什么很大的缺点,因为人们几乎不需要在迭代途中进行回退操作. 常用的迭代方法有 .next()方法 for..in..方法 迭代器通俗的理解就是遍历集合内的所有元素 python生成器 这里先说简单的使用,然后再说自己创建生成器 range:生成一个list range(1,5)结果为:[1,2,3,4] xrange:生成一个x

python之simplejson,Python版的简单、 快速、 可扩展 JSON 编码器/解码器

python之simplejson,Python版的简单. 快速. 可扩展 JSON 编码器/解码器 simplejson Python版的简单. 快速. 可扩展 JSON 编码器/解码器 编码基本的 Python 对象层次结构: import simplejson as json print json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) print json.dumps("\"foo\bar") print json