2016-08-29 7 views
0

Dieses Programm nehme tun 1000 Primzahlen zu finden und sie in eineFunktion hält die gleiche Sache

Liste packen Hier ist der Code:

num = raw_input('enter a starting point') 
primes = [2] 
num = int(num) 
def prime_count(num): 

    if num % 2 == 0: #supposed to check if the number is divided by 2 evenly 
     num = num +1 #if it is, then add 1 to that number and check again 
     return num 


    elif num % num == 0: 
     primes.append(num) #supposed to add that prime to a list 
     num = num + 1 #add 1 and check again 
     return num 


while len(primes) <= 999: 
    prime_count(num) 

Also, was eigentlich passiert, wenn ich es laufen: es fragt mich raw_input und geht dann verschiedene Dinge je nachdem, was ich als Eingabe wählen:

  • Wenn ich eine erstklassige wählen, lassen sie uns 3 sagen, es läuft und fügt 999 von 3s auf der Liste anstelle der Zugabe es nur ein t ime und gehen auf 4
  • versuchen Wenn ich ein Non-Prime wählen, lassen Sie uns sagen, 4, es ist nur bricht, danach habe ich nicht einmal eine Liste ausdrucken können

Was mache ich falsch?

UPDATE: Ich reparierte es, aber wenn ich laufe es mit diesem ich erhalte einen Fehler (Typeerror: nicht unterstützte Operandtyp (e) für%: 'NoneType' und 'int')

number = raw_input('enter a starting point') 
primes = [2] 
number = int(number) 
def prime_count(x): 

    if x % 2 == 0: #supposed to check if the number is divided by 2 evenly 
     number = x +1 #if it is, then add 1 to that number and check again 
     return number 



    else: 
     for i in range(3, x-1): 
      if x % i == 0: 
       primes.append(x) #supposed to add that prime to a list 
       number = x + 1 #add 1 and check again 
       return number 


while len(primes) <= 999: 
    number = prime_count(number) 
+0

Sie scheinen den Unterschied zwischen lokalen und globalen Variablen oder die Funktionsweise von Funktionsparametern und Rückgabewerten nicht zu verstehen. Um zu helfen, schlage ich vor, dass Sie alle Variablen außerhalb von 'prime_count' umbenennen. –

+0

Sie müssen sich in Python über die Gültigkeitsbereichsregeln informieren. 'num' wird als lokale Variable in' prime_count' behandelt. Was ist der Sinn der Benutzereingabe hier überhaupt? –

Antwort

0

Sie verwenden nie den Rückgabewert von prime_count. Versuchen Sie folgendes:

while len(primes) <= 999: 
    num = prime_count(num) 

Sie Ihr Selbst up für Verwirrung gesetzt haben, indem Sie den Namen mit num als beide einen Parameter (auch eine lokale Variable) innerhalb von prime_count, und auch als globale Variable. Obwohl sie denselben Namen haben, sind sie aufgrund der Python-Regeln für den Gültigkeitsbereich der Variablen unterschiedliche Variablen.

Auch (prime_count) ist (wahrscheinlich unabsichtlich) die Tatsache nutzen, dass primes eine globale Variable ist. Da Sie nicht zu ihm zuweisen, sondern nur eine Methode (Append) aufrufen, funktioniert der Code ohne Verwendung des Schlüsselwortes global.

Allerdings ist Ihr Algorithmus nicht einmal richtig. if num % num == 0 sagt "wenn eine Zahl durch sich selbst geteilt hat einen Rest von Null", die immer wird wahr sein. Dieses Programm wird viele "Primes" finden, die keine Primzahlen sind.

Wirkliche Python-Programme haben im globalen Geltungsbereich sehr wenig; Ihr aktueller Code fragt nur nach Verwirrung. Ich schlage vor, dass Sie mit dieser Vorlage beginnen und auch den vorhandenen Python-Code lesen.

def add_three(a_param): 
    a_local_var = 3  # This is *different* than the one in main! 
          # Changes to this variable will *not* affect 
          # identically-named variables in other functions 

    return a_local_var + a_param 

def main(): 
    a_local_var = 2 

    result = add_three(a_local_var) 

    print result # prints 5 

if __name__ == '__main__': 
    main() 
+0

Ich denke, der Fehler ist, was bereits in den Kommentaren unter der Frage erwähnt wird und nicht, was Sie hier zeigen –

+0

Ich schrieb einen dieser Kommentare. Seine Variablennamen kollidieren, aber der Code sollte funktionieren. –

+0

Ich sehe nicht, wie dieser Code ohne die Variable Konflikt funktionieren sollte. Ohne die Variablenüberschneidung würde das Programm nur num% 2 == 0 und num% n == 0 testen. So funktioniert ein Haupttest nicht. – Phidelux

Verwandte Themen