2017-06-21 10 views
-2

Sehen Sie, ich fing an, Python heute zu lernen, und ich bin in einer Situation stecken. Ich habe eine sehr einfache Frage gelöst und ich habe sie abgeschlossen, aber es gibt ein Problem.Python: Fehler in der Schleife

Zunächst möchte ich die Frage und die Einschränkungen erzählen. Hier ist die Frage:

eine ganze Zahl gegeben, n, führen Sie folgende bedingte Aktionen:

  1. Wenn n ist odd, Weird drucken.
  2. Wenn n ist even und im inklusiven Bereich von 2 to 5, drucken Not Weird
  3. Wenn neven ist und in der inklusiven Bereich von 6 to 20, drucken Weird
  4. Wenn neven und größer als 20, drucken Not Weird

Hier ist mein Code:

n = input("") 
if n%2!=0 : 
    print ("Weird") 
elif n%2==0 : 
    for n in range(3,4,5) : 
      print ("Not Weird") 
elif n%2==0 : 
    for n in range(6,21) : 
      print ("Weird") 
else : 
    if (n%2==0 & n>20) : 
     print ("Not Weird") 

ich den Code kompiliert, alles ist in Ordnung, aber für die Eingabe 18 und 20 Ich muss Weird als Ausgabe erhalten, aber ich bin immer Not Weird. Kann mir jemand helfen?

+0

Meinst du binary '&', oder meinst du logisch 'und'? – cdarke

+0

Ich meine eine logische und wie wir in 'C' oder' C++ 'zum Beispiel, ' if (x> 4 && x% 2 == 0) ' –

+0

In diesem Fall sollte es" und ", was wäre sei '&&' in C. '&' ist ein binärer Operator mit der gleichen Bedeutung wie in C. Bevor du fragst, ist es in Python 'oder', nicht' || '. – cdarke

Antwort

0

Waren Sie speziell für Loops verwenden gefragt? Wenn nicht, können Sie das versuchen!

n = int(input("")) 

if n%2==1: 
    print("Weird") 
elif n%2==0 and n in range(3, 6): 
    print("Not Weird") 
elif n%2==0 and n in range(6, 21): 
    print("Weird") 
elif n%2==0 and n>20: 
    print("Not Weird") 
+0

Vielen Dank so so sehr !! aber warum funktionierte es nicht mit 'for' loop? –

+0

Sie können die 'n% 2 == 0 und' vom Anfang jedes 'elif' Falles weglassen; Du wirst sie nur erreichen, wenn der 'n% 2 == 1'-Test fehlschlägt, also ist es überflüssig, die Gleichmäßigkeit erneut zu überprüfen, wenn du bereits" nicht seltsam "garantiert hast. Auch, besonders in Python 2, aber immer noch in Python 3, ist es besser/schneller (zum Beispiel) 'elif 6 <= n <= 20:' als 'elif n im Bereich (6, 21):'; '6 <= n <= 20 'muss überhaupt kein Objekt erstellen (und bei Py2 ist das erstellte Objekt eine moderate Größe' Liste ', die Element für Element abgetastet werden muss, wobei' 6 <= n <= 20 'ist 1-2 billige Logiktests). – ShadowRanger

+0

Ja das ist richtig. – ne0fr0st

0

Sie haben 2 ELIF mit der gleichen Bedingung sollte es nicht. es eine elif

n = input("") 
if n%2!=0 : 
    print ("Weird") 
elif n%2==0 : 
    if n>20: 
     print ("Not Weird") 
    for n in range(3,4,5) : #range shouldn't be like this. But for your understanding i leave it as it is 
      print ("Not Weird") 
    for n in range(6,21) : 
      print ("Weird") 

Schluss sonst auch nicht

+0

Bitte lesen Sie die Bedingungen und sagen Sie mir, was ich tun soll, wenn ich ein 'elif' entferne –

+0

Es wird in zweiten elif kommen, da beide gleich sind. Also merge 2 und 3 zusammen –

+0

oh, ja! Warte, ich werde versuchen –

0

Sie mit Bereich (3,4,5) haben ein Problem erforderlich ändern oder entfernen. Liste (Bereich (3,4,5)) ist [3] .. wahrscheinlich nicht das, was Sie erwartet haben ... Bereich ist Start, Stopp, Schritt.

Sie für n tun konnten in [3,4,5] oder Bereich (3,6)

+0

Ich denke, das Problem ist in der 2. 'elif' Anweisung, weil der Eingang' 18' und '20' im' Bereich liegt (6,21) ' –

0

Ihr Hauptproblem ist, dass Sie Neudefinition n in Ihren for Schleifen, also bei jeder bedingten Anweisung halten nach die erste for Schleife Ihre n ist nicht, was ursprünglich angegeben wurde. In Ihren beiden Fällen n=18 und n=20 ist die erste Bedingung n%2!=0 Falsch, also wird die zweite Bedingung getestet. n%2==0 ist True, so dass die Schleife ausgeführt wird. Die erste (und einzige) Iteration dieser Schleife setzt n auf 3 und druckt 'Not Weird'. Da n jetzt 3 ist, sind keine der verbleibenden Bedingungen in Ihrem Code True, daher werden sie nicht ausgeführt.

