python cookbook 学习笔记 第四章 迭代器和生成器(16) 迭代器代替while 无限循环

  • 迭代器代替 while 无限循环
  • 问题:
    • 在代码中使用 while 循环来迭代处理数据,因为它需要某个函数或者一般迭代模式中不同的测试条件。能不能用迭代 器来重写这个循环呢?
  • 解决方案:
    • 一个常见的 IO 操作程序可能会像下面这样:
CHUNKSIZE = 8192

def reader(s):
    while True:
        data = s.recv(CHUNKSIZE)
        if data == "b":
            break
        process_data(data)
  • 这种代码通常可以使用 iter() 来代替:
def reader2(s):
    for chunk in iter(lambda: s.recv(CHUNKSIZE),b""):
        pass
  • 下面是一个例子:
import sys
f = open("password.txt")
for chunk in iter(lambda: f.read(10), " "):
    n = sys.stdout.write(chunk)
  • 讨论:iter 函数一个鲜为人知的特性是他接受一个可选的 callable 对象和一个标记(结尾)值作为输入参数。所以 以这种方式使用的时候,它会创建一个迭代器,这个迭代器会不断调用 callable 对象直到返回值和标记值相等为止。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值