/ / Защо моята функция на Python работи в конзолата, но не и когато се обажда в кода? - питон, python-3.x

Защо моята функция Python работи в конзолата, но не и когато се извиква в кода? - python, python-3.x

Опитвам се да науча Python, като се справям с проблемите на уебсайта Project Euler. Знам точно какво искам да направя, а методът ми работи на хартия, но не мога да направя кода да работи.

Връзка към GitHub: https://github.com/albyr/euler-python/blob/master/euler3.py

Създал съм две функции, една от които изчислява факторите на целевия номер, и тази, която проверява дали дадено число е просто.

# Function that finds all the factors of a given number
def findfactors(n):
# for i in range(1,int(sqrt(n)+1)):
for i in range(1,n+1):
if n/i == int(n/i):
factors.append(i)

# Function that checks if a number is prime
def checkprime(n):
# Trial division
for i in range(2,int(sqrt(n)+1)):
if n/i == int(n/i):
# Number gives a remainder upon division and therefore is not prime
isprime = False
break
else:
isprime = True
if isprime == True:
return True
elif isprime == False:
return False

Аз съм сигурен, че на експертите кодът изглежда ужасно.

>>> checkprime(9)
False
>>> checkprime(79)
True
>>> checkprime(factors[3])
True

Но когато стартирам програмата с F5, получавам:

Traceback (most recent call last):
File "/home/alby/euler-python/euler3.py", line 45, in <module>
checkprime(factors[i])
File "/home/alby/euler-python/euler3.py", line 32, in checkprime
if isprime == True:
UnboundLocalError: local variable "isprime" referenced before assignment

Ако извикам функцията checkprime от програмата с твърдокодиран номер (напр. checkprime(77)) Изобщо не получавам изход. Сигурен съм, че това е нещо основно в начина, по който работи Питон, който не разбирам, но не мога да измисля какво да направя.

Някакви предположения?

Отговори:

5 за отговор № 1

В кода на Github виждаме, че се опитвате да се обадите checkprime(1) (при първата итерация през последния цикъл).

# Check each factor to see if it is prime or compound
for i in range(0,len(factors)):
print (factors[i])
# Why can"t I call checkprime here, like this? It works in the console.
checkprime(factors[i])

Но вижте кода си:

def checkprime(n):
# Trial division
for i in range(2,int(sqrt(n)+1)):
if n/i == int(n/i):
# Number gives a remainder upon division and therefore is not prime
isprime = False
break
else:
isprime = True

ако n = 1, тогава range(2, int(sqrt(1)+1)) е range(2,2) което е празно ... така isprime никога не се настройва, защото тялото на контура никога не се изпълнява.

Имайте предвид, че аргументите на range() ■ площ полуотворен интервал - range(x,y) е "цели числа, започващи от x и завършващи." преди y " range(2,3) = [2] и range(2,2) = [].

Друг въпрос тук е, че findfactors() се връща 1 като първи фактор - това вероятно не е това, което искате:

def findfactors(n):
# for i in range(1,int(sqrt(n)+1)):
for i in range(1,n+1):

За проверка на основната факторизация вероятно искате да започнете 2, не 1 (тъй като всичко е неделимо с 1).


Също така този код е излишен:

if isprime == True:
return True
elif isprime == False:
return False

Можете наистина да напишете това като ...

return isprime

Или можете да отидете една стъпка по-добре и никога да не използвате isprime на първо място - просто замени isprime = True с return True и isprime = False с return False.

И накрая, стенография за int(n/i) е n // i - Питон // Операторът прави целочислено разделение.


0 за отговор № 2

По отношение на липсата на изходен печат, просто използвайте print(checkprime(77)) вместо това, когато стартирате от F5 и трябва да получите своя изход. Когато се изпълнява от повикване, python не печата нищо (или поне печата последната команда) по подразбиране.