Ima li Python ternarni uvjetni operator?

Ako Python nema ternarni uvjetni operator, je li moguće oponašati ga koristeći druge jezične konstrukcije?

4906
27 дек. Posvećen do 27. prosinca. 2008-12-27 11:32 '08 u 11:32 2008-12-27 11:32
@ 27 odgovora

Da, dodana je u verziji 2.5. Sintaksa izraza:

 a if condition else b 

condition se prvo procjenjuje, a zatim b izračunava točno jedan od a ili b i vraća se na temelju condition . Ako se condition procijeni kao True , onda se a ocjenjuje i vraća, ali b ignorira, ili kada b izračunava i vraća b , ali a zanemaruje.

To dopušta kratki spoj, jer kada je condition istinit, samo se ocjenjuje a b uopće ne vrednuje, a ako je condition lažno, vrednuje se samo b , a a uopće se ne vrednuje.

Na primjer:

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

Imajte na umu da su uvjetni izrazi izrazi, a ne izjave. To znači da ne možete koristiti operatore dodjele ili pass ili druge operatore u uvjetnom izrazu :

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

U ovom slučaju, trebali biste koristiti uobičajeni if umjesto uvjetnog izraza .


Imajte na umu da ga neki Pythonisti ne odobravaju iz nekoliko razloga:

  • Redoslijed argumenata razlikuje se od klasičnog condition? a: b condition? a: b Ternarno condition? a: b operatora condition? a: b condition? a: b iz mnogih drugih jezika (kao što su C, C ++, Go, Perl, Ruby, Java, Javascript, itd.), što može dovesti do pogrešaka kada ga ljudi koji ne poznaju "nevjerojatno" ponašanje Pythona koriste ( mogu promijeniti redoslijed argumenata).
  • Neki ga smatraju "glomaznim" jer se suprotstavljaju normalnom toku misli (prvo razmišljanje o stanju, a zatim o posljedicama).
  • Stilski razlozi.

Ako imate problema s pamćenjem narudžbe, zapamtite da kada čitate naglas, vi (gotovo) kažete što mislite. Na primjer, x = 4 if b > 8 else 9 pročitano naglas, jer x will be 4 if b is greater than 8 otherwise 9 .

Službena dokumentacija:

5815
27 дек. odgovor daje Vinko Vrsalović 27. prosinca. 2008-12-27 11:44 '08 u 11:44 2008-12-27 11:44

Možete indeksirati u tuple:

 (falseValue, trueValue)[test] 

test mora vratiti istinu ili laž.
Možda je sigurnije da ga uvijek izvodite kao:

border=0
 (falseValue, trueValue)[test == True] 

ili možete upotrijebiti ugrađenu bool() da biste zajamčili logičku vrijednost:

 (falseValue, trueValue)[bool(<expression>)] 
648
22 янв. Odgovor koji je dao Landon Kuhn 22. siječnja 2009-01-22 21:58 '09 u 21:58 2009-01-22 21:58

Za verzije do 2.5 postoji trik:

 [expression] and [on_true] or [on_false] 

Može dati netočne rezultate kada on_true ima lažnu logičku vrijednost. 1
Iako ima smisla ocjenjivati ​​izraz s lijeva na desno, što je po mom mišljenju jasnije.

<sub> 1. Postoji li trodimenzionalni operator Cs "?:"?

267
27 дек. Odgovor dao James Brady 27. prosinca 2008-12-27 13:48 '08 u 13:48 2008-12-27 13:48

expression1 ako drugo stanje izraz2

 >>> a = 1 >>> b = 2 >>> 1 if a > b else -1 -1 >>> 1 if a > b else -1 if a < b else 0 -1 
175
27 мая '10 в 10:56 2010-05-27 10:56 odgovor je dao Simon Zimmermann 27. svibnja '10. u 10:56 2010-05-27 10:56

Iz dokumentacije :

Uvjetni izrazi (ponekad nazvani "trostruki operator") imaju najniži prioritet svih Python operacija.

Izraz x if C else y ocjenjuje prvo stanje, C (ne x); ako je C istinito, x se vrednuje i vraća njegova vrijednost; u suprotnom, y se izračunava i vraća se njegova vrijednost.

Za detalje o uvjetnim izrazima pogledajte PEP 308 .

Novo od verzije 2.5.

118
27 дек. Odgovor dao Michael Burr 27. prosinca 2008-12-27 11:44 '08 u 11:44 2008-12-27 11:44

