Python中的for/empty循环条件是什么?

12
在Django模板中,For循环有一个empty条件,只有在您正在循环的对象为空时才会设置。 例如:
{% for x in my_list %}
    #do something
{% empty %}
   <p>  my_list is empty </p>
{% endfor %}

如果my_list是空的,那么它将只打印my_list is empty

Python中是否有类似的东西?

我正在使用if-else条件,但这看起来很丑。我正在尝试找到一种不涉及使用if-else条件的解决方案。

我当前的代码:

if len(my_list):
   for x in my_list:
       doSomething()
else:
    print "my_list is empty"

不需要使用 len(),一个空列表是假的。 - Wooble
2个回答

21

你必须仍然使用if语句,不过它可以被简化:

for x in my_list:
    doSomething()
if not my_list:
    print "my_list is empty"

由于my_list是空的,for循环从未执行循环部分,而在布尔上下文中,空列表为False


6
这回答了OP的问题,但通常当迭代对象是生成器时,这种方法不起作用。此时的选项是在循环中添加标志或检查NameError: name 'x' is not defined,但后者更容易出错。我目前有一个用例,使用这样的“空”块可以解决我的问题并使代码更符合惯用法。 - WloHu
4
对于生成器来说,没有办法提前知道它们是否为空。您有以下选项:使用peek(获取一个元素,如果失败,则将其视为空,如果成功,则可以使用itertools.chain([peeked_element],generator)将该元素循环回来),或者通过将 for 循环目标名称(例如在我回答中的循环中的 x)设置为类似于 None 的特定值来检测该情况,然后在循环之后测试变量是否仍引用该特定值。只有在生成器为空且从未产生过特定值对象时,该条件才会保持为真。 - Martijn Pieters
4
针对这个问题,由于对象很明显是一个列表(变量名为my_list),所以没有必要让事情变得那么复杂。 - Martijn Pieters

2

如果你确定迭代器不会返回特定的值,比如None或者False,那么你可以:

x = False
for x in my_list:
    doSomething(x)
if x is False:
    print "my_list is empty"

1
让我强调一下,即使my_list是一个迭代器,这也能正常工作。 - am70

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接