Eine Zeile if-Bedingung-Zuordnung


140

Ich habe den folgenden Code

num1 = 10
someBoolValue = True

Ich brauche den Wert einstellen num1zu , 20wenn someBoolValueist True; und nichts anderes tun. Also, hier ist mein Code dafür

num1 = 20 if someBoolValue else num1

Gibt es eine Möglichkeit, das ...else num1Teil zu vermeiden , damit es sauberer aussieht? Ein Äquivalent zu

if someBoolValue:
    num1 = 20

Ich habe versucht, es ...else passwie folgt zu ersetzen : num1=20 if someBoolValue else pass. Ich bekam nur einen Syntaxfehler. Ich konnte den ...else num1Teil auch nicht einfach weglassen .


2
Ändern Sie einfach alles auf num1 = 20 if someBoolValue else 10. Dann speichern Sie auch die num1=10Zeile?
Thomas Ahle

Vielen Dank. Dies ist jedoch nicht genau mein Code. Ich meinte, dass num1es das schon gibt ...
bdhar

Antworten:


194

Ich denke nicht, dass dies in Python möglich ist, da das, was Sie tatsächlich versuchen, wahrscheinlich auf Folgendes erweitert wird:

num1 = 20 if someBoolValue else num1

Wenn Sie ausschließen else num1, erhalten Sie einen Syntaxfehler, da ich ziemlich sicher bin, dass die Zuweisung tatsächlich etwas zurückgeben muss.

Wie andere bereits erwähnt haben, könnten Sie dies tun, aber es ist schlecht, weil Sie sich beim nächsten Lesen dieses Codes wahrscheinlich nur verwirren werden:

if someBoolValue: num1=20

Ich bin num1 = someBoolValue and 20 or num1aus genau dem gleichen Grund kein großer Fan von . Ich muss tatsächlich zweimal darüber nachdenken, was diese Linie tut.

Der beste Weg, um tatsächlich das zu erreichen, was Sie tun möchten, ist die Originalversion:

if someBoolValue:
    num1 = 20

Der Grund, warum dies die beste Version ist, ist, dass es sehr offensichtlich ist, was Sie tun möchten, und Sie werden sich nicht verwirren oder wer auch immer später mit diesem Code in Kontakt kommen wird.

Als Randnotiz num1 = 20 if someBoolValuegilt auch gültiger Ruby-Code, da Ruby etwas anders funktioniert.


8
Gemäß PEP-308 ( docs.python.org/2.5/whatsnew/pep-308.html ) kann der bedingte Ausdruck klarer gemacht werden, wenn er in paren wie in gesetzt wird num1 = (20 if someBoolValue else num1).
Haridsv

46

Benutze das:

num1 = 20 if someBoolValue else num1

3
Dies ist, was ich verwendet habe .. und auf der Suche nach einer Alternative .. trotzdem danke !!
Bdhar

Wie rufe ich diesen Block auf? Ich meine, wie heißt es?
fuat

1
Es ist ein ternärer Operator
Chris Maes

Man sollte diesen Ansatz nicht verwenden, wenn man große Datenmengen durchläuft, da er eine unnötige Zuweisung einführt, falls wir in der else-Anweisung landen.
Dapc

21

In einer Zeile:

if someBoolValue: num1 = 20

Aber tu das nicht. Dieser Stil wird normalerweise nicht erwartet. Menschen bevorzugen die längere Form für Klarheit und Konsistenz.

if someBoolValue:
    num1 = 20

(Ebenso sollten Kamelkappen vermieden werden. Also lieber verwenden some_bool_value.)

Beachten Sie, dass ein Inline- Ausdruck some_value if predicate ohne elseTeil nicht vorhanden ist, da es keinen Rückgabewert geben würde, wenn das Prädikat falsch wäre. Ausdrücke müssen jedoch in jedem Fall einen klar definierten Rückgabewert haben. Dies unterscheidet sich von der Verwendung wie beispielsweise in Ruby oder Perl.


2
Weil es schwer zu lesen ist und Sie wahrscheinlich durch Ihren eigenen Code verwirrt werden, und das ist nie eine gute Idee.
Frost

@bdhar, warum willst du es in eine Zeile setzen? Es wird nicht schneller laufen, es wird nur schwieriger für andere Leute zu lesen sein
John La Rooy

1
@gnibbler, eigentlich kein Grund. Ich suchte nach einer kürzeren Form mit besserer Lesbarkeit.
Bdhar

17

Sie können eine der folgenden Optionen verwenden:

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal

1
Schöne
einzeilige

