python中的for/empty循环条件

python中的for/empty循环条件,python,for-loop,python-2.7,Python,For Loop,Python 2.7,在Django模板中,For loop具有一个empty条件,该条件仅在循环对象为空时设置。 e、 g: 您必须坚持使用if语句,但它可以简化: for x in my_list: doSomething() if not my_list: print "my_list is empty" 由于my_list是空的,因此for循环从不执行循环部分,在布尔上下文中,空列表是False。无需使用len(),空列表是错误的。这回答了OP问题,但一般来说,当迭代对象是例如生成器时,这将

在Django模板中,
For loop
具有一个
empty
条件,该条件仅在循环对象为空时设置。 e、 g:


您必须坚持使用
if
语句,但它可以简化:

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

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

无需使用
len()
,空列表是错误的。这回答了OP问题,但一般来说,当迭代对象是例如生成器时,这将不起作用。然后,选项是向循环添加标志或检查
namererror:name“x”未定义,但后者更容易出错。我目前有一个用例,这样的
empty
块可以解决我的问题,并使代码更加地道。@WloHu:对于生成器,事先无法知道它们是否将是空的。您可以选择查看(获取一个元素,如果失败,将其视为空,如果成功,可能使用
itertools.chain([peek\u element],generator)
将元素循环回中),或者通过设置
for
循环目标名称来检测这种情况(例如,在我的答案中的循环中设置
x
)在循环之前设置一个sentinel值,如
None
,然后测试变量是否仍在循环之后引用sentinel。只有当生成器为空且从不生成sentinel对象时,该条件才仍然为真。@WloHu:对于这个问题,如果对象显然是一个列表(
my_list
作为变量名),则无需将事情弄得那么复杂。
if len(my_list):
   for x in my_list:
       doSomething()
else:
    print "my_list is empty"
for x in my_list:
    doSomething()
if not my_list:
    print "my_list is empty"