python嵌套循环中的执行顺序

时间:2019-05-08 06:46:56

标签: python python-3.x nested-loops

我无法理解这两个代码块之间的区别,首先正确的是:

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语句后代码的行为如何?

3 个答案:

答案 0 :(得分:1)

范围不同的else具有不同的含义:

    其他条件与for循环的作用相同。在for循环中不间断运行时将执行该程序。 在第二种情况下,for循环中的
  1. else用于退出for循环。 else与您的if语句有关

答案 1 :(得分:1)

在第一个示例中,else用于:for循环。这意味着else语句中的代码仅在for loopbreak结尾的情况下执行。 因此,在您的情况下,只有(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 :(得分:0)

由于移入时,它将循环并在大多数情况下退出第一个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)