Pythonic方式默认循环计数器

时间:2017-10-06 08:25:43

标签: python python-3.x for-loop counter

我有时会使用生成器来过滤程序中的某些值,并希望记录过滤后的项目 我们假设:

def filter_items(items):
    for item in items:
        if item.is_wanted():
            yield item

def process_items(items):
    for item in filter_items(items):
        item.do_stuff()

现在我的问题是我想记录,实际调用了多少过滤的项目 目前我这样做:

def process_items(items):
    for count, item in enumerate(filter_items(items)):
        item.do_stuff()

    try:
        count += 1
    except UnboundLocalError:
        count = 0

    print('Processed', count, 'items.')

现在我有一种感觉,检查一个UnboundLocalError有点奇怪,所以我认为违反了计数器:

def process_items(items):
    count = -1

    for count, item in enumerate(filter_items(items)):
        item.do_stuff()

    print('Processed', count + 1, 'items.')

然而,将默认计数器设置为-1也看起来很奇怪,因为没有迭代的实际默认值将是0。 但是我无法将其默认为0,因为我无法区分默认值(如果没有迭代元素)或者是否迭代了一个元素。

是否有关于Python中循环计数器默认的最佳实践或指南?

2 个答案:

答案 0 :(得分:6)

我认为不存在最佳做法。我要做的是(为了不初始化为-1然后需要执行count + 1),将enumerate的{​​{1}}值设置为{{1 }}:

start

这清楚地表明对我来说正在发生什么。 (请注意,1只能写成def process_items(items): count = 0 for count, item in enumerate(filter_items(items), start=1): item.do_stuff() print('Processed', count, 'items.') )。

请注意,是的,这不是最明确的方法(参见Stefan的回答)。由于你确实知道在循环之后for循环目标是可见的,你应该没问题。

答案 1 :(得分:4)

不确定您使用enumerate的原因。你不能只增加每个项目的计数器吗?

def process_items(items):
    count = 0
    for item in filter_items(items):
        item.do_stuff()
        count += 1
    print('Processed', count, 'items.')