Wie füge ich mehrere Anweisungen in eine Zeile ein?

143

Ich war mir nicht sicher, unter welchem ​​Titel ich genau über diese Frage nachdenken sollte. Das Codieren von Golf scheint angemessen, wenn auch etwas unspezifisch.

Ich kenne ein bisschen Verständnis für Python, aber sie scheinen sehr schwer zu "lesen". So wie ich es sehe, kann ein Verständnis dasselbe erreichen wie der folgende Code:

for i in range(10): if i == 9: print('i equals 9')

Dieser Code ist viel einfacher zu lesen als das derzeitige Verständnis, aber ich habe festgestellt, dass Sie nicht zwei ':' in einer Zeile haben können ... das bringt mich auch ...

meine Frage:

Gibt es eine Möglichkeit, das folgende Beispiel in ONE LINE aufzunehmen?

try:
    if sam[0] != 'harry':
        print('hello',  sam)
except:
    pass

So etwas wäre toll:

try: if sam[0] != 'harry': print('hellp',  sam)
except:pass

Aber wieder stoße ich auf das widersprüchliche ':' Ich würde auch gerne wissen, ob es eine Möglichkeit gibt, einen Versuch (oder etwas Ähnliches) ohne Ausnahme auszuführen. Es scheint völlig sinnlos, dass ich Ausnahme setzen muss: Pass dort hinein. Es ist eine verschwendete Linie.

Vielen Dank für Ihre Eingabe ... und hier haben Sie einen Smiley : D.

Rhys
quelle
Warum sollte es jemals eine Ausnahme werfen?
Ignacio Vazquez-Abrams
1
sam [2] existiert möglicherweise nicht. Es ist ein hypothetisches Beispiel. danke
Rhys
4
Verständnis ist in Python etwas anderes. Alles in eine Zeile zu setzen ist kein Verständnis.
Felix Kling
Mir ist das ja bewusst. Vielen Dank. Ich habe nur demonstriert, wie ich denke, dass Verständnis besser funktionieren könnte, aber aufgrund des Doppelpunkts, der die Wurzel meines Problems / meiner Frage ist, nicht
Rhys
Verwenden Sie einfach \ns und Leerzeichen für Einrückungen.

Antworten:

144

Leider ist das, was Sie wollen, mit Python nicht möglich (was Python für einzeilige Befehlszeilenprogramme nahezu unbrauchbar macht). Selbst die explizite Verwendung von Klammern vermeidet die Syntaxausnahme nicht. Sie können mit einer Folge einfacher Anweisungen davonkommen, die durch ein Semikolon getrennt sind:

for i in range(10): print "foo"; print "bar"

Sobald Sie jedoch ein Konstrukt hinzufügen, das einen eingerückten Block (wie if) einführt , benötigen Sie den Zeilenumbruch. Ebenfalls,

for i in range(10): print "i equals 9" if i==9 else None

ist legal und kann ungefähr das sein, was Sie wollen.

Was die try ... exceptSache betrifft: Ohne die wäre es völlig nutzlos except. trysagt "Ich möchte diesen Code ausführen, aber es könnte eine Ausnahme auslösen". Wenn Sie sich nicht für die Ausnahme interessieren, lassen Sie das weg try. Aber sobald Sie es eingeben, sagen Sie "Ich möchte eine mögliche Ausnahme behandeln". Das passsagt dann, dass Sie nicht speziell damit umgehen möchten. Dies bedeutet jedoch, dass Ihr Code weiterhin ausgeführt wird, was sonst nicht der Fall wäre.

