Eingabe mehrerer Zeilen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
qw3rtz
User
Beiträge: 8
Registriert: Donnerstag 31. Oktober 2013, 09:36

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?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Benutze eine Schleife.
Das Leben ist wie ein Tennisball.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
qw3rtz
User
Beiträge: 8
Registriert: Donnerstag 31. Oktober 2013, 09:36

Ok und welche andere Lösung gäbe es? Denn die Eingabe es soll nicht auf eine vorbestimmte Anzahl an Zeilen beschränkt sein.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@qw3rtz: es gibt auch while-Schleifen
qw3rtz
User
Beiträge: 8
Registriert: Donnerstag 31. Oktober 2013, 09:36

Ok danke. Eine Frage gleich hinterher: Was muss man machen, damit in der Shell die input-Eingabe erneut aufgefordert wird? Also damit das Programm von vorn beginnt.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Ein Python Tutorial mal lesen?!
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
qw3rtz
User
Beiträge: 8
Registriert: Donnerstag 31. Oktober 2013, 09:36

Genau dort habe ich nur gelesen, dass man es mithilfe einer range-Funktion machen kann. Nur die ist begrenzt, wenn ich sowas eingebe wie:
for p in range(0,2):
...
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@qw3rtz: Dann mußt Du wohl das Tutorial weiter bis zur while-Schleife lesen :P .
BlackJack

Wenn eine bestimmte feste Eingabe die Schleife beenden soll geht auch ``for``, `raw_input()`/`input()`, und `iter()`. ;-)
garreth
User
Beiträge: 41
Registriert: Donnerstag 23. Oktober 2014, 12:04

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.

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)
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@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 :wink:

Code: Alles auswählen

def multiline_input():
    return '\n'.join(iter(input, '')) + '\n'
BlackJack

@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:

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
Ist für meinen Geschmack aber etwas viel Code. Es geht auch so:

Code: Alles auswählen

from functools import partial

def hole_mehrzeilige_eingabe(prompt):
    return list(iter(partial(input, prompt)), '')
garreth
User
Beiträge: 41
Registriert: Donnerstag 23. Oktober 2014, 12:04

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!
Antworten