Die folgende wäre viel einfacher Ihre Anforderungen gegeben:

def isweird(n): 
    if n%2 or n in range(6,21): 
     return 'Weird' 
    if n in range(2,6) or n > 20: 
     return 'Not Weird' 

for n in range(23): 
    print(n, isweird(n)) 

Ausgang:

0 None 
1 Weird 
2 Not Weird 
3 Weird 
4 Not Weird 
5 Weird 
6 Weird 
7 Weird 
8 Weird 
9 Weird 
10 Weird 
11 Weird 
12 Weird 
13 Weird 
14 Weird 
15 Weird 
16 Weird 
17 Weird 
18 Weird 
19 Weird 
20 Weird 
21 Weird 
22 Not Weird 
0

Es gibt eine Reihe von Problemen mit dem Code, den Sie zur Verfügung gestellt haben.

Die offensichtlichste ist, dass Sie die gleiche Bedingung wiederholt in zwei Zweigen einer if ... else Kette haben. Die zweite solche Bedingung,

elif n%2==0: 
    for n in range(6,21) : 

wird nie ausgeführt.

Auch die Verwendung von for-Schleifen in diesen Zweigen ist falsch. Das sollten Konditionals sein. Sie verwenden eine Schleife, wenn Sie eine Aktion wiederholen möchten, aber hier haben Sie eine Variable, und Sie möchten eine Frage dazu stellen. Das ist eine „if“:

elif n%2==0 : 
    if n in range(3,4,5) : 
      print ("Not Weird") 

Aber das führt zum nächsten Fehler, die die Verwendung von range ist. Wie geschrieben, geben Sie den Zahlenbereich beginnend mit 3 bis 4 (nicht inklusive) in 5er Schritten an. Das wäre der Bereich mit 3. Um den Einschlussbereich von 2 bis 6 anzugeben, würden Sie schreiben Sie

elif n%2==0 : 
    if n in range(2,7): 
      print ("Not Weird") 

Bereiche sind am unteren Ende und exklusiv am oberen Ende inklusive. Dies scheint zunächst nicht intuitiv, aber es ist in der Regel, was Sie wollen, wenn Sie mit Null-Indizes arbeiten. Wenn Sie beispielsweise möchten, dass der Bereich (10) zehn Mitglieder hat und mit Null beginnt, enthält er alle zehnstelligen Ziffern. Sie können dies auch schreiben als

elif n%2==0 : 
    if 2 <= n <= 6: 
      print ("Not Weird") 

, die meine Präferenz wäre.

0

So lassen Sie uns für Zeile Code Linie gehen und sehen, was im Falle einer Eingabe von 18 passiert:

if n%2!=0 : 
    print ("Weird") 

18 Modul 2 ist gleich 0, so ist dieser Druck Aussage wird nicht erreicht .

Next:

elif n%2==0 : 
    for n in range(3,4,5) : 
     print ("Not Weird") 

Hallo, passt dieser! Daher wird die for-Anweisung ausgeführt. Keine weiteren Anweisungen in Ihrer if/elif/else-Kette werden für den Wert 18 erreicht, da Sie hier eine Übereinstimmung gefunden haben.

jedoch, du wirst nicht sehen, was Sie erwarten, weil die for Aussage nicht tut, was Sie denken, es tut. Sie denken, dass es sich um n handelt und für einen Wert von n, der in der Liste [3,4,5] gefunden wird, wird der Wert Not Weird gedruckt.

Das ist nicht was for tut. Stattdessen wird n wird geändert zu einem jeden der Werte in dem Bereich wiederum, und der Code innerhalb der Schleife wird mit n auf diesen Wert festgelegt ausgeführt werden.Nun, Sie wundern sich, warum, wenn dies der Fall ist, Sie sehen die Not Weird dreimal gedruckt nicht? Der Grund ist, dass range eine Funktion ist und keine Liste der gelieferten Zahlen zurückgibt, sondern eine Reihe von Zahlen, die mit (in Ihrem Beispiel) 3 beginnen und mit 4 enden, aber nur jede fünfte Zahl annehmen. Durch Zufall ergibt sich ein range mit nur 1 Wert (der Wert 3) weshalb Not Weird nur einmal erscheint.

Hier ist eine korrigierte und kommentierte Version des Codes:

if n%2 != 0: 
    print ("Weird") 
else: 
    #Don't need elif, there are only two cases odd, or not. 
    #But, inside this branch we have three possibilities. 
    if n in [2, 3, 4, 5]: 
     #I just enumerate here, instead of using range. You forgot about 2, BTW 
     print ("Not Weird") 
    elif n in range(6,21) 
     # Note the use of if (or elif), not for. 
     print ("Weird") 
    else: 
     print ("Not Weird")