ThomasH
quelle
1
Interessant, ich denke, Ihr letztes Beispiel kommt der Antwort, nach der ich gesucht habe, am nächsten. danke
Rhys
in Bezug auf die 'try'-Frage ... Was ist, wenn ich weiß, dass es irgendwann eine Ausnahme auslösen wird, aber ich möchte nur, dass der Code weiter ausgeführt wird ... zum Beispiel, um zu überprüfen, ob eine Zeichenfolge eine Ganzzahl sein kann try: int (string) ... Wenn dies nicht möglich ist, fahren Sie einfach mit der nächsten Zeile fort, ohne dass eine Ausnahme erforderlich ist. Ich verstehe, was Sie sagen, aber gibt es eine andere Möglichkeit, die für diese Art der Überprüfung / Fehlerbehandlung geeignet ist
Rhys
4
Betreff try:: Mit den Python-Syntaxregeln können Sie einfach nicht mit einer einzigen "try" -Klausel davonkommen, ohne die "Except" -Klausel zu begleiten. Was ich tue, ist, das try-außer in eine eigene Funktion einzupacken und dies stattdessen aufzurufen. Wie if (checkint(s))...und def checkint(s): try: int(s)\nreturn True\nexcept: return False.
ThomasH
ThomasH, ich wünschte, Ihr Kommentar wäre irgendwo eine Antwort auf eine Frage, damit ich sie positiv bewerten könnte. Ausgezeichnet.
Ivan X
5
@ThomasH " (was Python für Befehlszeilen-Einzeilerprogramme nahezu unbrauchbar macht) ": hindert mich nicht daran. 95% der Fälle benötigen keine neue Leitung. Und der Rest via \ n: python -c "exec\"print 'A' \nfor i in 1,2,3: print i \""
kxr
52

Sie können die integrierte exec-Anweisung verwenden, z.

exec("try: \n \t if sam[0] != 'harry': \n \t\t print('hello',  sam) \nexcept: pass")

Wo \nist eine neue Zeile und \twird als Einrückung verwendet (eine Registerkarte).
Außerdem sollten Sie die von Ihnen verwendeten Leerzeichen zählen, damit Ihre Einrückung genau übereinstimmt.

Doch wie alle anderen Antworten bereits sagte, ist dies natürlich nur dann verwendet werden , wenn Sie wirklich haben es auf eine Zeile gestellt.

exec ist eine ziemlich gefährliche Aussage (insbesondere beim Erstellen einer Webanwendung), da sie die Ausführung von beliebigem Python-Code ermöglicht.

elecprog
quelle
4
Danke dir! Dies sollte als die richtige Antwort markiert werden, da es im Gegensatz zu den anderen tatsächlich funktioniert. Aber natürlich tun Sie dies niemals , es sei denn, Sie müssen! Ich brauche diese Syntax jedoch tatsächlich, da ich Skripte in ein festes einzeiliges Textfeld eingeben muss.
Sanjay Manohar
Vielen Dank ! Lebensretter! Ich verwende dies nicht in meinem Skript, aber in der interaktiven Shell ist dies nützlich zum Debuggen ... Ich beende die interaktive Shell oft einfach und starte sie neu, um eine saubere Umgebung zu erhalten. Dann muss ich bestimmte Schritte wiederholen, dh a importieren Modul, einige Funktionen ausführen und dann einige Tests mit einer bestimmten Funktion durchführen. Soooo, ich suchte nach einer Möglichkeit, "Importieren eines Moduls, Ausführen einiger Funktionen" in einen Oneliner zu integrieren, damit ich es schnell aus dem Verlauf zurückrufen und ausführen kann (anstatt 5 verschiedene Elemente aus dem Verlauf zurückrufen zu müssen). +1
oneindelijk
exec("try: \n if sam[0] != 'harry': print('hello', sam) \nexcept: pass") schöner :)
kxr
Danke kxr :) (Ich habe deine Idee benutzt, um die Antwort zu verbessern)
elecprog
6

Ich empfehle dies nicht zu tun ...

Was Sie beschreiben, ist kein Verständnis.

PEP 8 Style Guide für Python - Code , die ich tun empfehlen, hat diese auf zusammengesetzte Anweisungen zu sagen:

  • Von zusammengesetzten Anweisungen (mehrere Anweisungen in derselben Zeile) wird im Allgemeinen abgeraten.

Ja:

      if foo == 'blah':
          do_blah_thing()
      do_one()
      do_two()
      do_three()

Lieber nicht:

      if foo == 'blah': do_blah_thing()
      do_one(); do_two(); do_three()

Hier ist ein Beispielverständnis, um die Unterscheidung zu treffen:

>>> [i for i in xrange(10) if i == 9]
[9]
Johnsyweb
quelle
6