Operator uvjetnog izraza u Pythonu dodan je 2006. kao dio Python Enhancement Proposal 308 . Njegov oblik se razlikuje od uobičajenog operatora ?:

 <expression1> if <condition> else <expression2> 

što je ekvivalentno:

 if <condition>: <expression1> else: <expression2> 

Evo primjera:

 result = x if a > b else y 

Još jedna sintaksa koju možete koristiti (kompatibilna s verzijama do 2.5):

 result = (lambda:y, lambda:x)[a > b]() 

gdje se operandi lijeno procjenjuju .

Drugi je način indeksirati tuple (koji nije u skladu s uvjetnim operatorom većine drugih jezika):

 result = (y, x)[a > b] 

ili jasno konstruiran rječnik:

 result = {True: x, False: y}[a > b] 

Drugi (manje pouzdan), ali jednostavniji način je korištenje operatora and i or :

 result = (a > b) and x or y 

međutim, to ne radi ako je x False .

Moguće zaobilazno rješenje je izrada popisa ili brojeva x i y , kao što je prikazano u nastavku:

 result = ((a > b) and [x] or [y])[0] 

ili

 result = ((a > b) and (x,) or (y,))[0] 

Ako radite s rječnicima, umjesto pomoću ternarnog uvjetnog izraza, možete koristiti get(key, default) , na primjer:

 shell = os.environ.get('SHELL', "/bin/sh") 

Izvor: ?: U Pythonu na Wikipediji

90
05 мая '15 в 15:00 2015-05-05 15:00 odgovor je dao kenorb 05. svibnja u 15:00 sati 2015-05-05 15:00

@up:

Na žalost,

 (falseValue, trueValue)[test] 
odluka

nema ponašanje kratkog spoja; dakle, i falseValue i trueValue se procjenjuju bez obzira na stanje. To može biti suboptimalno ili čak pogrešno (tj. I trueValue i falseValue mogu biti metode i imati nuspojave).

Jedno rješenje bi bilo

 (lambda: falseValue, lambda: trueValue)[test]() 

(izvršenje se odgađa dok se ne zna pobjednik;)), ali uvodi nedosljednost između pozvanih i ne-nazvanih objekata. Osim toga, ne rješava problem pri korištenju svojstava.

Dakle, priča - izbor između tri spomenuta rješenja - je kompromis između funkcije kratkog spoja pomoću barem pythona 2.5 (IMHO više nije problem) i ne podliježe "trueValue-estimation-to-false".

85
06 дек. Odgovor daje gorsky 06 dec. 2009-12-06 14:51 '09 u 14:51 2009-12-06 14:51

Za Python 2.5 i novije, postoji određena sintaksa:

 [on_true] if [cond] else [on_false] 

U starim Pythonima trostruki operator nije implementiran, ali se može oponašati.

 cond and on_true or on_false 

Iako postoji potencijalni problem, koji se, ako je cond ocijenjen kao True a on_true , vrednuje kao False , on_true vraća umjesto on_false . Ako želite da ova metoda bude u redu, inače upotrijebite ovo:

 {True: on_true, False: on_false}[cond is True] # is True, not == True 

koje se mogu omotati:

 def q(cond, on_true, on_false) return {True: on_true, False: on_false}[cond is True] 

i koristi se na sljedeći način:

 q(cond, on_true, on_false) 

Kompatibilan je sa svim verzijama Pythona.

54
25 апр. Odgovori Paolo 25 apr. 2012-04-25 14:40 '12 u 14:40 2012-04-25 14:40

Ternarni operator u različitim programskim jezicima

Ovdje samo pokušavam pokazati neke važne razlike u ternary operator između nekoliko programskih jezika.

Ternary operator u Javascriptu

 var a = true ? 1 : 0; # 1 var b = false ? 1 : 0; # 0 

Trojanski operater u rubinu

 a = true ? 1 : 0 # 1 b = false ? 1 : 0 # 0 

Ternarni operater u Scali

 val a = true ? 1 | 0 # 1 val b = false ? 1 | 0 # 0 

Ternarni operator u R-programiranju

 a <- if (TRUE) 1 else 0 # 1 b <- if (FALSE) 1 else 0 # 0 

Ternarni operator u Pythonu

 a = 1 if True else 0 # 1 b = 1 if False else 0 # 0 
50
21 авг. odgovor daje Simplans 21 aug. 2016-08-21 20:56 16 u 8:56 sati 2016-08-21 20:56

Često možete pronaći

 cond and on_true or on_false 

