python 中嵌套循环的执行顺序
Order of execution in nested loops in python
我无法理解这两个代码块之间的区别,第一个正确的是:
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]
但是在块内将 else 语句向前移动到 if 语句下方(我认为这是正确的做法)会导致不同且错误的输出:
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 语句后代码的行为如何?
不同作用域的else有不同的含义:
- else 与你的范围相同 for-loop 是 else 条件。它会在你的 for 循环中 not-break 时执行。
- else 在 for-loop 用于在第二种情况下退出 for 循环。 else 与您的 if 语句相关
因为在移动的时候,它会循环并且大多数情况下退出第一个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)
在第一个示例中,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
。
我无法理解这两个代码块之间的区别,第一个正确的是:
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]
但是在块内将 else 语句向前移动到 if 语句下方(我认为这是正确的做法)会导致不同且错误的输出:
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 语句后代码的行为如何?
不同作用域的else有不同的含义:
- else 与你的范围相同 for-loop 是 else 条件。它会在你的 for 循环中 not-break 时执行。
- else 在 for-loop 用于在第二种情况下退出 for 循环。 else 与您的 if 语句相关
因为在移动的时候,它会循环并且大多数情况下退出第一个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)
在第一个示例中,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
。