![](/img/trans.png)
[英]When running sys.stdout.write(), none is printed after what i want to print
[英]'None' is printed when I want 'True' for input 5
在此素数测试程序中,当我输入素数而不是“ True”时,将打印“ None”。 如何获得打印“ True”的字样?
def main():
import math
def check_n(n):
n_s = int(math.sqrt(n))
for i in range(2, n_s):
if (n_s % i) == 0:
return False
break
else:
return True
def msg():
n = int(input('Enter a number, I will return True if it is a prime'))
return n
print(check_n(msg()))
main()
您需要将int(math.sqrt(n))
更改为int(math.sqrt(n)+1)
,因为range
一直运行到n_s-1
。 因此,如果输入为5, range(2,int(math.sqrt(5)))
只是range(2,2)
,为空。
另外,您需要在for
循环之外使用return True
,否则您的代码可能会在初期阶段停止。 在return False
之后,您也不需要break
语句(该函数将永远不会到达该行,因为如果输入到if
语句,它将返回False
)。
最后,将if (n_s % i) == 0:
更改为if (n % i) == 0:
因为您需要检查n
是否可被i
整除(而不是其平方根)。
这是一个更干净的版本:
import math
def check_n(n):
n_s = int(math.sqrt(n)+1)
for i in range(2, n_s):
if (n % i) == 0:
return False
return True
def msg():
n = int(input('Enter a number, I will return True if it is a prime'))
return n
print(check_n(msg()))
第一:您的break语句是多余的。
第二:对于诸如3之类的值,永远不会执行for循环,因为值n_s小于2,并且由于for循环未执行,因此python返回默认值None(未指定任何值时返回)。 因此,您的check_n(n)函数必须为
def check_n(n):
n_s = int(math.sqrt(n))
for i in range(2, n_s + 1):
if (n_s % i) == 0:
return False
return True
一线
check_n = lambda n : sum([i for i in range(2, int(math.sqrt(n)+1)) if n % i == 0]) == 0
不要把事情复杂化..
选择小于9的范围时,范围是(2,2)或None
。因此,要解决您的第一个问题:将2加到n_s
(对于输入3)
您的逻辑也有问题。
您的for
循环应检查n
mod i
为0,而不是n_s
。
这应该工作:
def main():
import math
def check_n(n):
n_s = int(math.sqrt(n)+1)
for i in range(2, n_s):
if (n % i) == 0:
return False
return True
def msg():
n = int(input('Enter a number, I will return True if it is a prime'))
return n
print(check_n(msg()))
main()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.