python哨兵循环_关于python:使用iter()和哨兵替换while循环

本文介绍了如何在Python中使用iter()和哨兵来代替while循环实现更pythonic的无限循环。通过示例展示了如何在找到特定条件时终止循环,如找到等于n的随机整数。同时,讨论了当需要更复杂的通用布尔条件时,iter()可能无法满足需求,而itertools.takewhile()可以作为一个更好的选择。此外,还涉及了Python中的partial函数和itertools模块的使用。
摘要由CSDN通过智能技术生成

通常情况下,需要无限循环直到达到某种条件。 例如,如果我想继续收集随机整数,直到找到一个== n的数字,然后我将其破坏。 我会这样做:

import random

rlist = []

n = ...

low, high = ..., ...

while True:

num = random.randint(low, high)

if num == n:

break

rlist.append(num)

这行得通,但是很笨拙。 使用iter还有更多的pythonic替代方法:

iter(o[, sentinel])

Return an iterator object. The first argument is

interpreted very differently depending on the presence of the second

argument. [...] If the second argument,

sentinel, is given, then o must be a callable object. The iterator

created in this case will call o with no arguments for each call to

its next() method; if the value returned is equal to sentinel,

StopIteration will be raised, otherwise the value will be returned.

上面的循环可以替换为

import random

from functools import partial

f = partial(random.randint, low, high)

rlist = list(iter(f, 10))

为了将此原则扩展到已经创建的列表,需要进行一些更改。 我需要定义这样的部分函数:

f = partial(next, iter(x)) # where x is some list I want to keep taking items from until I hit a sentinel

其余部分保持不变,但是与while循环相比,此方法的主要警告是我无法应用通用布尔条件。

例如,我不能应用"生成数字,直到遇到第一个大于1000的偶数"。

底线是:while循环和iter是否有另一种支持回调哨兵的方法?

为什么while循环"笨拙"?

谁在不加解释地投票? 上课吗

它有点笨重和老式。 我没有反对它。 只是想探索其他选择。 此外,将不满意落选者的评论。 希望有机会纠正任何错误。

如果需要通用布尔条件,则iter(object, sentinel)不能充分满足您的需求。 相反,itertools.takewhile()似乎或多或少是您想要的:它需要一个迭代器,并在给定谓词停止为真时将其切断。

rlist = list(itertools.takewhile(lambda x: x >= 20, inputlist))

顺便说一句,partial并不是Python语言,itertools也不是。 GvR被记录为不喜欢高阶函数式编程(请注意,将reduce从内置降级为3.0中的模块成员)。 旁观者认为"典雅"和"可读"之类的属性,但是如果您从最纯粹的意义上寻找Pythonic,则需要while循环。

辉煌。 这正是我想要的。 一个iter能够接受回调作为标记。 我会的时候接受。

@Sneftel partial被添加为GvR尝试摆脱lambda的一部分。 itertools实现流处理,该流处理与功能编程有密切关系,但不是同一件事。 两者都不都是非Python语言的,只是不被认为对核心语言至关重要。

(不过,itertools的某些部分正在转移到核心语言。例如,内置的map和filter替换了itertools.imap和itertools.ifilter。)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值