Ali ima Python ternarni pogojni operator?

Če Python nima ternarnega pogojnega operatorja, ali ga je mogoče simulirati z drugimi jezikovnimi konstrukcijami?

Rešitev

Da, v različici 2.5 je bila dodana. Sintaksa izraza je:

a if condition else b

Najprej se ovrednoti pogoj, nato se ovrednoti in vrne natanko ena od vrednosti a ali b na podlagi logične vrednosti pogoja. Če je pogoj ovrednoten kot True, se ovrednoti in vrne a, b pa se ne upošteva, ali pa se ovrednoti in vrne b, a pa se ne upošteva.

To omogoča kratek stik, saj se, kadar je pogoj resničen, ovrednoti le a, b pa se sploh ne ovrednoti, kadar pa je pogoj neresničen, se ovrednoti le b, a pa se sploh ne ovrednoti.

Na primer:

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

Upoštevajte, da so pogojniki izraz in ne izjava. To pomeni, da znotraj pogojnega izraza ne morete uporabljati stavkov za pripisovanje ali pass ali drugih izjav:

>>> pass if False else x = 3
  File "", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax

Lahko pa uporabite pogojne izraze za dodelitev spremenljivke na naslednji način:

x = a if True else b

Pogojni izraz si predstavljajte kot preklapljanje med dvema vrednostma. Zelo uporaben je, kadar ste v situaciji 'ena vrednost ali druga', vendar ne naredi veliko drugega.

Če morate uporabiti izjave, morate namesto pogojnega izraza uporabiti običajno if izjavo.


Upoštevajte, da ga nekateri pythonovci iz več razlogov ne odobravajo:

  • Vrstni red argumentov je drugačen od vrstnega reda argumentov klasičnega ternarnega operatorja condition ? a : b iz številnih drugih jezikov (kot so C, C++, Go, Perl, Ruby, Java, Javascript itd.), kar lahko povzroči napake, če ga uporabljajo ljudje, ki ne poznajo Pythonovega "presenetljivega" vedenja (lahko obrnejo vrstni red argumentov).
  • Nekaterim se zdi "neroden", saj je v nasprotju z običajnim miselnim tokom (najprej razmišljanje o pogoju in nato o učinkih).
  • Stilistični razlogi. (Čeprav je 'inline if' lahko resno uporaben in naredi vašo skripto bolj jedrnato, resnično zaplete vašo kodo).

Če si težko zapomnite vrstni red, potem se spomnite, da pri glasnem branju (skoraj) poveste, kar ste mislili. Na primer, x = 4 if b > 8 else 9 se glasno prebere kot x bo 4, če je b večji od 8, sicer 9.

Uradna dokumentacija:

Komentarji (10)

Za različice pred 2.5 je tu trik:

[expression] and [on_true] or [on_false]

Lahko da napačne rezultate, če on_true ima logično vrednost false.1 Čeprav ima to prednost, da se izrazi vrednotijo od leve proti desni, kar je po mojem mnenju bolj jasno.

  1. Ali obstaja ekvivalent C-jevega ternarnega operatorja "?:"?
Komentarji (4)

Iz [dokumentacije]:

(včasih imenovan "ternarni operator") ima med vsemi operacijami v Pythonu najnižjo prioriteto.

Izraz x if C else y najprej ovrednoti pogoj C (not x); če je C resničen, se ovrednoti x in vrne njegova vrednost; sicer se ovrednoti y in vrne njegova vrednost.

Za več podrobnosti o pogojnih izrazih glej PEP 308.

Novost od različice 2.5.

Komentarji (0)