Опитвам се да науча 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 не печата нищо (или поне печата последната команда) по подразбиране.