AresFC 发表于 2020-11-26 15:30:57

一个关于100以内素数的提问

各位大神!
新手小白写了个程序,需要输出100以内所有的素数,冥思苦想试了很多次,成功了但是不知道原理,求帮忙解释一下QAQ
先贴代码
for i in range(2,101):
   for j in range(2,i):
          if i%j==0:
             break
   else:
         print(i)

这个程序可以成功输出结果,但是else的位置试了很多次,最后巧合放在这里才成功。求问各位大神为什么else不能对应if?

for i in range(2,101):
   for j in range(2,i):
          if i%j==0:
             break
          else:
                print(i)

这样运行输出时数字会不断重复orz但是跟上面那种方式有什么区别呢

冬雪雪冬 发表于 2020-11-26 15:33:30

这个else是和for配对的,当for循环没有执行break,正常循环完毕则执行后面的else部分。

Twilight6 发表于 2020-11-26 15:51:18



你如果把 else 放入 for 循环的 if 下面,每次 for 循环时if 不成立 都会执行一次 else 导致打印了许多无用的结果

而 if 条件是为了判断是否被整除了,若 if 条件成立那么此时说明就不是素数,没有必要继续循环下去,break 退出循环

而 for 和 else 配合使用是只有在 for 循环正常结束(可以理解为不是 break 导致退出的循环)那么就会执行 else 的代码块

而你如果在 for 循环完整结束后没有执行 if 下面的代码块 break ,那么说明这个数确实只被 1 和本身整除,符合素数条件,才执行 for 循环的else 打印出素数

AresFC 发表于 2020-11-26 16:10:24

Twilight6 发表于 2020-11-26 15:51
你如果把 else 放入 for 循环的 if 下面,每次 for 循环时if 不成立 都会执行一次 else 导致打印了许多 ...

谢谢谢谢!请问是否可以理解为当 for 对应 else 时,只有所有的 j 都不符合break条件才会执行else中print(i)的代码,而与 if 对应时,j 的值每尝试一次如果不符合 if 语句都会执行print?

Twilight6 发表于 2020-11-26 16:14:10

AresFC 发表于 2020-11-26 16:10
谢谢谢谢!请问是否可以理解为当 for 对应 else 时,只有所有的 j 都不符合break条件才会执行else中print ...



没错~~

AresFC 发表于 2020-11-26 16:44:34

Twilight6 发表于 2020-11-26 16:14
没错~~

好的!!炒鸡感谢~!
页: [1]
查看完整版本: 一个关于100以内素数的提问