Pythonic方式默认循环计数器

Ric*_*ann 1 python counter for-loop python-3.x

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

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()
Run Code Online (Sandbox Code Playgroud)

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

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.')
Run Code Online (Sandbox Code Playgroud)

现在我有这样的感觉,检查UnboundLocalError一个有点奇怪,所以我考虑默认计数器:

def process_items(items):
    count = -1

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

    print('Processed', count + 1, 'items.')
Run Code Online (Sandbox Code Playgroud)

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

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

Jim*_*ard 6

我认为不存在最佳实践.我会做什么(为了不初始化-1,然后需要做的count + 1)被设定enumeratestart1:

def process_items(items):
    count = 0    
    for count, item in enumerate(filter_items(items), start=1):
        item.do_stuff()

    print('Processed', count, 'items.')
Run Code Online (Sandbox Code Playgroud)

这让清楚地知道发生了什么.(注意,start=1可以写1).

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