我正在制作一个简单的程序,以获取用户提供的范围内的所有素数。我得到输入,并且尝试将下限和上限发送到函数。但是,它一直在声明未使用第一个参数值。该函数称为prime_checker
。
奇怪的是,我相信我用来发送变量的方法是正确的,因为使用了第二个参数。我尝试使用相同的变量名称(lower_bound
),但是它不起作用。
def prime_checker(lower, upper):
x = 2
flag = True
for lower in range(upper):
for x in range(lower):
if lower % x == 0:
flag = False
x += 1
lower += 1
else:
print(lower + "is a prime number.")
x += 1
lower += 1
lower_bound = int(input("Enter a lower bound: "))
upper_bound = int(input("Enter an upper bound: "))
prime_checker(lower_bound, upper_bound)
line 19, in <module>
prime_checker(lower_bound, upper_bound)
line 8, in prime_checker
if lower % x == 0:
ZeroDivisionError: integer division or modulo by zero
Paramerer 'lower' is not used
答案 0 :(得分:1)
语句MongoClient.connect(url, function(err, db) {
db.collection("users").findOne().then(result => {
console.log(result)
})
})
将介于0(含)和for lower in range(upper):
之间的每个值都分配给名称upper
。这将丢弃您从未使用的原始值。更正后的版本将是
lower
这将在正确的范围内进行迭代。
您的内循环也有两个问题。它从零开始,这是导致错误的直接原因。您也不应该一开始就做,因为可以保证一分为二。而是从两个开头:
for lower in range(lower, upper + 1):
您肯定要在for x in range(2, lower):
上排他,因为这样也保证了可除性。
在lower
时,您不想增加任何一个变量,因为循环将覆盖您所做的任何更改。相反,您想跳到lower % x == 0
的下一个迭代,并从头开始检查lower
。这是通过x
语句完成的,该语句立即退出内部循环,并继续执行外部循环:
break
请注意,仅因为数字不能被2整除,它不一定是素数。您当前的if lower % x == 0:
break
语句将为else
的每个除数的lower
声明素数,无论x
是否为素数。正确的做法是,在检查lower
的所有可能值之后,仅报告一次质数。
Python恰好具有x
子句的特殊版本,该子句在else
循环之后,并且仅在循环完成时没有for
时才被触发。因此,您要做的就是将您的break
取消一级缩进,当然,不要毫无意义地设置循环变量。
最终结果是这样的:
else
这不是搜索质数的特别有效的方法,但是它说明了如何解决代码中的编程问题。
答案 1 :(得分:0)
问题在于,当lower % x
和lower
均为x
时,您正在执行0
。 lower
和x
的值由前面的行for .. in range(...)
确定,在Python中,这行允许您从0
循环到在{{1}中指定为参数的数字}减一。因此,恰好在第一次迭代中,您就有range()
,这是未定义的操作。
EDIT :这不是代码中存在的唯一问题,例如:
0 % 0
和lower
,但这实际上是由x
构造来解决的。for
的两个分支上都执行相同的操作,这不必要地多余; if
,因为它缺少对None
的显式使用。除了我认为是您的思路之外,我可能还会写以下内容:
return
这可以进一步改善,例如通过使用单独的def give_primes(lower, upper):
result = []
for n in range(lower, upper):
is_prime = True
# check if `n` is prime
# this could be heavily optimized
for m in range(2, n):
if n % m == 0:
is_prime = False
break
if is_prime:
result.append(n)
return result
lower_bound = int(input("Enter a lower bound: "))
# you input: 10
upper_bound = int(input("Enter an upper bound: "))
# you input: 20
print(give_primes(lower_bound, upper_bound))
# [11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
函数(与上面报告的效率相比,效率可以大大提高,例如,仅检查一次is_prime()
,然后在内部% 2
上使用step=2
,而不是在range()
时停止,而是在m >= n
等时停止,使用生成器而不是返回列表等。
但这对于这个问题的烧烤来说实在是太多了。