Ja, dieser Beitrag ist 8 Jahre alt, aber falls hier jemand auftaucht und nach einer Antwort sucht: Sie können jetzt nur Semikolons verwenden. Sie können jedoch keine if / elif / else-Stamente für / while-Schleifen verwenden und keine Funktionen definieren. Dies wird hauptsächlich verwendet, wenn importierte Module verwendet werden, bei denen Sie keine Funktionen definieren oder if / elif / else / for / while-Anweisungen / Schleifen verwenden müssen.

Hier ist ein Beispiel, das den Künstler eines Songs, den Songnamen, nimmt und das Genie nach den Texten sucht:

import bs4, requests; song = input('Input artist then song name\n'); print(bs4.BeautifulSoup(requests.get(f'https://genius.com/{song.replace(" ", "-")}-lyrics').text,'html.parser').select('.lyrics')[0].text.strip())
symbxlz
quelle
6

Ich bin kein Anreiz dafür, aber ich sage, Sie befinden sich in der Befehlszeile, Sie haben nichts als Python und Sie brauchen wirklich einen Einzeiler. Sie können dies tun:

python -c "$(echo -e "a='True'\nif a : print 1")"

Was wir hier tun, ist die Vorverarbeitung \nvor der Auswertung von Python-Code.

Das ist super hacky! Schreiben Sie keinen Code wie diesen.

Tiago Lopo
quelle
1

vielleicht mit "und" oder "oder"

nach falscher Notwendigkeit "oder" zu schreiben

nach wahrer Notwendigkeit zu schreiben "und"

mögen

n=0
def returnsfalse():
    global n
    n=n+1
    print ("false %d" % (n))
    return False
def returnstrue():
    global n
    n=n+1
    print ("true %d" % (n))
    return True
n=0
returnsfalse() or  returnsfalse() or returnsfalse() or returnstrue() and returnsfalse()

Ergebnis:

false 1
false 2
false 3
true 4
false 5

oder vielleicht wie

(returnsfalse() or true) and (returnstrue() or true) and ...

Ich bin hierher gekommen, indem ich bei Google nach "Wie man mehrere Statements in eine Zeile Python einfügt" gesucht habe und die Frage nicht direkt beantwortet habe. Vielleicht braucht dies jemand anderes.

Shimon Doodkin
quelle
1

Für ein python -c orientierte Lösung und vorausgesetzt, Sie verwenden die Bash-Shell, können Sie eine einfache einzeilige Syntax wie in diesem Beispiel verwenden:

Angenommen, Sie möchten so etwas tun (sehr ähnlich zu Ihrer Probe, einschließlich except: passAnleitung):

python -c  "from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n" OUTPUT_VARIABLE __numpy_path

Dies wird NICHT funktionieren und diesen Fehler erzeugen:

  File "<string>", line 1
    from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n
                                                                                                                  ^
