itertools.repeat(object [,times])如何在运行时选择性地设置times选项?

时间:2018-07-20 13:37:22

标签: python

我有一个循环:

for x in itertools.repeat(1)

根据cmd行参数,我需要将此值设置为无穷大或x次。

所以

for x in itertools.repeat(1)

或这个

for x in itertools.repeat(1, x)

我该怎么做?

4 个答案:

答案 0 :(得分:0)

itertools.repeat返回一个可迭代对象,因此您可以执行以下操作:

import sys
import itertools

if len(sys.argv) > 1:
    repeater = itertools.repeat(1, int(sys.argv[1]))
else:
    repeater = itertools.repeat(1)

for x in repeater:
    print x

sys.argv是cli输入; argv[0]将始终是脚本名称,因此我假设argv[1]将是您的输入。

答案 1 :(得分:0)

它是Python,因此您可以执行以下操作:如果要测试的对象是myCondition(例如a == 2),则:

myIterator = itertools.repeat(1) if myCondition else itertools.repeat(1, x)

for x in myIterator:
    do-something

答案 2 :(得分:0)

您可以使用HtmlEncoder代替第二个参数来限制数量 退回的商品。

islice

如果import argparse import itertools p = argparse.ArgumentParser() p.add_argument("--count", type=int, default=None) args = p.parse_args() ones = itertools.repeat(1) for x in itertools.islice(ones, args.count): ... 的{​​{1}}参数为stop,则没有上限 切片中项目的数量。


我很惊讶islice本身确实 不接受None以显式触发默认行为。我提交了bug report;我们将查看维护者是否也认为它是错误。

答案 3 :(得分:0)

这里有一个快速的单线解决方案,它非常紧凑,我想重复无数次或仅重复一次,您可以使用此方法:

itertools.repeat(my_object, *([] if my_condition else [1]))

[]情况下不会进行参数扩展,因此您将获得None的效果,您可以根据文档以及对函数目的的合理理解(在我看来)

否则,[1]将扩展为times=1,您可以将1替换为所需的任何值。

times=None会更干净一些,但实际上,维护者不想要它(https://bugs.python.org/issue34169)。