Har Python en ternær betinget operatør?

Hvis Python ikke har en ternær betingelsesoperator, er det så muligt at simulere en sådan ved hjælp af andre sprogkonstruktioner?

Løsning

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 "", 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:

  • Argumenternes rækkefølge er forskellig fra den klassiske ternære operator 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).
  • Nogle finder det "uhåndterligt", da det går imod den normale tankegang (at tænke på betingelsen først og derefter på virkningerne).
  • Stilistiske årsager. (Selv om "inline 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:

Kommentarer (10)

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.

  1. Er der en ækvivalent til C's "?:" ternære operator?
Kommentarer (4)

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.

Kommentarer (0)