Zum ausführen mehrerer Funktionen in Ordnung?
Sollte dies ein leichtes für erfahrene Programmierer da draußen... ich bin ein Programm schreiben, dass sich die Ausgaben anagramme (aus einer übergebenen Liste) von einem Durcheinander Eingang. Ich glaube, mein code beinhaltet alle notwendigen Funktionen zu produzieren das gewünschte Ergebnis, aber ich kann nicht herausfinden, wie man das Programm ausführen der jeweiligen Funktionen in Ordnung. Ein Beispiel für die Ausgabe ist:
Please enter a jumbled word: lsitNe
Your words are:
silent
listen
enlist
tinsel
Dies ist meine Ausgabe, aktuell:
Please enter a jumbled word: dff
Traceback (most recent call last):
File "/Users/edinnerman/Desktop/poop.py", line 53, in <module>
main()
File "/Users/edinnerman/Desktop/poop.py", line 5, in main
yay_anagrams = anagramlist(lword)
NameError: name 'lword' is not defined
Wie kann ich neu formatieren mein code zur Ausgabe aller anagramme aufgelistet in einer text-Datei erhält eine user-Eingabe?
Hier ist mein code:
#0: Create a main function to bring all functions together for the output.
def main():
textfile = open('words.txt', 'r').read()
dictionary_of_words = filename(textfile)
yay_anagrams = anagramlist(lword)
double_whammy = binary_search(fresh_list, ltextfile)
answer = output()
#1, 2: Take a filename as a parameter and ask user for word to unjumble. Lowercase all.
def filename(textfile):
ltextfile = textfile.lower()
scrambled_eggs = input("Please enter a jumbled word: ")
lword = scrambled_eggs.lower()
#3: Create an anagram list (already lowercase) for the jumbled word.
def anagramlist(lword):
if lword == "":
return([lword])
else:
yay_word = lword[1:]
first_letter = lword[0]
fresh_list = []
for mixed_word in filename(yay_word):
for pos in range(len(mixed_word) + 1):
fresh_list.append(mixed_word[:pos] + first_letter[0] + mixed_word[pos:])
return fresh_list
#4: Check if any words in anagram list match dictionary list.
def binary_search(fresh_list, ltextfile):
for eachword in fresh_list:
low = 0
high = len(list) - 1
while low <= high:
mid = (low + high)//2
item = list[mid]
if fresh_list == item:
return True
elif fresh_list < item:
high = mid - 1
elif fresh_list > item:
low = mid + 1
return False
#5: Print appropriate statements.
def output():
if fresh_list == True:
newlist = set()
for item in fresh_list:
newlist.add(item)
print("Your words are:/n", newlist)
if fresh_list == False:
print("Your word cannot be unjumbled.")
main()
Bitte entschuldigen Sie einige der kleineren Codierung Fehler, die ich vielleicht in diesen code.
- Bitte gehen Sie durch die tutorial-Sektion, die auf Funktion definition erste um einige Beispiele über die Funktion Definitionen. Verwenden Sie Variablen, die nicht definiert sind alle über den Ort, zuweisen von Variablen für die Rückgabewerte von Funktionen, die nicht wieder alles haben, und dann nie verwenden die Ihnen zugewiesenen Werte wieder. Ich nehme an, dies ist eine Art von Hausaufgaben/Zuordnung. Könnte man nicht mit etwas beginnen, das einfacher? Oder, wenn nicht, versuchen zu implementieren, die eine der Funktionen, damit es funktioniert, und dann bewegen auf die nächste?
- Du bist nicht weit Weg, aber es gibt einige grundlegende Konzepte, die Ihnen fehlen (siehe @Carsten Kommentar). In Bezug auf die Frage, die hier (und Debuggen für sich selbst) "der shell beendet das Programm nach der Eingabe" ist nicht sehr informativ. Was eigentlich happends, ich denke, ist, dass Sie einen Fehler erhalten:
NameError: global name 'lword' is not defined
- und eine Zeilennummer. Für eine Frage hier - am besten kopieren Sie die gesamte Nachricht (einschließlich derTraceback
). Auch für Ihre debugging - es gibt Ihnen den ersten Hinweis - Python nicht weiß, waslword
ist in Zeile 5... - Sie möchten möglicherweise verwenden Sie PyCharm (oder ein ähnliches tool). Es ist sehr leicht zu erkennen Fehler in Ihrem code. Dann könnte man mit der Maus über die problematischen Teile des Codes, und Lesen Sie, was falsch ist.
- danke für den link! Ich kann nicht sagen, ob ich brauchte, um Dekorateure oder ähnliches, so dass die Beratung ist sehr geschätzt. @J Richard Snape, ich fügte hinzu, dass in der Frage-immer noch lernen, wie man Fragen zu stellen, angemessen auf Stackoverflow (danke!). Die Arbeit an meinem code, und werde, wenn ich die Lösung haben. Vielen Dank für die Hilfe!
- Sicher haben Sie einen Blick auf die Antwort unten. Wenn es hilft und bringt Sie vorbei diese Fehler - fühlen Sie sich frei, Sie zu akzeptieren. Wenn es führt zu neuen Fehlern - ich würde Ihnen empfehlen, sich eine neue Frage, die über jene, als zu versuchen, Sie zu Sortieren Sie alle aus in diesem thread (Fehler in der Logik innerhalb der Funktion ganz ein anderes problem, um die Fehler im Programm-Ablauf, die wir bekämpfen hier).
- Übrigens - sehr unwahrscheinlich, dass Sie brauchen, Dekorateure und fortgeschritteneren Konstrukte, die mit dieser Art von code. Ich werde noch einmal auf die Allgemeine Bemerkung in meiner Antwort - einfach starten! Viel Glück!
- Es gibt einige grundlegende Probleme mit Ihrem Python-code und Programmlogik. Richard ' s Antwort beschreibt einige dieser Grundlagen, aber auch wenn Sie fixieren Sie diese Dinge in Ihrem Programm, es finden nicht alle anagramme für einen input-Wort, seit Ihr
anagramlist()
Funktion erzeugt nur ein kleiner Bruchteil aller möglichen Permutationen der Eingabe-Wort. OTOH, wenn Sie verändert, dass die Funktion so dauerte es auch Generierung aller Permutationen, Ihr Programm wäre sehr ineffizient - es gibt eine viel bessere Strategie für die Suche nach Anagrammen. - Als Richard erwähnt, die Sie brauchen, um ein besseres Verständnis der verschiedenen Python und die Allgemeinen Programmier-Grundlagen. Bis Sie das tun, werden Sie nicht die Kodierung Fähigkeiten, die erforderlich sind, dies zu schreiben, Anagramm-Programm. Ich versuche nicht, Euch zu entmutigen - ganz im Gegenteil, aber wir können Sie nicht lehren Sie die Grundlagen der Programmierung auf Stackoverflow (oder anderen Stack-Exchange-Standorte), diese Aufgabe ist nicht geeignet, um diese Frage-und-Antwort-format. Aber wir können Ihnen ein paar Tricks & Tipps...
- Egal, ob Sie die Teilnahme an einem Programmier-Kurs, oder der Unterricht selbst durch ein Lernprogramm durcharbeiten, müssen Sie alle die Programmierung der übungen, und nicht vorwärts zu bewegen, um die nächste Stufe, bis Sie verstehen, den aktuellen Schritt. Sowie den zugeordneten übungen ist es sehr hilfreich, zu schreiben, sehr viele kleine Programme, die sich auf ein oder zwei grundlegende Dinge in einer Zeit, mit viel Druck-Anweisungen, so können Sie genau verfolgen, was passiert bei jedem Schritt. Frohes Programmieren!
- Ja, kann dem nur Zustimmen mit allem, was @PM2Ring sagt. Ich werde noch einmal wiederholen - wir würden nicht wollen, um Sie aus dem Programmier -, sondern gehen für viele, viele einfache Programme, viele print-Anweisungen, verfolgen, was passiert, Zeile für Zeile auf den ersten (ich immer noch tun, wenn ich hit-Probleme habe, war die Programmierung ein-und ausschalten, ähem, 25 Jahre+ ...). Spaß haben!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre die meisten großen problem hier ist, dass Sie nicht haben, die fließen direkt in Bezug auf die Zuordnung Ihrer Ergebnisse zu Variablen. Wie empfohlen in den Kommentaren - möchten Sie vielleicht einen Blick auf die python-Funktion-definition-tutorial-Sektion. Ich habe einige bestimmte Dinge, die Sie brauchen, um unten stehende Adresse.
Problem 1
Insbesondere müssen Sie berücksichtigen, die
return
- Anweisung. Wenn Ihre Funktion definition nicht über einreturn
- Anweisung, dann die Zuweisung einer variable das Ergebnis ist bedeutungslos. Versuchen Sie, ein Beispiel:Könnte man erwarten, dass
2
- in der Tat sehen SieNone
, da die Funktion nichts zurückgibt. Wenn Sie es ändern, so dass es liest:wirst du jetzt bekommen Ausgabe
2
. Ihre Funktionenfilename()
undoutput()
darunter leiden.Problem 2
Können Sie nur die Werte der Variablen in einem code-block, wenn Sie bereits zugewiesen wurden.
Zum Beispiel - betrachten Sie das folgende sehr einfache Programm
Dadurch wird ein Fehler in einer ähnlichen Art und Weise zu Ihrem Programm, weil Sie
in_from_above
ist nicht eine variable, die definiert wurde, in Ihrem Programm. Wenn Sie es zu ändern:wird es ausgegeben wird die Meldung zurückgegeben. Dieses problem wirkt sich auf Ihre Sequenz in
main()
, beginnend mit dem Versuch zu sendenlword
zu denanagramlist()
Funktion, wenn Sie nicht mit beliebigen zugewiesenen Wert zulword
innerhalb dermain()
Funktion.Hinweis ich kann sehen, Sie haben einen Wert zugewiesen zu
lword
imfilename()
Funktion. Man könnte erwarten, dass die Zuordnung zur Verfügung stehen, um diemain()
Funktion. Wird es nicht. Dies ist zu tun mit einem so genannten variable scoping. Im Allgemeinen in Python, Variablen werden lokalen erhältlich, oder nur in der code-block in dem Sie definiert sind und zugeordnet werden können. Die andere Art von variable ist eine globalen variable - wo die Variablen stehen für code-Programm breit. Sie können explizit eine Zuweisung innerhalb einer Funktionglobal
, aber ich kann mit einiger Gewissheit sagen, dass Sie nicht brauchen zu tun, dass Sie für diese Aufgabe und würde empfehlen, Sie nicht. Scoping diskutiert wird, sehr kurz in der Python-docs hier. Scoping ist ein grundlegendes programmierkonzept und verbringen einige Zeit bekommen, Ihren Kopf um. Spielen, um mit einigen einfachen Beispielen - verwenden Sie die gleichen Namen von Variablen innerhalb und außerhalb von Funktionen, sehen, was Sie bekommen etc.Allgemeinen Bemerkung
Wenn Sachen schief geht, Debuggen, vereinfachen Sie Ihre Fälle und wissen, wohin Sie gehen, falsch. Sie können sehen, ich habe gezeigt, die wichtigsten Probleme, die Sie haben mit sehr einfachen Fällen. Sie können das gleiche tun. Die Logik in Ihren Funktionen möglicherweise oder möglicherweise nicht genau so funktioniert, wie Sie wollen, aber solange du diese Grundlagen sortiert, wird es unmöglich sein, zu Debuggen komplizierter Fälle.
Bearbeiten - Empfehlung
Nur noch einen Blick über deinen code und ich würde auch empfehlen, das aufteilen der Funktionen für #1 und #2, d.h. eine Funktion in Kleinbuchstaben, Ihrem Wörterbuch und der andere die unteren Fall Benutzereingaben. Es ist nicht wichtig, aber es wird Ihr code leichter zu verstehen und Ihr das Leben zu erleichtern.
(
- Sie nennen es. Wenn Sie schreibenvar_name = function_name(parameter)
Sie die Funktion aufrufenfunction_name
, indem er die variableparameter
und speichern das Ergebnis (was nach seinerreturn
- Anweisung) invar_name
. Wenn entwederfunction_name
existiert nicht, da eine Funktion in der Datei, oderparameter
hat sich nicht schon ein Wert zugewiesen wird in Ihrermain
Funktion, erhalten Sie eineNameError