Python 无法将函数中的变量作为参数发送

Python 无法将函数中的变量作为参数发送,python,python-3.x,Python,Python 3.x,我正在制作一个简单的程序来获取用户提供的范围内的所有素数。我得到了输入,并试图将下限和上限发送给函数。但是,它一直声明没有使用第一个参数值。该函数称为prime\u checker 奇怪的是,我相信我用来发送变量的方法是正确的,因为使用了第二个参数。我尝试使用相同的变量名(下限),但它不起作用 def prime_checker(lower, upper): x = 2 flag = True for lower in range(upper): for

我正在制作一个简单的程序来获取用户提供的范围内的所有素数。我得到了输入,并试图将下限和上限发送给函数。但是,它一直声明没有使用第一个参数值。该函数称为
prime\u checker

奇怪的是,我相信我用来发送变量的方法是正确的,因为使用了第二个参数。我尝试使用相同的变量名(
下限
),但它不起作用

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)

问题是当
lower
x
都是
0
时,您正在执行
lower%x
lower
x
的值由前面的行
确定。。在范围(…)
中,在Python中,可以从
0
循环到
range()
中指定为参数的数字减去1。因此,在第一次迭代中,您正好有
0%0
,这是一个未定义的操作


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

  • 您显式地增加了
    lower
    x
    ,但这实际上是由
    构造来处理的
    
  • 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
,在
m>=n
时停止,而在
m>=sqrt时停止(n) 
等),使用生成器而不是返回列表等。
但是这对于这个问题的讨论来说太多了。

对于下限(上限):
语句将零(包括)到上限之间的每个值分配给名
下限
。这将丢弃您传入的原始值,而不使用它。更正的版本将被删除

for lower in range(lower, upper + 1):
这需要在正确的范围内进行迭代

您的内部循环也有一些问题。它从零开始,这是导致错误的直接原因。您也不应该从1开始,因为可以保证可被1整除。相反,从2开始:

for x in range(2, lower):
您肯定希望在
较低的
上独占,因为这也保证了可整除性

lower%x==0
时,您不希望增加任何一个变量,因为循环将覆盖您所做的任何更改。相反,您希望跳到
lower
的下一次迭代,并从一开始就开始检查
x
。这是通过
break
语句完成的,该语句立即退出inner循环,并继续使用外部:

if lower % x == 0:
    break
请注意,仅仅因为一个数字不能被2整除,它就不一定是素数。您当前的
else
语句将为
x
的每个非除数值声明
lower
素数,而不管
lower
是否为素数。正确的做法是只报告一次素数er检查
x的所有可能值

Python恰好有一个特殊版本的
else
子句,它在
for
循环之后,只有在循环完成而没有
中断时才会被触发。因此,您所要做的就是取消
else
的一个级别,当然也不要毫无意义地设置循环变量

最终结果如下:

for lower in range(lower, upper + 1):
    for x in range(2, lower):
        if lower % x == 0:
            break
    else:
        print(f'{lower} is prime')

这不是搜索素数的特别有效的方法,但它说明了如何解决代码中的编程问题。

适用于范围较低(较高)的:
在使用原始值之前分配给
lower
并覆盖它。可能循环变量的另一个名称与参数变量不冲突,以避免混淆。非常感谢,我切换到while循环,并接受并纠正了代码中存在的问题!
if lower % x == 0:
    break
for lower in range(lower, upper + 1):
    for x in range(2, lower):
        if lower % x == 0:
            break
    else:
        print(f'{lower} is prime')