Hvis Python ikke har en ternær betingelsesoperator, er det så muligt at simulere en sådan ved hjælp af andre sprogkonstruktioner?
Ja, det blev tilføjet i version 2.5. Syntaksen for udtrykket er:
a if condition else b
Først evalueres condition
, derefter evalueres præcis en af enten a
eller b
og returneres baseret på Boolean værdien af condition
. Hvis condition
evalueres til True
, så evalueres og returneres a
, men b
ignoreres, ellers når b
evalueres og returneres, men a
ignoreres.
Dette giver mulighed for kortslutning, fordi når condition
er sand, evalueres kun a
og b
slet ikke, men når condition
er falsk, evalueres kun b
og a
slet ikke.
For eksempel:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
Bemærk, at conditionals er et udtryk, ikke en statement. Det betyder, at du ikke kan bruge assignment statements eller pass
eller andre statements inden for et betinget udtryk:
>>> pass if False else x = 3
File "<stdin>", line 1
pass if False else x = 3
^
SyntaxError: invalid syntax
Du kan dog bruge betingede udtryk til at tildele en variabel på følgende måde:
x = a if True else b
Tænk på det betingede udtryk som et skift mellem to værdier. Det er meget nyttigt, når du er i en "den ene eller den anden værdi"-situation, det men gør ikke meget andet.
Hvis du skal bruge udsagn, skal du bruge et normalt if
udsagn i stedet for et betinget udtryk.
Husk på at det er misbilliget af nogle Pythonistaer af flere grunde:
condition ? a : b
fra mange andre sprog (såsom C, C++, Go, Perl, Ruby, Java, Javascript osv.), hvilket kan føre til fejl, når folk, der ikke er bekendt med Pythons "overraskende" opførsel, bruger den (de kan vende argumenternes rækkefølge om).if
" kan være rigtig nyttig og gøre dit script mere kortfattet, komplicerer det virkelig din kode)Hvis du har problemer med at huske rækkefølgen, så husk at når du læser højt, så siger du (næsten) det du mener. F.eks. x = 4 if b > 8 else 9
læses højt som x vil være 4 hvis b er større end 8 ellers 9
.
Officiel dokumentation:
For versioner før 2.5 er der et trick:
[expression] and [on_true] or [on_false]
Det kan give forkerte resultater, når on_true
har en falsk boolsk værdi.1
Selv om det har den fordel, at udtrykkene evalueres fra venstre mod højre, hvilket efter min mening er mere klart.
Fra dokumentationen:
Betingede udtryk (nogle gange kaldet en "ternær operatør") har den laveste prioritet af alle Python-operationer.
Udtrykket
x if C else y
evaluerer først betingelsen, C (not x); hvis C er sandt, evalueres x, og dets værdi returneres; ellers evalueres y, og dets værdi returneres.Se PEP 308 for flere detaljer om betingede udtryk.
Nyt siden version 2.5.