内建函数iter(),第三个参数哨兵用法
循环读取文件常见写法
CHUNKSIZE=8192
def reader(s):
while True:
data = s.recv(CHUNKSIZE)
if data == b'':
break
process_data(data)
iter()写法
def reader(s):
for chunk in iter(lambda: s.recv(CHUNKSIZE), b''):
process_data(data)
测试
import sys
f = open('/etc/passwd')
for chunk in iter(lambda: f.read(10), ''):
n = sys.stdout.write(chunk)
讨论
关于内建函数iter(),一个少有人知的特性是它可以选择性接受一个无参的可调用对象
以及一个哨兵(结束)值作为输入。当以这种方式使用时,iter()会创建一个迭代器,
然后重复调用用户提供的可调用对象,直到它返回哨兵值为止。
这种特定的方式对于需要重复调用函数的情况,比如这些涉及I/O 的问题,有很好的效
果。比如,如果想从socket 或文件中按块读取数据,通常会重复调用read()或者recv(),
然后紧跟着检测是否到达文件结尾。而我们给出的解决方案简单地将这两个功能合并
为一个单独的iter()调用。解决方案中对lambda 的使用是为了创建一个不带参数的可调
用对象,但是还是可以对recv()或read()提供所需要的参数。
其它示例
from functools import partial
RECORD_SIZE = 32
with open("somefile.data", 'rb') as f:
records = iter(partial(f.read, RECORD_SIZE), b'')
for r in records:
讨论
关于iter()函数,一个少有人知的特性是,如果传递一个可调用对象及一个哨兵值给它,那么它
可以创建一个迭代器。得到的迭代器会重复调用用户提供的可迭代对象,直到返回的值为哨兵值
为止,此时迭代过程停止。
functools.partial用来创建可调用对象,每次调用它时都从文件中读取固定的字节数。b''在这里
用作哨兵值,当读取到文件结尾时就会返回这个值,此时迭代过程结束。
内建函数iter(),第三个参数哨兵用法的更多相关文章
- Mongo第三个参数的用法
Mongo update的用法 Update( array $criteria , array $new_object [, array $options = array() ] ) 第一个参数是条件 ...
- in_array支持第三个参数,强制对数据类型检测
in_array函数是判断数据中是否存在指定的内容了,对于这个函数用法非常的简单但在使用过程中会我发现有一些问题. 先介绍一下需求背景: 发票方式: 0=捐赠(不要问我为什么,历史原因) 1=对中寄送 ...
- linux dmesg命令参数及用法详解(linux显示开机信息命令)
linux dmesg命令参数及用法详解(linux显示开机信息命令) http://blog.csdn.net/zhongyhc/article/details/8909905 功能说明:显示开机信 ...
- 为什么需要main函数,及其参数的用法
首先,需要明确main函数是什么? 答:main函数是C语言约定的入口函数 C99标准里面是这样描述的: Program startup The function called at program ...
- Android LayoutInflater.inflate()的参数及其用法
很多人在网上问LayoutInflater类的用法,以及inflate()方法参数的含义,现解释如下: inflate()的作用就是将一个用xml定义的布局文件查找出来,注意与findViewById ...
- setInterval()、clearInterval()、setTimeout()和clearTimeout() js计数器方法(还有第三个参数)
用法是会用,但是之前一直以为接函数的 var a = setInterval(function(){},1000) 比如a是函数名,最近才发现它是一个ID, var intervalID = wind ...
- java语言中public、private、protected三个关键字的用法,重写和重载的区别。
java语言中public.private.protected三个关键字的用法,重写和重载的区别. 解答: 作用域 当前类 同包 子类 其它 public √ √ √ √ protected √ √ ...
- Redis搭建(三):哨兵模式
一.sentinel介绍 Redis 2.8中提供了“哨兵”工具来实现自动化的系统监控和故障恢复功能. Redis 2.6 版也提供了哨兵工具,但此时的哨兵是1.0版,存在非常多的问题,任何情况下都不 ...
- 【工作中学习2】Map的使用及排序(第三个参数)
项目进行中,使用到Map(std::map),Map要点整理如下: 1. Map,也叫关联数组,提供key/value(键/值对),key用来索引,value是被存储和检索的数据. 2. key值唯一 ...
- (转)linux traceroute命令参数及用法详解--linux跟踪路由命令
linux traceroute命令参数及用法详解--linux跟踪路由命令 原文:http://blog.csdn.net/liyuan_669/article/details/25362505 通 ...
随机推荐
- Docker镜像精简方法之二 COPY vs ADD 与镜像层
Docker镜像精简方法之二 COPY vs ADD 与镜像层 摘要 昨天只是讲了一下大体的思路. 但是没有实操. 今天想着修改一下默认的打包镜像的命令,验证一下效果 原始命令 FROM adopto ...
- [转帖]关于Nacos默认token.secret.key及server.identity风险说明及解决方案公告
https://nacos.io/zh-cn/blog/announcement-token-secret-key.html 近期Nacos社区收到关于Nacos鉴权功能通过token.secret. ...
- [转帖] 使用uniq命令求并集交集差集
原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. uniq# uniq是linux上非常有用的一个命令,从字面意思上就能看出来,它可以用来去重. 但使用uniq的前提 ...
- 【转载】Linux常用命令大全(非常全!!!)
[转载]Linux常用命令大全(非常全!!!) https://www.cnblogs.com/purple5252/p/11870584.html Linux常用命令大全(非常全!!!) 最近都在和 ...
- MySQL批量执行SQL修改视图属主的办法
前人挖坑 后人填坑 Study From https://blog.csdn.net/carefree2005/article/details/109812943 第一步: 形成SQL select ...
- clickhouse 优化实践,万级别QPS数据毫秒写入和亿级别数据秒级返回 | 京东云技术团队
1.背景 魔笛活动平台目前在采集每个活动的用户行为数据并进行查询,解决线上问题定位慢,响应不及时的问题,提升客诉的解决效率.目前每天采集的数据量5000万+,一个月的数据总量15亿+,总数据量40亿+ ...
- 【解决一个小问题】golang 的 `-race`选项导致 unsafe代码 panic
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 为了提升性能,使用 unsafe 代码来重构了凯撒加密的代 ...
- C# 输入指定日期获取当前年的第一天 、当前年的最后天、某月的第一天 、某月的最后一天
方法 /// <summary> /// 取得当前年的第一天 /// </summary> /// <param name="datetime"> ...
- Windows上部署Python flask项目
最近使用Python flask做了一个项目要部署,网上一大堆教程没有一个完整,最后看了多个教程才配置完成,下面根据自己的环境整理一下做个备忘录 环境: Windows 10 apache httpd ...
- Vue核心概念与其指令
Vue简述 Vue是一套构建用户UI界面的前端框架. 构建用户界面的意思是:往html中填充数据,框架的意思是:一套开发规范. Vue的特点 1.数据驱动视图 当页面是一个普通的数据展示时,数据改 ...