[Python]使用生成器来简化代码
原本只是大概知道生成器是什么,但一直不知道怎么用,或是什么情景下用,后来才发现:
在需要一边读数据一边处理任务时,如果直接为每个任务都写一个函数,那么读数据的部分就要在每个函数都重复一遍
- 直接将所有任务都写在一起不现实,尤其是当任务比较多时,一旦有时候忘记注释某个任务,可能会影响之后的任务
之后突然想到 yield 这个python关键字,可以将读数据的部分抽出来,写作一个生成器,在任务函数的部分只需用for循环逐个访问即可
简要理解:
yield : 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始。
不同于return,一旦return则意味着函数已经执行完毕,而yield则只是暂时停在这里,之后当再次调用这个函数时会返回下一个迭代值。
下面给出用生成器的例子
#An example for using generator
'''
Not using generator, just repeating the file reading operation at every function.
'''
#write an extra 'hello' at each line in file 'f_source', then save it to file 'f_target'
def write_extra(f_source):
f_target = 'target.txt'
with open(f_source, 'r') as source, open(f_target, 'w') as target:
for line in source.readlines():
target.write(line+'hello'+'\n')
#parse each line in file 'f_source'
#the simplest way is just print it out..
def parse_line(f_source):
with open(f_source, 'r') as source:
for line in source.readlines():
line = line.strip().split()
print(line) #print line as a list split by char ' '
'''
Using generator
'''
def read_file(f_source):
with open(f_source, 'r') as source:
for line in source.readlines():
yield line
def new_parse_line(f_source):
for line in read_file(f_source):
line = line.strip().split()
print(line)
def new_write_extra(f_source):
f_target = 'target.txt'
with open(f_target, 'w') as target:
for line in read_file(f_source):
target.write(line+'hello'+'\n')
[Python]使用生成器来简化代码的更多相关文章
- Python文件操作之简化代码
一朝误入此门中,从此红尘了如空.... 程序这条路,当真是路漫漫... 这两天找到一本书,名为<笨方法学Python第三版>,全实例,感觉挺好的.需要的点书名下载, 密码:gmpn 今天想 ...
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- Python——五分钟带你弄懂迭代器与生成器,夯实代码能力
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是周一Python专题,给大家带来的是Python当中生成器和迭代器的使用. 我当初第一次学到迭代器和生成器的时候,并没有太在意,只是觉 ...
- Python :编写条件分支代码的技巧
『Python 工匠』是什么? 我一直觉得编程某种意义是一门『手艺』,因为优雅而高效的代码,就如同完美的手工艺品一样让人赏心悦目. 在雕琢代码的过程中,有大工程:比如应该用什么架构.哪种设计模式.也有 ...
- Python 中生成器的原理
生成器的使用 在 Python 中,如果一个函数定义的内部使用了 yield 关键字,那么在执行函数的时候返回的是一个生成器,而不是常规函数的返回值. 我们先来看一个常规函数的定义,下面的函数 f() ...
- python中和生成器协程相关的yield from之最详最强解释,一看就懂(四)
如果认真读过上文的朋友,应该已经明白了yield from实现的底层generator到caller的上传数据通道是什么了.本文重点讲yield from所实现的caller到coroutine的向下 ...
- python中和生成器协程相关yield from之最详最强解释,一看就懂(二)
一. 从列表中yield 语法形式:yield from <可迭代的对象实例> python中的列表是可迭代的, 如果想构造一个生成器逐一产生list中元素,按之前的yield语法,是在 ...
- python中和生成器协程相关的yield之最详最强解释,一看就懂(一)
yield是python中一个非常重要的关键词,所有迭代器都是yield实现的,学习python,如果不把这个yield的意思和用法彻底搞清楚,学习python的生成器,协程和异步io的时候,就会彻底 ...
- Python的生成器进阶玩法
Python的生成器进阶玩法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.yield的表达式形式 #!/usr/bin/env python #_*_coding:utf-8 ...
随机推荐
- Oracle 双机热备+双机冷备+负载均衡
引用地址:https://wenku.baidu.com/view/7cca62f1ddccda38366baf7f.html SQL Server 2008 R2双机热备 引用地址:https:// ...
- Jmeter怎么搭建环境
1.JDK检查与安装 cmd输入命令:java -version -- 检查主机是否安装了JDK JDK下载官网:https://www.oracle.com/technetwork/java/j ...
- python27期尚哥讲TCP:
TCP:传输控制协议(使用情况多于udp) 稳定:保证数据一定能收到 相对UDP会慢一点 web服务器一般都使用TCP(银行转账,稳定比快要重要)TCP通信模型: 在通信之前,必须先等待建立链接 TC ...
- MySQL 字符集与比较规则
MySQL 字符集与比较规则 由于 MySQL 客户端与服务端之间通信时需要将字符串编码传输,所以不可避免会产生编码转换 字符集 MySQL 中 utf8 就是 utf8mb3,只使用 1-3 个字节 ...
- 设计模式-单例模式(Singleton) (创建型模式)
//以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Singleton.h #pragma once #include<iostream> class Sin ...
- 开发者必备Linux命令
开发者必备Linux常用命令,掌握这些命令绝对够了,基于CenterOS7.6. 系统服务管理 systemctl 输出系统中各个服务的状态: systemctl list-units --type= ...
- 修改gradle中央仓库,加快jar包下载速度
打开gradle项目的build.gradle文件 找到repositories,注释掉mavenCentral(),使用阿里云的仓库地址 repositories { //mavenCentral( ...
- windows端口转发工具(LCX)
端口转发(Port forwarding),有时被叫做隧道,是安全壳(SSH) 为网络安全通信使用的一种方法.端口转发是转发一个网络端口从一个网络节点到另一个网络节点的行为,其使一个外部用户从外部经过 ...
- Office Online Server 在线编辑Office文档,安装部署
Office Online Server部署安装 部署环境 一台windows server2012 (搭建域环境)/多次遇坑之后,强烈建议域环境为server2012 一台windows serve ...
- Linux socket program Demo1(client & server)
client and server Demo of socket. client send data to server. server send data to client. // this ...