在函数中将变量作为参数发送时遇到麻烦

时间:2019-07-28 01:31:57

标签: python python-3.x

我正在制作一个简单的程序,以获取用户提供的范围内的所有素数。我得到输入,并且尝试将下限和上限发送到函数。但是,它一直在声明未使用第一个参数值。该函数称为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

2 个答案:

答案 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 % xlower均为x时,您正在执行0lowerx的值由前面的行for .. in range(...)确定,在Python中,这行允许您从0循环到在{{1}中指定为参数的数字}减一。因此,恰好在第一次迭代中,您就有range(),这是未定义的操作。


EDIT :这不是代码中存在的唯一问题,例如:

  • 您正在显式地递增0 % 0lower,但这实际上是由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等时停止,使用生成器而不是返回列表等。 但这对于这个问题的烧烤来说实在是太多了。