2017-04-21 1 views
0

Das ist mein Programm.Warum erscheint ein Namensfehler?

sentence = raw_input("Please type a sentence:") 
while "." in sentence or "," in sentence or ":" in sentence or "?" in 
sentence or ";" in sentence: 
    print("Please write another sentence without punctutation ") 
    sentence = input("Please write a sentence: ") 
else: 
    words = sentence.split() 
    print(words) 
specificword = raw_input("Please type a word to find in the sentence: ") 
while i in range(len(words)): 
    if specificword == words[i]: 
     print (specificword, "found in position ", i + 1) 
    else: 
     print("Word not found in the sentence") 
     specificword = input("Please type another word to find in the sentence") 

Nach dem Ausführen dieses Programms dieser Fehler angezeigt wird, Bitte geben Sie einen Satz: Hallo mein Name ist jeff [ 'hallo', 'mein', 'Name', 'ist', 'jeff'] Bitte Geben Sie ein Wort in den folgenden Satz ein: jeff

Traceback (most recent call last): 
    File "E:/school/GCSE Computing/A453/Task 1/code test1.py", line 9, in <module> 
    while i in range(len(words)): 
NameError: name 'i' is not defined 

Was ist hier falsch?

+6

Das 'while' Schleife wahrscheinlich eine' for' Schleife sein soll. Indem Sie dies in einer while-Schleife tun, prüfen Sie, ob der Inhalt der Variablen "i" in der Liste enthalten ist, die von der Funktion "range" generiert wird. Dabei wird festgestellt, dass "i" nicht definiert ist, also der Fehler. – Shadow

+0

Das ist genau das Problem, @Shadow. 'for' Schleifen definieren eine neue Variable. 'while' Schleifen evaluieren eine Bedingung in ihrem Umfang:' i' müsste bereits existieren. Und semantisch, "während ich in Reichweite (len (Wörter))" ist nicht was Jeff will. –

+0

Übrigens, Jeff, schauen Sie sich die eingebaute 'enumerate' Funktion an. –

Antwort

3
while i in range(len(words)): 

Muss for anstelle von while sein.

for x in <exp> wird über <exp> iterieren, wobei in jeder Iteration der Wert x zugewiesen wird. In gewisser Hinsicht ähnelt es einer Zuweisungsanweisung insofern, als es die Variable erstellt, wenn sie nicht bereits definiert ist.

while <cond> bewertet nur die Bedingung als Ausdruck.

1

Ein NameError wird durch Verwendung eines Namens verursacht, der nicht definiert ist. Entweder ist es falsch geschrieben oder wurde nie zugewiesen.

Im obigen Code wurde i noch nicht zugewiesen. Die while-Schleife versucht den aktuellen Wert i zu finden, um zu entscheiden, ob eine Schleife ausgeführt werden soll.

Aus dem Kontext sieht es so aus, als ob Sie eine For-Schleife haben wollten. Der Unterschied besteht darin, dass die for-Schleife die Variable für Sie zuweist.

diese So ersetzen:

while i in range(len(words)): 

mit diesem:

for i in range(len(words)): 
Verwandte Themen