Python 2.7 Python列表理解和条件顺序
以下列表理解之间是否存在差异: 一, 二,Python 2.7 Python列表理解和条件顺序,python-2.7,Python 2.7,以下列表理解之间是否存在差异: 一, 二, 简短的回答不,长的回答稍微 当你写下如下内容时: f = [(x,y) for x in range(a) if x > 0 for y in range(b)] f = [(x,y) for x in range(a) for y in range(b) if x > 0] 然后您可以将其重写为以下内容,我将其称为p1: for x in range(a): if (x > 0): for y in ra
简短的回答不,长的回答稍微 当你写下如下内容时:
f = [(x,y) for x in range(a) if x > 0 for y in range(b)]
f = [(x,y) for x in range(a) for y in range(b) if x > 0]
然后您可以将其重写为以下内容,我将其称为p1:
for x in range(a):
if (x > 0):
for y in range(b):
f.append((x, y))
print f
当你写下如下内容时:
f = [(x,y) for x in range(a) if x > 0 for y in range(b)]
f = [(x,y) for x in range(a) for y in range(b) if x > 0]
然后您可以将其重写为以下内容,我将其称为p2:
for x in range(a):
for y in range(b):
if (x > 0):
f.append((x,y ))
print f
我这样重写是因为它更容易理解
我应该注意到,我不建议在for循环中使用for循环,因为处理代码变得越来越困难,只在确实需要的时候使用它
在p1中,它将在运行下一个for循环之前检查x是否大于0
这样做的好处是,如果x>0,您甚至不必运行流程的其余部分,从而节省了时间。它不会检查y的新值,因为您告诉它它没有必要
p2必须先运行这两个for循环,然后才能决定x是否大于0。这不如p1有效
关键区别在于p1应该比p2更有效,因为它节省时间。最后,它们都给出了相同的结果
p1中发生的情况称为短路。但这并不像在电子领域那样是件坏事。短路只是意味着要进行布尔检查,以确定是否有必要对语句的其余部分求值
让我们假设我们必须使用布尔值x和y。x设置为false,而y设置为true。我们可以评估以下陈述:
if x && y:
print 'Hello World!'
if y || x:
print 'Hello World!'
&&和运算符首先检查x是否为真。如果x为false,则没有理由继续,因为&&运算符要求这两条语句都为true。我们在这里短路,因此不计算y,也不运行打印功能
让我们再次使用相同的布尔值。我们可以评估以下陈述:
if x && y:
print 'Hello World!'
if y || x:
print 'Hello World!'
因为y的计算结果为true,所以它不会计算x。| |运算符只需要一个true boolean语句,因为y为true,所以它不会计算x
这有一个很好的特性,我们可以在操作符的右侧“隐藏”语句。如果正确的语句可能会使程序崩溃(如sqrt-1,其中-1是用户输入),这将非常好
如果您想阅读更多关于短路评估的内容,那么您可以阅读更多关于短路评估的内容