for python中的/ empty循环条件

Cra*_*ezy 1 python for-loop python-2.7

在Django模板,For loop有一个empty它获取只设置当您遍历对象是空的条件.例如:

{% for x in my_list %}
    #do something
{% empty %}
   <p>  my_list is empty </p>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 5

你必须坚持使用if声明,但它可以简化:

for x in my_list:
    doSomething()
if not my_list:
    print "my_list is empty"
Run Code Online (Sandbox Code Playgroud)

因为它my_list是空的,所以for循环从不执行循环部分,而空列表False在布尔上下文中.

  • 这回答了 OP 问题,但一般来说,当迭代对象是例如生成器时,这将不起作用。然后选项是添加标志到循环或检查`NameError: name 'x' is not defined` 但后者更容易出错。我目前有一个用例,其中这样的“空”块可以解决我的问题并使代码更加地道。 (5认同)
  • @WloHu:对于生成器,无法预先知道它们是否为空。您的选择是偷看(获取一个元素,如果失败,则将其视为空,如果成功,也许使用 `itertools.chain([peeked_element], generator)` 将元素循环回),或检测这种情况在循环之前将 `for` 循环目标名称(例如,我的答案中循环中的 `x`)设置为像 `None` 这样的标记值,然后在循环之后测试变量是否仍在引用标记。只有当生成器为空并且从不产生哨兵对象时,该条件仍然为真。 (4认同)
  • @WloHu:对于*这个问题*,对象显然是一个列表(`my_list` 作为变量名),但是没有必要使事情变得复杂。 (4认同)