聊聊Python中晦涩的生成器(yield)与生成器表达式

晦涩的生成器yield
刚开始接触Python的时候感觉很清爽,入门很简单,但后边学到生成器和协程的时候就感觉有些吃力了,是时候深入的学习一下了。
什么是生成器?
书上说:函数使用yield可以定义生成器对象,那么包含yield的函数主是一个生成器函数,它可以生成一个序列,方便迭代中使用,__next__()#python3中的特殊方法,应该避免使用特殊方法,next(c)使用内置函数next()即可。
def countdown(n):
print("Counting down from %s" % n)
while n > 0:
yield n
n -= 1
return
c = countdown(10)
print(c.__next__())#python3中的特殊方法,应该避免使用特殊方法
print(next(c))#使用内置函数next()
for i in c :
print(i,end=' ')
函数对象调用.__next__()函数时开始执行语句,遇到yield语句时停止。可以使用循环来操作生成器。
调用close()方法关闭未使用完的生成器。
那么问题来了,yield到底是什么?
我们把上边的代码稍加变化:
def countdown1(n):
print("Counting down from %s" % n)
while n > 0:
yield n*n
n -= 1
return
c = countdown1(10)
print(next(c))
print(next(c))
print(next(c))
for i in c :
print(i,end=' ')
运行之后我们可以发现程序运行到yield的时候返回了一个值,那么yield和return在功能上有些相似。
生成器表达式
如果你对列表推导有些了解,你会发现,生成器表达式只不过是把列表的[]换成了元组的(),但列表推导返回的是一个结果集,而生成器表达式返回的是一个生成器。 因为这个特点,我们可以通过流方式访问一个巨大的文件而不必把它直接加载到内存,这样很大的提高了程序的性能。
代码如下:
print('')
print("生成器表达式:")
b = (x*x for x in range(10) if (x % 2 ==0))
print(next(b))
print(next(b))
for i in b :
print(i, end=' ')
本文源码下载:
标签: Python基础
相关文章
- 解决错误 ERROR [WinError 10049] 在其上下文中,该请求的地址无效。
- 如何在Python程序中使用配置文件.ini(ConfigParser)
- Python os.mknod 运行报错无法创建文件
- Python os.path.dirname(__file__) 在终端命令行下报错
- 聊聊Python中的递归与快速排序那点事
- 妙用IPython学习Python--IPython快速上手
- Python生成器yield应用实例——监控日志
- 如何快速的复习学习过的Python
- python中导入不同目录中的自定义模块/class/函数/方法
- 浅谈Python中的协程及利用协程代替多线程及多进程并发编程
- Python中创建TCP服务器与客户端进行通信(下)Tk、thread与socket组合。
- Python中创建TCP服务器与客户端进行通信(上)
- Python程序在Windows10终端运行中文乱码解决方法
- 你与黑客之间差了多少行Python代码?
- 聊聊Python闭包(Closure)的那点事。
- Python并发编程(下)功能强大设置简单的分布式多进程生产者与消费者模式
- Python并发编程(上)进程模块multiprocessing模块和Process类
- Python多线程编程(下)多线程锁 threading.Lock
- Python多线程编程(上)多线程创建的几种方法
- python 类的静态方法和类方法
- Python面向对象编程(OOP)初探
- Python random 随机数模块操作总结
- Python3 datetime模块的时间操作
- python3函数学习笔记简单总结
- PythonINI配置文件读写的简单方法
- Python open()函数文件打开、读、写操作总结
- Python os.path模块中一些常用方法的整理总结
- Python 采集数据三步曲之[Requests + re.py模块进行数据采集]
- Python 采集数据三步曲之[Requests开源协议的HTTP 库]
- Python 采集数据三步曲之[正则表达式 re.py]
- python3 Markdown模块解析Markdown代码
- 创建python 虚拟环境 venv