python中嵌套循环的执行顺序[重复]
Posted
技术标签:
【中文标题】python中嵌套循环的执行顺序[重复]【英文标题】:Order of execution in nested loops in python [duplicate] 【发布时间】:2019-09-25 20:21:58 【问题描述】:我无法理解这两个代码块之间的区别,首先正确的是:
number_list=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
prime_list=[]
for i in number_list:
for j in range(2,i):
if i%j==0:
break
else: prime_list.append(i)
print('Primes are:',prime_list)
输出是:
Primes are: [1, 2, 3, 5, 7, 11, 13]
但是在 if 语句下方的块内向前移动 else 语句(我认为这是正确的做法)会导致不同的错误输出:
number_list=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
prime_list=[]
for i in number_list:
for j in range(2,i):
if i%j==0:
break
else: prime_list.append(i)
print('Primes are:',prime_list)
输出是:
Primes are: [3, 5, 5, 5, 7, 7, 7, 7, 7, 9, 11, 11, 11, 11, 11, 11, 11, 11, 11, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13]
为什么会这样?缩进 else 语句后代码表现如何?
【问题讨论】:
假设我是 6 好,你会检查 2,3,4,5,如果你把 else 放在里面,它会给出 0,0,2,1 作为 mod 值,每次都会追加当它不是 0 时,4,5 它将添加到主要列表中!如果 i%j 不为 0,则更改要添加的条件,然后添加它,否则什么也不做 在第一个示例中,else 语句属于内部 for 循环。在这种情况下,在内部 for 循环完成对范围(2,i)
的迭代后,i
将附加到 prime_list
。在第二种情况下,else 语句属于 if 语句。在这种情况下,每次i%j != 0
时,i
都会附加到 prime_list
。
【参考方案1】:
在第一个示例中,else
用于:for
循环。这意味着else
语句中的代码只有在for loop
结束时没有break
时才会执行。
因此,在您的情况下,只有(2, i)
范围内的任何数字不是i
的分隔符。
在第二种情况下,else
用于:if
语句。意思是:如果if
不成立,则执行else
语句。在这种情况下,我们假设i=5
。对于:
j = 2 => i%j = 1 => else statement is executed: prime_list.append(5)
j = 3 => i%j = 2 => else statement is executed: prime_list.append(5)
j = 4 => i%j = 1 => else statement is executed: prime_list.append(5)
这就是为什么您的列表中有 3 次 5
。
【讨论】:
【参考方案2】:因为移入时,它会循环,并且大多数情况下会退出第一个if
语句,然后由于else
说要添加值,所以它会继续添加。
还有其他更有效的方法可以做到这一点,如下所示:
prime_list=[i for i in number_list if all(i % x for x in range(2, i))][1:]
print('Primes are:',prime_list)
【讨论】:
【参考方案3】:不同范围的else有不同的含义:
-
具有相同范围的 for 循环的 else 是 else 条件。它将在你的 for 循环中不中断时执行。
for 循环中的 else 用于在第二种情况下退出 for 循环。 else 与您的 if 语句有关
【讨论】:
以上是关于python中嵌套循环的执行顺序[重复]的主要内容,如果未能解决你的问题,请参考以下文章