[英]For loops and else statements in Python
我在jinja2模板框架中为python使用了一些条件for循环。 我想知道是否有办法在jinja2之外做同样的事情,类似于:
{% for i in a if i == 1 %}
{{ i }}
{% else %}
no items
{% endfor %}
当我在普通的'蟒蛇'中尝试这个时,它不喜欢它
>>> for i in a if i == 1:
SyntaxError: invalid syntax
我希望能做的是这样的:
for i in a if i == 1:
print i
else:
print 'no matches found'
你已经非常接近了,所需要的只是一个列表理解,它形成一个只包含a
等于1的值的列表。
在python中, for..else
语句也是有效的 。
for i in [x for x in a if x == 1]:
print i
else:
print 'no matches found'
这将打印在所有的值a
是1
,除非没有被发现。 然后它打印no matches found
正如davidism所提到的,为了防止对整个列表进行中间评估,您可以使用生成器而不是LC:
for i in (x for x in a if x == 1):
print i
else:
print 'no matches found'
您可以使用带有循环语句的else
块。 如果循环流不受诸如break
的语句的干扰,则它将落入else
块。 我在下面添加了一个简单的素数查找器 :
for n in range(2, 10):
for x in range(2, n):
if n % x == 0:
print n, 'equals', x, '*', n/x
break
else:
# loop fell through without finding a factor
print n, 'is a prime number'
输出:
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
注意:如果将for
/ else
语句与列表推导结合使用for
可以完成所需的操作。 简单的列表理解:
# For generating a list of odd numbers from 1 to 10
[n for n in range(1, 10) if n % 2 == 1]
# Generator version preventing evaluation of the whole list at once.
(n for n in range(1, 10) if n % 2 == 1)
这样你就可以生成一个带有列表iterable
方法的iterable
容器,并使用for
/ else
循环迭代它:
for n in [n for item_container if n == 1]
# Do work
pass
else:
# Loop falls through if the flow isn't disturbed
# Do some other work
pass
编辑:您要问的只是检查元素是否在容器中,然后执行语句。 这非常低效。 使用CPython
set
数据结构(Python最常见的实现)可以更快地完成这项工作。
set
构件检查将在平均和为O(n)在最坏的情况有O(1)( dictionary
也有类似的实现)。 所以下面的代码会快得多 :
element = 9
container = set(range(1, 10))
print("Match Found." if element in container else "Match Not Found.")
有关更多信息,请查看以下
如果您只想要列表中的值:
items = [i for i in a if i == 1]
打印出来,如果没有匹配则包括备注:
for i in items:
print i
if not items:
print 'no matches found'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.