Če Python nima ternarnega pogojnega operatorja, ali ga je mogoče simulirati z drugimi jezikovnimi konstrukcijami?
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 "<stdin>", 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:
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).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:
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 "?:"?
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.