ali to dovodi do problema kada je on_true == 0

 >>> x = 0 >>> print x == 0 and 0 or 1 1 >>> x = 1 >>> print x == 0 and 0 or 1 1 

gdje očekujete za normalnog ternarnog operatera taj rezultat

 >>> x = 0 >>> print 0 if x == 0 else 1 0 >>> x = 1 >>> print 0 if x == 0 else 1 1 
35
14 янв. Odgovor daje Benoit Bertholon 14. siječnja. 2013-01-14 18:56 '13 u 18:56 2013-01-14 18:56

Apsolutno, i nevjerojatno je lako razumjeti.

 general syntax : first_expression if bool_expression_is_true else second_expression Example: x= 3 if 3 > 2 else 4 # assigns 3 to x if the boolean expression evaluates to true or 4 if it is false 
30
15 июля '15 в 14:33 2015-07-15 14:33 odgovor se daje BattleDrumu 15. srpnja '15. u 14:33 sati 2015-07-15 14:33

Ima li Python ternarni uvjetni operator?

Da. Iz gramatičke datoteke :

 test: or_test ['if' or_test 'else' test] | lambdef 

Dio interesa:

 or_test ['if' or_test 'else' test] 

Dakle, ternarna uvjetna operacija ima oblik:

 expression1 if expression2 else expression3 

expression3 će se procjenjivati ​​lijen (tj., procijenjen je samo ako je expression2 lažan u boolean kontekstu). Zbog rekurzivne definicije možete ih beskrajno povezati (iako se to može smatrati lošim stilom.)

 expression1 if expression2 else expression3 if expression4 else expression5 # and so on 

Napomena o upotrebi:

Imajte na umu da svaki, if je slijedi else . Za ljude koji proučavaju popis koncepata i izraza generatora, ovo može izgledati kao teška lekcija za učenje - sljedeće neće funkcionirati, budući da Python očekuje treći izraz za drugo:

 [expression1 if expression2 for element in iterable] # ^-- need an else here 

koja podiže SyntaxError: invalid syntax . Dakle, gore spomenuto je ili nepotpuna logika (možda korisnik očekuje da op nije lažna), ili da se može koristiti, izraz2 kao filtar - napominje da je sljedeće legitimno Python:

 [expression1 for element in iterable if expression2] 

expression2 radi kao filtar za razumijevanje popisa i nije ternarni uvjetni operator.

Alternativna sintaksa za uži slučaj:

Možda će vam biti pomalo bolno pisati sljedeće:

 expression1 if expression1 else expression2 

expression1 mora se procijeniti dvaput pomoću gore navedene upotrebe. Može ograničiti zalihost ako je to samo lokalna varijabla. Međutim, opći i sintaktički pithonic idiom za ovaj slučaj uporabe je koristiti kraticu or :

 expression1 or expression2 

što je ekvivalentno u semantici. Imajte na umu da neki stilski vodiči mogu ograničiti ovu uporabu na temelju jasnoće - ona zaista pridaje veliku važnost vrlo maloj sintaksi.

26
17 нояб. odgovor je dao Aaron Hall 17. studenog. 2015-11-17 22:14 '15 u 22:14 sati 2015-11-17 22:14

Simulacija pitonskog ternarnog operatora.

Na primjer

 a, b, x, y = 1, 2, 'a greather than b', 'b greater than a' result = (lambda:y, lambda:x)[a > b]() 

izlaz:

 'b greater than a' 
17
20 нояб. odgovor je dao Sasikiran Vaddi 20 nov. 2013-11-20 13:44 '13 u 13:44 2013-11-20 13:44

To možete učiniti: -

[condition] and [expression_1] or [expression_2] ;

Primjer: -

print(number%2 and "odd" or "even")

Ispisat će se "neparno" ako je broj neparan ili "paran" ako je broj paran.


Rezultat: - Ako je uvjet istinit, izvršava se exp_1, inače se izvršava exp_2.

Napomena: - 0, None, False, emptylist, emptyString se ocjenjuje kao False. Svi podaci osim 0 su True.

Evo kako to radi:

ako uvjet [uvjet] postane "true", tada će se izraz_1 procijeniti, ali ne i izraz_2. Ako smo "i" nešto s 0 (nula), rezultat će uvijek biti nestabilan. Dakle, u izrazu ispod

 0 and exp 

