迭代器代替 while 无限循环

问题

你在代码中使用 while 循环来迭代处理数据,因为它需要调用某个函数或者和一般迭代模式不同的测试条件。能不能用迭代器来重写这个循环呢?

解法

一个常见的 IO 操作程序可能会想下面这样:

CHUNKSIZE = 8192
def reader(s):while True:data = s.recv(CHUNKSIZE)if data == b'':breakprocess_data(data)

这种代码通常可以使用 iter() 来代替,如下所示:

def reader2(s):for chunk in iter(lambda: s.recv(CHUNKSIZE), b''):pass# process_data(data)

如果你怀疑它到底能不能正常工作,可以试验下一个简单的例子。比如:

>>> import sys
>>> f = open('/etc/passwd')
>>> for chunk in iter(lambda: f.read(10), ''):
...     n = sys.stdout.write(chunk)
...
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
...
>>>

讨论

iter 函数一个鲜为人知的特性是它接受一个可选的 callable 对象和一个标记 (结尾) 值作为输入参数。当以这种方式使用的时候,它会创建一个迭代器,这个迭代器会不断调用 callable 对象直到返回值和标记值相等为止。

这种特殊的方法对于一些特定的会被重复调用的函数很有效果,比如涉及到 I/O调用的函数。举例来讲,如果你想从套接字或文件中以数据块的方式读取数据,通常你得要不断重复的执行 read() 或 recv() ,并在后面紧跟一个文件结尾测试来决定是否终止。这节中的方案使用一个简单的 iter() 调用就可以将两者结合起来了。其中lambda 函数参数是为了创建一个无参的 callable 对象,并为 recv 或 read() 方法提供了 size 参数。

《Python Cookbook 3rd》笔记(4.16):迭代器代替 while 无限循环相关推荐

  1. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  2. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  3. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  4. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  5. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  6. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  7. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  8. 《Python cookbook》笔记一

    <Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...

  9. 《Python Cookbook 3rd》笔记(4.7):迭代器切片

    迭代器切片 问题 你想得到一个由迭代器生成的切片对象,但是标准切片操作并不能做到. 解法 函数 itertools.islice() 正好适用于在迭代器和生成器上做切片操作.比如: >>& ...

最新文章

  1. 一个丧心病狂的Github项目:东北话编程,大写的服!
  2. 一家全是学霸!王力宏的哥哥也是博士,近日获5000余万拨款用于这项研究
  3. playframework学习笔记1 -- 开发环境和第一个工程
  4. python垃圾分类源代码_Python学习:怕乱丢垃圾罚款?使用 Python 轻松完成垃圾分类...
  5. Python极简入门:数据类型、条件语句、循环语句、异常处理
  6. 局域网网络风暴检测工具_二层网络结构和三层网络结构的对比
  7. Silverlight 应用 WCF RIA Services 在 IIS6 部署问题总结
  8. 十年总结,一个JAVA人的十年人生路
  9. 动态规划-01背包问题详解
  10. 二叉搜索树(BST树)的简单实现
  11. 服务器预装操作系统,服务器预装操作系统吧
  12. 记录远程桌面登录者的IP和MAC
  13. 论坛模板php,php论坛
  14. springboot 整合 mvc 配置外部静态资源
  15. image 第二次使用就出错是怎么回事_第二次上机报告-RNA-seq (HISAT - SAMtools- StringTie - ballgown)amp;amp;Gene-Assembly
  16. 主板找不到SSD解决一例
  17. 机器学习之网格搜索(GridSearch)及参数说明,实例演示
  18. PHP完全自学手册01.pdf
  19. 海思3518E开发笔记1.2——海思SDK脚本学习
  20. windows无法连接到某个wifi_笔记本电脑连接wifi时一直显示“windows无法连接到。。(wifi)”是怎么回事...

热门文章

  1. 《计算机应用》实践考核,《管理系统中计算机应用》实践性环节考核方案
  2. 在哪个Linux发行版上运行python,怎么在linux上运行python
  3. python gif_python 将png图片格式转换生成gif动画
  4. 根据rtk参数在arcgis中进行可视化
  5. 一步步编写操作系统 26 打开A20地址线
  6. opencv获取图片像素坐标_利用OpenCV从图片中提取矩形并标注坐标(室内平面地图)(一)
  7. Qt undefined reference to,Error 255,找不到库函数的解决办法
  8. Python3 爬虫实战 — 模拟登陆哔哩哔哩【滑动验证码对抗】
  9. 玩转Mybatis —— 一个小demo,带你快速入门Mybatis
  10. bat 脚本清空窗口内容_tomcat9.0启动脚本startup.bat的分析