SyntaxError: unexpected character after line continuation character `

Dies liegt an der Konkurrenz zwischen Bash und Python Interpretation von \nEscape-Sequenzen. Um das Problem zu lösen, kann man die $'string'Bash-Syntax verwenden, um die \nBash-Interpretation vor der Python- Syntax zu erzwingen . Um das Beispiel herausfordernder zu gestalten, habe ich end=..\n..dem Python-Druckaufruf eine typische Python- Spezifikation hinzugefügt : Am Ende können Sie BEIDE \nInterpretationen von bash und Python erhalten, die jeweils an ihrem betreffenden Textstück zusammenarbeiten. Damit endlich die richtige Lösung lautet:

python -c  $'from __future__ import print_function\ntry:\n import numpy;\n print( numpy.get_include(), end="\\n" )\n print( "Hello" )\nexcept:pass\n' OUTPUT_VARIABLE __numpy_path

Das führt zu der richtigen sauberen Ausgabe ohne Fehler:

/Softs/anaconda/lib/python3.7/site-packages/numpy/core/include
Hello

Hinweis: Dies sollte auch bei execorientierten Lösungen funktionieren , da das Problem immer noch dasselbe ist (Wettbewerb für Bash- und Python-Dolmetscher).

Hinweis 2: Man könnte das Problem umgehen, indem man einige \ndurch einige ersetzt, ;aber es wird nicht jederzeit funktionieren (abhängig von Python-Konstrukten), während meine Lösung es erlaubt, jedes Teil eines klassischen mehrzeiligen Python-Programms immer "einzeilig" zu machen.

Anmerkung 3: Wenn man einzeilig ist, muss man sich natürlich immer um Python-Leerzeichen und Einrückungen kümmern, da wir hier tatsächlich nicht ausschließlich "einzeilig" sind, ABER eine ordnungsgemäße gemischte Verwaltung der \nEscape-Sequenz zwischen Bash und Python durchführen . So können wir mit jedem klassischen mehrzeiligen Python-Programm umgehen. Die Lösungsprobe veranschaulicht dies ebenfalls.

Pierre13fr
quelle
0

Sie mischen viele Dinge, was es schwierig macht, Ihre Frage zu beantworten. Die kurze Antwort lautet: Soweit ich weiß, ist das, was Sie tun möchten, in Python einfach nicht möglich - aus gutem Grund!

Die längere Antwort lautet, dass Sie sich mit Python vertraut machen sollten, wenn Sie in Python entwickeln möchten. Verständnis ist nicht schwer zu lesen. Sie sind vielleicht nicht daran gewöhnt, sie zu lesen, aber Sie müssen sich daran gewöhnen, wenn Sie Python-Entwickler werden möchten. Wenn es eine Sprache gibt, die Ihren Anforderungen besser entspricht, wählen Sie diese. Wenn Sie sich für Python entscheiden, sollten Sie darauf vorbereitet sein, Probleme auf pythonische Weise zu lösen. Natürlich können Sie gegen Python kämpfen, aber es wird keinen Spaß machen! ;-);

Und wenn Sie uns sagen würden, was Ihr eigentliches Problem ist, erhalten Sie möglicherweise sogar eine pythonische Antwort. "Etwas in eine Zeile bringen" ist für uns normalerweise kein Programmierproblem.

Achim
quelle
Ich liebe Python! Ich habe nur demonstriert, wie ich denke, dass das Verständnis besser strukturiert sein könnte, aber aufgrund des Doppelpunkts, der die Wurzel meines Problems / meiner Frage ist, nicht möglich ist. Ich sehe an Ihrer Antwort, dass die durch Doppelpunkte getrennten Multistatements wie try: if sam [ 0]! = 'Harry': print ('hellp', sam) ist nicht möglich ... ist das richtig? danke ... ich benutze dies nur für einige Debug-Zwecke, also suche ich nach einem kleinen einfachen Code, der einfach entfernt werden kann und nicht viel Platz beansprucht lol
Rhys
Ja, soweit ich weiß, ist das nicht möglich. Aber als jemand schon statet: Was Sie tun, ist etwas anderes als Verständnis. Wenn Sie den Code einfach entfernen möchten, fügen Sie ihn in eine Funktion ein. Denken Sie in Bezug auf das Problem "Ausgenommen: Bestehen" an einen Dekorateur, der Ausnahmen oder ähnliches ignoriert. Nochmals: Versuchen Sie immer, Ihr eigentliches Problem zu beschreiben, nicht das Problem mit der Lösung, die Sie bereits im Sinn haben. ;-)
Achim
3
Warum müssen die Leute ihre Antwort mit unaufgeforderten provokanten Aussagen wie "Sie mischen viele Dinge" beginnen? Stimmen Sie ab, wenn ich kann.
John Jiang
"Etwas in eine Zeile bringen" ist normalerweise kein Programmierproblem. "-> aber das ist oft ein Systemadministrationsproblem, daher ist die Frage in diesem Aspekt immer noch relevant.
Alex F
0

Es ist tatsächlich möglich ;-)

# not pep8 compatible^
sam = ['Sam',]
try: print('hello',sam) if sam[0] != 'harry' else rais
except: pass

Sie können sehr hässliche Sachen in Python machen wie:

def o(s):return''.join([chr(ord(n)+(13if'Z'<n<'n'or'N'>n else-13))if n.isalpha()else n for n in s])

Dies ist eine Funktion für die rot13 / cesa-Verschlüsselung in einer Zeile mit 99 Zeichen.

yamm
quelle
-2

Hier ist ein Beispiel:

für i im Bereich (80, 90): print (i, end = "") wenn (i! = 89) sonst print (i)

Ausgabe: 80 81 82 83 84 85 86 87 88 89

>

JZP
quelle