我是python的初学者,所以我为缺乏知识而道歉,但我要问的是阅读Python手册和教程(http://docs.python.org/2.7/tutorial)我是不能完全掌握循环如何工作.我已经编写了一些简单的程序,所以我认为我得到了基础知识,但无论出于何种原因,这个程序用于列出小于或等于n的所有质数都不起作用:
n = int(raw_input("What number should I go up to? "))
p = 2
while p <= n:
for i in range(2, p):
if p%i == 0:
p=p+1
print "%s" % p,
p=p+1
print "Done"
Run Code Online (Sandbox Code Playgroud)
例如,当我输入100时的输出是:
2 3 5 7 11 13 17 19 23 27 29 31 35 37 41 43 47 53 59 61 67 71 73 79 83 87 89 95 97 101 Done
Run Code Online (Sandbox Code Playgroud)
看起来几乎是正确但由于某种原因包含27,35,95,这当然是复合的.我一直试图挑选我的循环工作方式,但我只是没有看到它突然检查可分性的地方.我想如果有人看了一眼他们可以向我解释一下这个语法是什么造成的.谢谢你!
Vol*_*ity 17
我实际上会重组程序看起来像这样:
for p in range(2, n+1):
for i in range(2, p):
if p % i == 0:
break
else:
print p,
print 'Done'
Run Code Online (Sandbox Code Playgroud)
这可能是一个更惯用的解决方案(使用for循环而不是while循环),并且完美地工作.
外for循环遍历从2到2的所有数字n.
内部迭代到从2到2的所有数字p.如果它达到一个均匀分配的数字p,那么它会突破内循环.
该else块执行每for循环没有爆发(打印素数)的时间.
然后程序'Done'在完成后打印.
作为旁注,您只需要迭代2到平方根p,因为每个因子都有一对.如果你没有得到匹配,那么在平方根之后将没有任何其他因素,并且数字将是素数.
您的代码有两个循环,一个在另一个内.如果用函数替换内部循环,它应该可以帮助您找出代码.然后确保该功能正确并且可以独立(与外环分开).
这是我对原始代码的重写.这种重写非常有效.
def is_prime(n):
i = 2
while i < n:
if n%i == 0:
return False
i += 1
return True
n = int(raw_input("What number should I go up to? "))
p = 2
while p <= n:
if is_prime(p):
print p,
p=p+1
print "Done"
Run Code Online (Sandbox Code Playgroud)
请注意,is_prime()不会触及外部循环的循环索引.它是一个独立的纯功能.p内循环内部的增量是问题,这个分解版本没有问题.
现在我们可以轻松地使用for循环重写,我认为代码得到了改进:
def is_prime(n):
for i in range(2, n):
if n%i == 0:
return False
return True
n = int(raw_input("What number should I go up to? "))
for p in range(2, n+1):
if is_prime(p):
print p,
print "Done"
Run Code Online (Sandbox Code Playgroud)
请注意,在Python中,range()永远不会包含您传入的上限.所以内部循环,它检查< n,我们可以简单地调用,range(2, n)但对于外部循环,我们想要的地方<= n,我们需要添加一个,n以便n包括:range(2, n+1)
Python有一些很有趣的内置东西.您不需要立即学习所有这些技巧,但这是您可以编写的另一种方法is_prime():
def is_prime(n):
return not any(n%i == 0 for i in range(2, n))
Run Code Online (Sandbox Code Playgroud)
这就像for循环版本一样is_prime().它设置i为值range(2, n)并检查每个值,如果测试失败则停止检查并返回.如果它检查n范围中的每个数字而不是它们中的任何一个n均匀分配,那么该数字是素数.
同样,你不需要马上学习所有这些技巧,但我认为当你学习它们时它们会很有趣.