Izraz exp uopće neće biti procijenjen, jer će se "i" s 0 uvijek vrednovati na nulu i nema potrebe ocjenjivati ​​izraz. Tako sam kompajler radi na svim jezicima.

 1 or exp 

exp uopće neće biti vrednovan, budući da će "ili" s 1 uvijek biti 1. Stoga neće vrednovati exp, jer će rezultat biti 1. (metode optimizacije kompajlera).

Ali u slučaju

 True and exp1 or exp2 

Drugi izraz exp2 neće biti vrednovan, jer True and exp1 će biti True ako exp1 nije netočan.

Slično tome u

 False and exp1 or exp2 

Izraz exp1 neće se vrednovati, jer je False ekvivalentan pisanju 0, a "i" s 0 bit će 0, ali nakon exp1, jer koristi "ili", on će procijeniti izraz exp2 nakon "ili".


Napomena: - Ova vrsta grananja s upotrebom "ili" i "i" može se koristiti samo ako izraz_1 nema istinsku vrijednost False (bilo 0 ili None ili emptylist []] ili ispražnjeno ''.), Jer ako izraz_1 postane False , izraz_2 će se procijeniti zbog prisutnosti "ili" između exp_1 i exp_2.

Ako i dalje želite raditi u svim slučajevima, bez obzira na to što su exp_1 i exp_2 istiniti, učinite sljedeće: -

[condition] and ([expression_1] or 1) or [expression_2] ;

15
20 авг. Odgovor daje Natesh bhat 20. kolovoza. 2017-08-20 10:31 '17 u 10:31 2017-08-20 10:31

Ternarni uvjetni operator vam jednostavno dopušta da testirate stanje na jednoj liniji, zamjenjujući multi-line if-else, čineći kod kompaktan.

sintaksa:

[on_true] if [izraz] else [on_false]

1. Jednostavan način korištenja ternarnog operatora:

 # Program to demonstrate conditional operator a, b = 10, 20 # Copy value of a in min if a < b else copy b min = a if a < b else b print(min) # Output: 10 

2 - Izravna metoda upotrebe toraka, rječnika i lambda:

 # Python program to demonstrate ternary operator a, b = 10, 20 # Use tuple for selecting an item print( (b, a) [a < b] ) # Use Dictionary for selecting an item print({True: a, False: b} [a < b]) # lamda is more efficient than above two methods # because in lambda we are assure that # only one expression will be evaluated unlike in # tuple and Dictionary print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10 

3- Ternarni operator može biti napisan kao ugniježđeni if-else:

 # Python program to demonstrate nested ternary operator a, b = 10, 20 print ("Both a and b are equal" if a == b else "a is greater than b" if a > b else "b is greater than a") 

Gore navedeni pristup može se napisati kao:

 # Python program to demonstrate nested ternary operator a, b = 10, 20 if a != b: if a > b: print("a is greater than b") else: print("b is greater than a") else: print("Both a and b are equal") # Output: b is greater than a 
14
04 апр. Odgovor dao Ali Hallaji 04. travnja 2018-04-04 17:02 '18 u 5:02 pm 2018-04-04 17:02

Više tragova od odgovora (nema potrebe ponavljati očigledno vrijeme za vrijeme), ali ponekad ga koristim kao oznaku onelinera u takvim konstrukcijama:

 if conditionX: print('yes') else: print('nah') 

postaje:

 print('yes') if conditionX else print('nah') 

Neki (mnogi :) mogu ga podcijeniti kao ne-pitonske (čak i ruby-ish :), ali ja osobno smatram da je to prirodnije - to jest, kako to obično izražavate, plus malo više vizualno atraktivno u velikim blokovima koda.

12
11 мая '16 в 10:13 2016-05-11 10:13 odgovor je dao Todor Minakov 11. svibnja 2011. u 10:13 sati 2016-05-11 10:13

Da, možete ga koristiti na sljedeći način:

 is_fat = True state = "fat" if is_fat else "not fat" 

Više informacija o terminalnom uvjetnom operatoru

10
10 июня '17 в 16:14 2017-06-10 16:14 Odgovor daje Daniel Taub 10. lipnja 2006. u 4:14 2017-05-06-10 16:14
 In [1]: a = 1 if False else 0 In [2]: a Out[2]: 0 In [3]: b = 1 if True else 0 In [4]: b Out[4]: 1 
10
odgovor je dan volu. 2014-05-07 16:02 07 Svibanj '14 u 16:02 2014-05-07 16:02
 a if condition else b 

Samo zapamtite ovu piramidu, ako imate bilo kakvih problema s pamćenjem:

  condition if else ab 
