python中for循环迭代的本机计数器

时间:2014-02-24 16:51:18

标签: python

当我在python中迭代迭代时,我曾经通过在循环外创建一个迭代器并在其中递增来跟踪我在迭代中的位置或多或少:

i = 0
for x in res:
    if not(i % 10):
        print("On count {}".format(unicode(i)))
    f(x)
    i +=1

所以,在我的6行循环中,其中4行专用于计数器i。

我知道我也可以使用enumerate:

for i,x in enumerate(res):
    if not(i % 10):
        print("On count {}".format(unicode(i)))
    f(x)

节省2行。

我想知道是否有/仍然/更简洁的方法来处理这个并在某个循环间隔向用户提供漂亮的反馈。我怀疑__iter__内置了一些内容,以便我的x可以调用某种计数? x.___count___或类似我甚至不需要枚举的内容?

此外,是否有人建议以更具功能性的方式提供此类反馈?我如何将这个计数器嵌入到地图中,而不是for-loop?

3 个答案:

答案 0 :(得分:4)

enumerate绝对是这样做的正确方法。

  1. 每个python程序员都知道enumerate。它是内置的,其意图立即显而易见。如果可能的话,总是选择内置。

  2. enumerate将您的疑虑分开。走一个集合并计算迭代是不同的有用函数,可以在不同的上下文中重用。

  3. enumerate强制显式声明计数器变量。如果你打算使用它,这会打败__count__的地狱,这是窗帘背后产生的一个神秘属性。让enumerate的唯一事实告诉读者迭代索引很重要。

  4. 转到enumerate

答案 1 :(得分:1)

enumerate是您完成所做工作的最佳和最广泛使用的方式。如果要将函数映射到iterables,您可以始终使用列表推导或map函数,尽管列表理解通常在我的经验中更有效。因此,如果您想将所有10个更改为列表中的字符串:

>>> l = list(range(1, 100))
>>> ['a ten!' if i % 10 == 0 else v for i, v in enumerate(l)]
['a ten!', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'a ten!', 12, 13, 14, 15, 16, 17, 18, 19, 20, 'a ten!', 22, 23, 24, 25, 26, 27, 28, 29, 30, 'a ten!', 32, 33, 34, 35, 36, 37, 38, 39, 40, 'a ten!', 42, 43, 44, 45, 46, 47, 48, 49, 50, 'a ten!', 52, 53, 54, 55, 56, 57, 58, 59, 60, 'a ten!', 62, 63, 64, 65, 66, 67, 68, 69, 70, 'a ten!', 72, 73, 74, 75, 76, 77, 78, 79, 80, 'a ten!', 82, 83, 84, 85, 86, 87, 88, 89, 90, 'a ten!', 92, 93, 94, 95, 96, 97, 98, 99]

您可以对map执行相同操作:

>>> map(lambda x: 'a ten!' if x[0] % 10 == 0 else x[1], enumerate(l))
['a ten!', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'a ten!', 12, 13, 14, 15, 16, 17, 18, 19, 20, 'a ten!', 22, 23, 24, 25, 26, 27, 28, 29, 30, 'a ten!', 32, 33, 34, 35, 36, 37, 38, 39, 40, 'a ten!', 42, 43, 44, 45, 46, 47, 48, 49, 50, 'a ten!', 52, 53, 54, 55, 56, 57, 58, 59, 60, 'a ten!', 62, 63, 64, 65, 66, 67, 68, 69, 70, 'a ten!', 72, 73, 74, 75, 76, 77, 78, 79, 80, 'a ten!', 82, 83, 84, 85, 86, 87, 88, 89, 90, 'a ten!', 92, 93, 94, 95, 96, 97, 98, 99]

答案 2 :(得分:1)

我能想到的唯一方法是组合它们,就是编写一个生成器,然后进行打印。整个代码行是相同的,但您可以编写一次并多次使用它:

def status_generator(iterable, update_interval=10):
    for i, x in enumerate(iterable):
        if not (i % update_interval):
            print("On count {}".format(unicode(i)))
        yield x

map(f, status_generator(my_iterable))