Hallo,
ich wüsste gerne, wie man mit dem input-Befehl mehrere Zeilen untereinander eingeben kann, jeweils mit 2 Wörtern pro Zeile. Kann mir da jemand helfen?
Eingabe mehrerer Zeilen
@qw3rtz:
Das geht nicht, ein Return schließt `input` oder `raw_input` ab. Wenn Du mehrere Zeilen möchtest, musst Du das auf mehrere Eingaben aufteilen. Jedenfalls so lange Du das mit `input`/`raw_input` lösen möchtest.
mutetella
Das geht nicht, ein Return schließt `input` oder `raw_input` ab. Wenn Du mehrere Zeilen möchtest, musst Du das auf mehrere Eingaben aufteilen. Jedenfalls so lange Du das mit `input`/`raw_input` lösen möchtest.
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
Wenn eine bestimmte feste Eingabe die Schleife beenden soll geht auch ``for``, `raw_input()`/`input()`, und `iter()`.
Ich bin selber noch blutiger Neuling und habe einfach mal versucht das Programm, so wie ich dich verstanden habe, zu schreiben. Ich habe dir eine Funktion geschrieben, "m_eingabe" die so lange input aufruft bis der Benutzer "Enter" ohne Eingabe drückt. Dann gibt die Funktion den zusammengesetzen String zurück.
Achtung: Das Programm prüft nicht, welche Eingaben der Nutzer macht. Es fügt lediglich die Eingaben mit einem "\n"-Zeichen nach dem angehängten String zusammen.
Achtung: Das Programm prüft nicht, welche Eingaben der Nutzer macht. Es fügt lediglich die Eingaben mit einem "\n"-Zeichen nach dem angehängten String zusammen.
Code: Alles auswählen
# Funktion um eine Eingabe mehrzeilig auszugeben.
def m_eingabe():
# Variablen zur Ein- und Ausgabe
eingabe = "wert" # Muss mit Wert initialisiert werden, da kein Wert die Abbruchbedingung ist.
ausgabe = ""
# While-Schleife bis ohne Eingabe "Return" gedrückt wird
while(eingabe != ""):
eingabe = input("Text hier: ")
if eingabe != "":
ausgabe = ausgabe + eingabe + "\n"
return(ausgabe)
@garreth: ich halte es immer für kritisch, Variablen mit irgendwelchen magischen Werten vorzubelegen, damit eine do-while-Schleife, die es in Python ja nicht gibt in eine while-Schleife umgewandelt werden kann. Besser ist es i.A. die Abbruchbedinung am Schluss einer while-True-Schleife zu überprüfen in mit break zu verlassen. Da Du sowieso die Eingabe auf leeren String per if prüfst, würde hier sogar nur ein else-Zweig fehlen.
Weder while noch return sind Funktionen, die Klammern also überflüssig und verwirrend. Was soll denn das "m_"-Präfix bei 'eingabe'?
Das Problem ließe sich noch um einiges eleganter mit iter lösen, wie BlackJack schon angemerkt hat
Weder while noch return sind Funktionen, die Klammern also überflüssig und verwirrend. Was soll denn das "m_"-Präfix bei 'eingabe'?
Das Problem ließe sich noch um einiges eleganter mit iter lösen, wie BlackJack schon angemerkt hat
Code: Alles auswählen
def multiline_input():
return '\n'.join(iter(input, '')) + '\n'
@garreth: Der Name der Funktion ist kryptisch, man sollte nicht ohne Not irgendwelche Abkürzungen verwenden solange die nicht allgemein bekannt sind.
Ein Initialisierungswert der für ”nichts” steht ist üblicherweise `None` und nicht eine Zeichenkette mit einem willkürlichen Inhalt. Das braucht man aber alles nicht wenn man die Abbruchbedingung am Ende der Schleife testet statt am Anfang. Da Python keine dedizierte Syntax für eine nachprüfende Schleife kennt, wird hier ``while True:`` und ein ``if`` mit einem ``break`` kombiniert um die Schleife zu verlassen.
`ausgabe` ist unschön für einen *Rück*gabewert.
``while`` und ``return`` sind keine Funktionen, also sollte man das auch nicht so schreiben als wären es welche.
Das wiederholte Zusammensetzen/Erweitern von Zeichenketten in einer Schleife ist ineffizient weil Zeichenketten unveränderbar sind und jedes mal eine neue Zeichenkette erstellt werden muss in die der Inhalt der beiden alten Werte kopiert wird. Die idiomatische Lösung ist es die Teilzeichenketten in einer Liste zu sammeln und am Ende mit `str.join()` zusammen zu fügen. Allerdings würde ich hier einfach die Liste zurück geben. Dann kann der Aufrufer entscheiden ob er die Zeilen zu *einer* Zeichenkette zusammenfügen möchte.
Der Kommentar über der Funktion wäre vielleicht besser ein DocString. Der erste Kommentar in der Funktion ist überflüssig. Ich lande dann bei so etwas:
Ist für meinen Geschmack aber etwas viel Code. Es geht auch so:
Ein Initialisierungswert der für ”nichts” steht ist üblicherweise `None` und nicht eine Zeichenkette mit einem willkürlichen Inhalt. Das braucht man aber alles nicht wenn man die Abbruchbedingung am Ende der Schleife testet statt am Anfang. Da Python keine dedizierte Syntax für eine nachprüfende Schleife kennt, wird hier ``while True:`` und ein ``if`` mit einem ``break`` kombiniert um die Schleife zu verlassen.
`ausgabe` ist unschön für einen *Rück*gabewert.
``while`` und ``return`` sind keine Funktionen, also sollte man das auch nicht so schreiben als wären es welche.
Das wiederholte Zusammensetzen/Erweitern von Zeichenketten in einer Schleife ist ineffizient weil Zeichenketten unveränderbar sind und jedes mal eine neue Zeichenkette erstellt werden muss in die der Inhalt der beiden alten Werte kopiert wird. Die idiomatische Lösung ist es die Teilzeichenketten in einer Liste zu sammeln und am Ende mit `str.join()` zusammen zu fügen. Allerdings würde ich hier einfach die Liste zurück geben. Dann kann der Aufrufer entscheiden ob er die Zeilen zu *einer* Zeichenkette zusammenfügen möchte.
Der Kommentar über der Funktion wäre vielleicht besser ein DocString. Der erste Kommentar in der Funktion ist überflüssig. Ich lande dann bei so etwas:
Code: Alles auswählen
def hole_mehrzeilige_eingabe(prompt):
ergebnis = list()
while True:
eingabe = input(prompt)
if not eingabe:
break
ergebnis.append(eingabe)
return ergebnis
Code: Alles auswählen
from functools import partial
def hole_mehrzeilige_eingabe(prompt):
return list(iter(partial(input, prompt)), '')
Hallo Sirius3 und Blackjack, vielen Dank für eure Verbesserungen. Eure Lösungen sind wohl deutlich besser als meine, wenn ich jetzt meine Lösung umarbeite lande ich auch bei dem was Blackjack schon gepostet hatte.
Mit der Namensgebung von Variablen und Funktionen werde ich mich wohl noch etwas beschäftigen müssen. Auch Kommentare mache ich noch zu viele unnütze. Die Klammern sind dem Umstand geschuldet, dass ich zwischenzeitlich etwas in C gecodet hatte und dann schleichen die sich manchmal einfach ein.
Die Daten in einer Liste zu speichern hatte ich mir auch schon überlegt, bin dann aber zu dem Ergebnis gekommen, dass dies für den TE wohl eher hinderlich als förderlich ist.
Vielen Dank also nochmal!
Mit der Namensgebung von Variablen und Funktionen werde ich mich wohl noch etwas beschäftigen müssen. Auch Kommentare mache ich noch zu viele unnütze. Die Klammern sind dem Umstand geschuldet, dass ich zwischenzeitlich etwas in C gecodet hatte und dann schleichen die sich manchmal einfach ein.
Die Daten in einer Liste zu speichern hatte ich mir auch schon überlegt, bin dann aber zu dem Ergebnis gekommen, dass dies für den TE wohl eher hinderlich als förderlich ist.
Vielen Dank also nochmal!