初学者(Python 3.6.1):为什么这个脚本不起作用?



请记住,我几天前才开始学习Python(第一语言(。

我试图找到给定(并且可能很大(整数"a"的最大素因数。我首先定义一个函数prime(n(,用于检查整数'n'是否为素数。然后,我从最大到最小找到"a"的因子"n",并用prime(n(检查每个因子。如果找到质数 n,它就会被打印出来,我使用 break 来结束该过程。如果 n=1 是唯一找到的素因数,那么 'a' 是素数,所以它的最大素因数是它自己。

此脚本完全失败。变量 n_prime 回到我第一次给它的任何值,即使在 prime(n( 应该将其更改为 True 或 False 之后。如果我从 None 开始,在 prime(n( 之后,它总是保持 None。

我希望它不会太混乱,并且我的代码没有太多问题。

def prime(n): 
if n == 1:
n_prime = False
if n == 2:
n_prime = True
if n == 3:
n_prime = True
if n % 2 == 0 and n_prime != True:
n_prime = False
else:
for i in range(3, n, 2):
if i != n:
if n % i == 0:
n_prime = False
break
else:
n_prime = True

n_prime = None
a = int(input())
for n in range (a-1, 1, -1):
if a % n == 0:
prime(n)
if n_prime==True:
if n != 1:
print(n, ' is the greatest prime factor of ', a)
break
else:
print(a, 'is the greatest prime factor of ', a)
break

您的代码不起作用,因为您的prime函数不会n_prime您期望的方式修改全局变量。您可以通过在函数顶部添加一个global语句来使其工作:global n_prime.但这不是最好的方法。从函数内部修改全局变量会失去函数提供的大部分好处。

更好的方法是return要在调用代码中使用的值:

def prime(n): 
if n == 2 or n == 3: # We can reorder and combine some of the conditions up here
return True # return instead of trying to assign to the global variable!
if n == 1 or n % 2 == 0:
return False
for i in range(3, n, 2): # The end value of a range is not used in the iteration.
if n % i == 0:       # So the logic that was checking `i != n` is unnecessary.
return False
return True  # if the loop finished without returning, we know our value is prime

以下是我如何在您展示的最大素因数算法中使用该函数:

a = int(input())
for n in range (a-1, 1, -1): # This loop stops at 2. It doesn't ever reach 1, but that's OK!
if a % n == 0 and prime(n): # Test the return value from the function here!
print(n, ' is the greatest prime factor of ', a)
break
else: # This else block is attached to the loop. It runs only if the loop didn't `break`.
print(a, 'is the greatest prime factor of ', a)

请注意,没有必要将一个布尔值与另一个布尔值进行比较(例如n_prime == True.只需直接在if中使用布尔值(或使用布尔运算符,如andor(。

我还要指出,您可以摆脱最后的特殊情况(当a是素数时(,只需将循环更改为以a开头而不是a-1。由于您在看到n是除数后检查它是否是素数,因此只有在prime函数确认a没有因子(除了自身和 1(时,才会打印出消息。

最新更新