6
06 дек. odgovor dati shivtej 06 prosinca. 2018-12-06 17:45 '18 u 17:45 sati 2018-12-06 17:45

DA, python ima ternarni operator, ovdje je sintaksa i uzorak koda za prikazivanje istog :)

 #[On true] if [expression] else[On false] # if the expression evaluates to true then it will pass On true otherwise On false a= input("Enter the First Number ") b= input("Enter the Second Number ") print("A is Bigger") if a>b else print("B is Bigger") 
5
21 окт. Odgovor dao PythonLover 21. listopada 2018-10-21 23:14 '18 u 23:14 sati 2018-10-21 23:14

Sintaksa: Ternary operator će biti predstavljen kao:

 [on_true] if [expression] else [on_false] 

na primjer

 x, y = 25, 50 big = x if x < y else y print(big) 
4
02 июля '18 в 8:37 2018-07-02 08:37 odgovor je dan Saurabh Chandra Patel 02. srpnja u 8:37 sati 2018-07-02 08:37

Da.

 >>> b = (True if 5 > 4 else False) >>> print b True 
4
16 марта '16 в 19:36 2016-03-16 19:36 odgovor je dao Alejandro Blasco 16. ožujka '16. u 19:36 2016-03-16 19:36

Postoji trostruka opcija, kao što je naznačeno u drugim odgovorima, ali možete je i oponašati s "ili" ako provjerite vrijednost boolean ili None:

 >>> a = False >>> b = 5 >>> a or b 5 >>> a = None >>> a or b 5 
1
08 дек. Odgovoriti Mjau 08 2016-12-08 22:05 '16 u 22:05 2016-12-08 22:05

Da:

Pretpostavimo da želite dodijeliti varijablu x nekoj vrijednosti ako je neki bool istinit i slično

X = 5, ako je nešto drugo x = 10

X = [neka vrijednost], ako [ako je to istina, prva vrijednost vrednuje] drugo [druga vrijednost vrednuje]

1
14 мая '18 в 9:25 2018-05-14 09:25 odgovor je dao Elad Goldenberg 14. svibnja u 9:25 sati 2018-05-14 09:25

Mnogi programski jezici izvedeni iz C obično imaju sljedeću sintaksu ternarnog uvjetnog izraza:

 <condition> ? <expression1> : <expression2> 

Prvo, Python B enevolent D ictator F ili L Ife (mislim Guido van Rossum, naravno) ga je odbacio (kao ne proročki stil), jer je prilično teško razumjeti za ljude koji nisu navikli na C jezik. Osim toga, znak za dvotočku : već se puno koristi u Python . Nakon odobrenja PEP 308, Python napokon dobio svoj vlastiti uvjetni izraz (koji trenutno koristimo):

 <expression1> if <condition> else <expression2> 

Dakle, prvo, on procjenjuje stanje. Ako se vrati True , izraz1 će se procijeniti da bi se dobio rezultat, inače će se izraz2 procijeniti. Zbog mehanike Lazy Evaluation , izvršit će se samo jedan izraz.

Evo nekoliko primjera (uvjeti će se ocjenjivati ​​s lijeva na desno):

 pressure = 10 print('High' if pressure < 20 else 'Critical') # Result is 'High' 

Ternarni operatori mogu biti povezani u seriju:

 pressure = 5 print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical') # Result is 'Normal' 

Sljedeće je jednako prethodnom:

 pressure = 5 if pressure < 20: if pressure < 10: print('Normal') else: print('High') else: print('Critical') # Result is 'Normal' 

Nadam se da ovo pomaže.

1
25 дек. odgovor ARGeo 25. prosinca. 2018-12-25 16:04 '18 u 16:04 sati 2018-12-25 16:04

ako je varijabla definirana i želite provjeriti ima li vrijednost, možete samo a or b

 def test(myvar=None): # shorter than: print myvar if myvar else "no Input" print myvar or "no Input" test() test([]) test(False) test('hello') test(['Hello']) test(True) 

će izaći

 no Input no Input no Input hello ['Hello'] True 
0
26 апр. odgovor je dan ewink 26 Apr 2018-04-26 18:41 '18 u 18:41 sati 2018-04-26 18:41

Prije nego postavite takvo pitanje, trebali biste znati što je EBNF.

0
12 дек. Odgovor daje korisnik3481141 12. prosinca. 2018-12-12 18:33 '18 u 18:33 2018-12-12 18:33