Wie heißt diese "Struktur"? Ich habe das in ~ 6 Monaten des Lernens von Python noch nie gesehen.
Guimoute

1
Zumindest sind dies keine Aufgaben, es sei denn, Sie stellen eine vor sie, und zweitens funktionieren sie nicht wie hier beschrieben. Der erste erstellt ein Tupel und wählt dann eines seiner Elemente nach Index aus. Es funktioniert nur für Tests, die eine Ganzzahl zwischen -1 und 1 oder True/ zurückgeben False, da booles sich um eine Unterklasse von handelt int. In allen Fällen, in denen der Test etwas zurückgibt, das nur als wahr ausgewertet wird, schlägt er mit einer Ausnahme fehl. Zweitens funktioniert man nur so lange, wie es trueValselbst nicht falsch bewertet, was dazu führen würde, dass falseVales zugewiesen wird, selbst wenn der Test wahr wäre.
Bachsau

es ist schön kurz, aber auch sehr schwierig, sicher als "empfohlenes Muster" verwendet zu werden, siehe obigen Kommentar aus Bachsau ... (also habe ich es abgelehnt)
tverrbjelke

6

Ich denke, Sie hatten gehofft, dass so etwas num1 = 20 if someBoolValuefunktionieren würde, aber das tut es nicht. Ich denke, der beste Weg ist mit der ifAussage, wie Sie sie geschrieben haben:

if someBoolValue:
    num1 = 20

5
num1 = 10 + 10*(someBoolValue is True)

Das ist meine neue endgültige Antwort. Die vorherige Antwort lautete wie folgt und war für das angegebene Problem übertrieben. Getting_too_clever == not Good. Hier ist die vorherige Antwort ... immer noch gut, wenn Sie eine Sache für Truecond und eine andere für hinzufügen möchten False:

num1 = 10 + (0,10)[someBoolValue is True]

Sie num1haben bereits einen Wert erwähnt, der in Ruhe gelassen werden sollte. Ich habe angenommen, num1 = 10da dies die erste Aussage des Beitrags ist, ist die Operation, zu der man gelangen muss, 20das Hinzufügen 10.

num1 = 10
someBoolValue = True

num1 = 10 + (0,10)[someBoolValue is True]

print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}')

produzierte diese Ausgabe

num1 = 20
someBoolValue = True

Jetzt denke ich, ich hätte antworten sollen 'num1 = 10 + 10 * (someBoolValue == True)' Problem definiert als die 'False'-Bedingung als No-Op im Grunde. Wenn Sie einen anderen Wert für "Falsch" hinzufügen möchten, passt die vorherige Antwort besser. Bearbeite ich meinen Beitrag oder mache ich das in den Kommentaren?
MikeyB


2

Wenn Sie eine Methode aufrufen möchten, wenn ein Boolescher else NoneWert wahr ist, können Sie das Trinary beenden.

>>> a=1
>>> print(a) if a==1 else None
1
>>> print(a) if a==2 else None
>>> a=2
>>> print(a) if a==2 else None
2
>>> print(a) if a==1 else None
>>>

1

Wenn eine Zeile Code wird auf jeden Fall für Sie passieren wird, Python 3.8 einleitet Zuweisungsausdrücke als „Walross Operator“ liebevoll genannt.

:=

someBoolValue and (num := 20)

Das 20wird zugewiesen, numwenn der erste boolesche Ausdruck ist True. Die Zuweisung muss hier in Klammern stehen, sonst wird ein Syntaxfehler angezeigt.

num = 10
someBoolValue = True

someBoolValue and (num := 20)
print(num) # 20

num = 10
someBoolValue = False

someBoolValue and (num := 20)
print(num) # 10

0

Für den zukünftigen Zeitreisenden von Google gibt es hier einen neuen Weg (verfügbar ab Python 3.8):

b = 1
if a := b:
    # this section is only reached if b is not 0 or false.
    # Also, a is set to b
    print(a, b)

-1

Sie können definitiv num1 = (20, wenn someBoolValue sonst num1) verwenden, wenn Sie möchten.


Duplikat der Antwort (en) oben?
Adam Smith

-1

Folgendes kann ich vorschlagen. Verwenden Sie eine andere Variable, um die if-Klausel abzuleiten und num1 zuzuweisen.

Code:

num2 =20 if someBoolValue else num1
num1=num2


-1

Sie können es so machen.

try:
    a = [i for i in [20] if False][0]
except IndexError:
    print("Do what ever you want here")

Sie können Ihr Problem auf diese Weise lösen, aber die Verwendung von 'try / Except Block' ist nicht die beste Vorgehensweise für Python.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.