Ar „Python“ turi trijų komponentų sąlyginį operatorių?

Jei „Python“ neturi trijų komponentų sąlyginio operatoriaus, ar galima jį imituoti naudojant kitus kalbos konstruktus?

4906
27 дек. Skirta gruodžio 27 d. 2008-12-27 11:32 '08 at 11:32 2008-12-27 11:32
@ 27 atsakymai

Taip, jis buvo pridėtas 2.5 versijoje. Išraiškos sintaksė:

 a if condition else b 

Pirmiausia įvertinama sąlyga, tada apskaičiuojama ir grąžinama tiksliai viena iš a arba b atsižvelgiant į condition . Jei condition yra vertinama kaip „ True , tuomet a vertinama ir grąžinama, bet b ignoruojamas arba, kai b apskaičiuojamas ir grąžinamas, bet ignoruojamas.

Tai leidžia trumpą jungimą, nes tais condition , kai condition teisinga, tik a yra vertinamas, o b visai nėra vertinamas, o jei condition klaidinga, vertinama tik b , o a nėra įvertintas, o a nėra įvertintas.

Pavyzdžiui:

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

Atkreipkite dėmesį, kad sąlyginės išraiškos yra išraiškos, o ne pareiškimai. Tai reiškia, kad negalite naudoti priskyrimo operatorių ar pass ar kitų operatorių sąlyginėje išraiška :

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

Tokiu atveju turėtumėte naudoti įprastą, o ne sąlyginę išraišką .


Atminkite, kad kai kurie „Pythonistas“ tai nepatvirtina dėl kelių priežasčių:

  • Argumentų tvarka skiriasi nuo klasikinės condition? a: b condition? a: b Ternerio operatoriaus condition? a: b condition? a: b iš daugelio kitų kalbų (pvz., „C“, „C ++“, „Go“, „Perl“, „Ruby“, „Java“, „Javascript“ ir kt.), kurios gali sukelti klaidų, kai žmonės nepažįsta „nuostabaus“ „Python“ elgesio ( jie gali pakeisti argumentų tvarką).
  • Kai kurie mano, kad tai „sudėtinga“, nes ji prieštarauja įprastam minčių srautui (pirmas galvoja apie valstybę ir tada apie pasekmes).
  • Stilistinės priežastys.

Jei turite problemų prisimindami užsakymą, nepamirškite, kad skaitydami garsiai, jūs (beveik) sakote, ką reiškia. Pavyzdžiui, x = 4 if b > 8 else 9 yra skaitomas garsiai, nes x will be 4 if b is greater than 8 otherwise 9 .

Oficialūs dokumentai:

5815
27 дек. atsakymą pateikė „ Vinko Vrsalovic “ 27 d. 2008-12-27 11:44 '08, 11:44 2008-12-27 11:44

Galite indeksuoti į eilutę:

 (falseValue, trueValue)[test] 

test turi grįžti į teisingą arba klaidingą.
Gali būti saugiau visada atlikti jį kaip:

 (falseValue, trueValue)[test == True] 

arba galite naudoti integruotą „ bool() kad būtų užtikrinta loginė vertė:

 (falseValue, trueValue)[bool(<expression>)] 
648
22 янв. Landon Kuhn atsakymas, pateiktas sausio 22 d 2009-01-22 21:58 '09 9:58 val. 2009-01-22 21:58

Versijose iki 2,5 yra triukas:

 [expression] and [on_true] or [on_false] 

Gali būti neteisingi rezultatai, kai on_true turi klaidingą loginę vertę. 1
Nors prasminga išraiška vertinti iš kairės į dešinę, kuri, mano nuomone, yra aiškesnė.

<sub> 1. Ar yra lygiaverčio Cs "?:" trimatis operatorius?

267
27 дек. James Brady atsakymas gruodžio 27 d 2008-12-27 13:48 '08, 13:48 pm 2008-12-27 13:48

expression1, jei kita išraiška2 sąlyga

 >>> 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 Simono Zimmermanno atsakymą pateikė gegužės 27 d. 10 val. 10:56 2010-05-27 10:56

dokumentacijos :

Sąlyginės išraiškos (kartais vadinamos „trigubu operatoriumi“) turi mažiausią visų „Python“ operacijų prioritetą.

Išraiška x if C else y įvertina pirmąją sąlygą, C (ne x); jei C yra tiesa, x vertinamas ir jo vertė grąžinama; kitaip apskaičiuojamas y ir grąžinama jo vertė.

Daugiau informacijos apie sąlygines išraiškas žr. PEP 308 .

Nauja versija nuo 2.5 versijos.

118
27 дек. Michael Burr atsakymas gruodis 27 2008-12-27 11:44 '08, 11:44 2008-12-27 11:44

„Python“ sąlyginės išraiškos operatorius buvo įtrauktas į 2006 m. Kaip „ Python Enhancement“ pasiūlymo 308 dalį . Jo forma skiriasi nuo įprastų operatorių ?: , Ir tai:

 <expression1> if <condition> else <expression2> 

kuris yra lygiavertis:

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

Štai pavyzdys:

 result = x if a > b else y 

Kita sintaksė, kurią galite naudoti (suderinama su versijomis iki 2.5):

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

kur operandai yra tingiai įvertinti .

Kitas būdas yra indeksuoti paketą (kuris neatitinka daugelio kitų kalbų sąlyginio operatoriaus):

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

arba aiškiai sukurtas žodynas:

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

Kitas (mažiau patikimas), bet paprastesnis būdas yra naudoti and ir ( or operatorius:

 result = (a > b) and x or y 

tačiau tai neveikia, jei x yra False .

Galimas būdas yra sukurti sąrašus arba x ir y eilutes, kaip parodyta toliau:

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

arba

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

Jei dirbate su žodynais, vietoj trijų komponentų sąlyginės išraiškos galite naudoti get(key, default) , pavyzdžiui:

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

Šaltinis: ?: Pythone Wikipedia

90
05 мая '15 в 15:00 2015-05-05 15:00 Kenorb atsakymą pateikė gegužės 15 d. 15 val. 15:00 2015-05-05 15:00

@up:

Deja

 (falseValue, trueValue)[test] 
Sprendimas

neturi trumpojo jungimo elgesio; taigi tiek falseValue, tiek trueValue vertinami nepriklausomai nuo būklės. Tai gali būti neoptimali arba net klaidinga (t. Y. Tiek trueValue, tiek falseValue gali būti metodai ir šalutinis poveikis).

Tai būtų vienas iš sprendimų

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

(vykdymas atidedamas, kol nugalėtojas bus žinomas;)), tačiau jis įveda neatitikimą tarp iškviestų ir nekviestų objektų. Be to, jis neišsprendžia problemos naudodamas savybes.

Taigi, istorija - pasirinkimas tarp trijų minėtų sprendimų - yra kompromisas tarp trumpojo jungimo funkcijos, naudojant bent 2,5 pythoną (IMHO nebėra problema), o ne „trueValue-assessment-to-false“.

85
06 дек. Atsakymą pateikia gorsky 06 dec. 2009-12-06 14:51 '09 at 14:51 PM 2009-12-06 14:51

Python 2.5 ir naujesnėms versijoms yra tam tikra sintaksė:

 [on_true] if [cond] else [on_false] 

Senuosiuose Pythonuose trivietis operatorius neįgyvendinamas, tačiau jis gali būti imituojamas.

 cond and on_true or on_false 

Nors yra potenciali problema, kuri, jei įvertinimas yra vertinamas kaip True ir on_true , yra vertinamas kaip False , on_true grąžinama vietoj on_false . Jei norite, kad šis metodas būtų gerai, kitaip naudokite:

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

kurie gali būti suvynioti:

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

ir naudojamas taip:

 q(cond, on_true, on_false) 

Jis suderinamas su visomis „Python“ versijomis.

54
25 апр. Atsakyti Paolo 25 bal. 2012-04-25 14:40 '12, 14:40 pm 2012-04-25 14:40

Ternarinis operatorius įvairiomis programavimo kalbomis

Čia aš tiesiog bandau parodyti keletą svarbių skirtumų tarp ternary operator tarp kelių programavimo kalbų.

„Ternary“ operatorius „Javascript“

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

Trejybės operatorius rubinu

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

Trivietis „Scala“ operatorius

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

Trijų operatorių R programavimas

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

Trijų metų operatorius Pythone

 a = 1 if True else 0 # 1 b = 1 if False else 0 # 0 
50
21 авг. atsakymą pateikė Simplans 21 rug . 2016-08-21 20:56 '16 at 8:56 pm 2016-08-21 20:56

Dažnai galite rasti

 cond and on_true or on_false 

tačiau tai sukelia problemą, kai on_true == 0

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

kur tikitės, kad normalus tretinis operatorius gautų šį rezultatą

 >>> x = 0 >>> print 0 if x == 0 else 1 0 >>> x = 1 >>> print 0 if x == 0 else 1 1 
35
14 янв. Atsakymą Benoit Bertholon pateikė sausio 14 d. 2013-01-14 18:56 '13, 18:56, 2013-01-14 18:56

Absoliučiai, ir tai yra neįtikėtinai lengva suprasti.

 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 atsakymas duotas BattleDrum liepos 15 d., 15 val. 14:33 2015-07-15 14:33

Ar „Python“ turi trijų komponentų sąlyginį operatorių?

Taip Iš gramatikos failo :

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

Dalis interesų:

 or_test ['if' or_test 'else' test] 

Taigi, trišalė sąlyginė operacija turi formą:

 expression1 if expression2 else expression3 

expression3 bus vertinamas tingiai (t. y. jis bus vertinamas tik tada, kai expression2 yra klaidinga logikos kontekste). Ir dėl rekursiško apibrėžimo galite juos susieti be galo (nors tai gali būti laikoma bloga.)

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

Naudojimo pastaba:

Atkreipkite dėmesį, kad kiekvienas, if seka else . Žmonėms, studijuojantiems sąvokų ir generatoriaus išraiškų sąrašą, tai gali atrodyti kaip sunki pamoka mokytis - toliau neveiks, nes „Python“ tikisi trečiosios išraiškos kitam:

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

kuri sukelia SyntaxError: invalid syntax . Taigi, pirmiau minėta yra neišsami logika (galbūt vartotojas tikisi, kad op nėra neteisingas) arba gali būti numatytas, naudodami express2 kaip filtrą - pažymi, kad šis yra teisėtas „Python“:

 [expression1 for element in iterable if expression2] 

expression2 veikia kaip filtras, skirtas suprasti sąrašą ir nėra tretinis sąlyginis operatorius.

Alternatyvi sintaksė siauresniam atvejui:

Jums gali būti šiek tiek skausminga parašyti:

 expression1 if expression1 else expression2 

expression1 turi būti vertinama du kartus naudojant pirmiau nurodytą naudojimą. Jis gali apriboti atleidimą iš darbo, jei jis yra tik vietinis kintamasis. Tačiau bendrasis ir sintaksinis pythoninis idiomas šiam naudojimui yra naudoti santrumpą or :

 expression1 or expression2 

kuris yra lygiavertis semantikoje. Atkreipkite dėmesį, kad kai kurie stiliaus vadovai gali apriboti šį naudojimą pagal aiškumą - tai labai svarbu labai mažai sintaksei.

26
17 нояб. atsakymą pateikė Aaron Hall 17 lapkritis. 2015-11-17 22:14 '15, 10:14 val. 2015-11-17 22:14

Trimatės python operatoriaus modeliavimas.

Pavyzdžiui

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

išeiti:

 'b greater than a' 
17
20 нояб. atsakymą pateikė Sasikiran Vaddi 20 nov. 2013-11-20 13:44 '13, 13:44 2013-11-20 13:44

Tai galite padaryti: -

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

Pavyzdys: -

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

Jis bus išspausdintas „nelyginis“, jei numeris yra nelyginis arba „netgi“, jei numeris yra lygus.


Rezultatas: - Jei sąlyga yra teisinga, exp_1 vykdomas, kitaip exp_2 vykdomas.

Pastaba: - 0, Nėra, False, emptylist, emptyString yra vertinamas kaip False. Ir visi kiti duomenys, išskyrus 0, yra „Tiesa“.

Štai kaip tai veikia:

jei sąlyga [sąlyga] tampa „tiesa“, tada išraiška_1 bus įvertinta, bet ne išraiška_2. Jei mes esame „ir“ kažkas su 0 (nuliu), rezultatas visada bus nestabilus. Taigi, toliau pateiktoje formuluotėje

 0 and exp 

Sąvoka „exp“ visai nebus vertinama, nes „ir“ su 0 visada bus vertinama iki nulio ir nereikia įvertinti šios išraiškos. Taip pats kompiliatorius veikia visomis kalbomis.

Į

 1 or exp 

Ekspresijos išraiška visai nebus vertinama, nes "arba" su 1 visada bus 1. Todėl jis nebus įvertintas išraiškos exp, nes rezultatas bus 1. (kompiliatoriaus optimizavimo metodai).

Tačiau

 True and exp1 or exp2 

Antroji ekspozicija exp2 nebus vertinama, nes True and exp1 bus True, jei exp1 nėra klaidingas.

Panašiai

 False and exp1 or exp2 

Išraiška exp1 nebus vertinama, nes False yra lygiavertis rašymui 0, o "ir" su 0 bus 0, bet po exp1, nes jis naudoja "arba", jis įvertins išraišką exp2 po "arba".


Pastaba: - Šį šakotuvą naudojant „arba“ ir „ir“ galima naudoti tik tada, kai išraiška_1 neturi tikrosios reikšmės False (arba 0, arba Nėra, arba emptilistas []] arba tuščiasis ženklas ''.), Kadangi jei išraiška_1 tampa klaidinga , išraiška_2 bus įvertinta dėl „arba“ tarp „exp_1“ ir „exp_2“.

Jei vis tiek norite dirbti visais atvejais, nepaisant to, kad „exp_1“ ir „exp_2“ yra teisingi, atlikite šiuos veiksmus: -

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

15
20 авг. Atsakymą pateikė Natesh bhat rugpjūčio 20 d. 2017-08-20 10:31 '17 at 10:31 am 2017-08-20 10:31

Trijų komponentų sąlyginis operatorius paprasčiausiai leidžia išbandyti būklę vienoje eilutėje, pakeičiant kelių linijų, jei-kitaip, kodą labiau kompaktišką.

Sintaksė:

[on_true] jei [išraiška] dar [on_false]

1 - paprastas trišalio operatoriaus naudojimo būdas:

 # 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 - Tiesioginis rinkmenų, žodyno ir lambda naudojimo būdas:

 # 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 - Trijų komponentų operatorius gali būti parašytas kaip įdėtasis, jei:

 # 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") 

Pirmiau pateiktas požiūris gali būti parašytas taip:

 # 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 апр. Atsakymas, kurį pateikė Ali Hallaji 04 Bal 2018-04-04 17:02 '18 at 17:02 pm 2018-04-04 17:02

Daugiau užuominų nei atsakymas (nereikia kartoti akivaizdaus laiko), tačiau kartais aš naudoju jį kaip antraštinę etiketę tokiose konstrukcijose:

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

tampa:

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

Kai kurie (daugelis :) gali jį nepakankamai vertinti kaip ne pythoninius (net rubino-ish :), bet aš asmeniškai manau, kad tai natūralesnė - tai yra, kaip tai paprastai išreiškiate, plius šiek tiek labiau vizualiai patrauklus dideliais kodo blokais.

12
11 мая '16 в 10:13 2016-05-11 10:13 atsakymą davė Todor Minakov gegužės 16 d. 10:13 2016-05-11 10:13

Taip, galite jį naudoti taip:

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

Daugiau informacijos apie terminalo sąlyginį operatorių

10
10 июня '17 в 16:14 2017-06-10 16:14 Atsakymą pateikė Daniel Taub birželio 17 d. 17 val. 14:14 2017-05-06 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
atsakymas suteiktas jautį. 2014-05-07 16:02 07 gegužės 14 d. 16:02 2014-05-07 16:02
 a if condition else b 

Tiesiog prisiminkite šią piramidę, jei turite problemų dėl prisiminimų:

  condition if else ab 
6
06 дек. atsakymas duotas shivtej 06 dec. 2018-12-06 17:45 '18, 17:45 pm 2018-12-06 17:45

TAIP, „python“ turi trijų komponentų operatorių, čia yra sintaksė ir pavyzdinis kodas, kad būtų galima įrodyti tą patį :)

 #[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 окт. atsakymas, kurį pateikė PythonLover 21 spalis 2018-10-21 23:14 '18, 11:14 val. 2018-10-21 23:14

Sintaksė: „Ternary“ operatorius bus atvaizduotas kaip:

 [on_true] if [expression] else [on_false] 

Pavyzdžiui

 x, y = 25, 50 big = x if x < y else y print(big) 
4
02 июля '18 в 8:37 2018-07-02 08:37 atsakymas duotas Saurabh Chandra Patel liepos 2 d. 18 d. 8:37 2018-07-02 08:37

Taip

 >>> b = (True if 5 > 4 else False) >>> print b True 
4
16 марта '16 в 19:36 2016-03-16 19:36 atsakymas pateikiamas Alejandro Blasco kovo 16, 16 d. 19:36, 2016-03-16 19:36

Yra trigubas variantas, kaip nurodyta kituose atsakymuose, bet jūs taip pat galite imituoti jį „arba“, jei tikrinate boolean arba None reikšmę:

 >>> a = False >>> b = 5 >>> a or b 5 >>> a = None >>> a or b 5 
1
08 дек. Atsakymas Meow 08 Dec 2016-12-08 22:05 '16 at 10:05 pm 2016-12-08 22:05

Taip:

Tarkime, kad norite priskirti kintamąjį x tam tikrą reikšmę, jei kai kuri bool yra teisinga ir panašiai

X = 5, jei kas nors kitas x = 10

X = [tam tikra vertė], jei [jei tai tiesa, pirmoji vertė įvertina] dar [kita vertė įvertina]

1
14 мая '18 в 9:25 2018-05-14 09:25 atsakymą pateikė Elad Goldenberg gegužės 18 d. 18 val. 9:25 2018-05-14 09:25

Daugelis programavimo kalbų, gautų iš C paprastai turi tokią trijų komponentų sąlyginio pareiškimo sintaksę:

 <condition> ? <expression1> : <expression2> 

Pirma, „ Python B“ atiduodamas D ictator F arba L Ife (manau, kad Guido van Rossum, be abejo,) jį atmetė (kaip ne pranašiškas stilius), nes gana sunku suprasti, kad žmonės, kurie nėra vartoję C kalbos. Be to, dvitaškis ženklas : jau yra daug naudojamas „ Python . Python patvirtinęs PEP 308, pagaliau gavo savo sąlyginę išraišką (kurią šiuo metu naudojame):

 <expression1> if <condition> else <expression2> 

Taigi, pirma, jis įvertina būklę. Jei jis grąžins True , išraiška1 bus vertinama, kad gautų rezultatą, kitaip išraiška2 bus įvertinta. Dėl „ Lazy“ vertinimo mechanizmo bus vykdoma tik viena išraiška.

Štai keletas pavyzdžių (sąlygos bus vertinamos iš kairės į dešinę):

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

Trišaliai operatoriai gali būti prijungti prie serijos:

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

Toliau pateikiamas toks pat kaip ir ankstesnis:

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

Tikiuosi, kad tai padės.

1
25 дек. ARGeo atsakymas . 2018-12-25 16:04 '18, 4:04 val. 2018-12-25 16:04

jei kintamasis yra apibrėžtas ir norite patikrinti, ar jis turi vertę, galite tik 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) 

išeis

 no Input no Input no Input hello ['Hello'] True 
0
26 апр. atsakymas pateikiamas e 2018-04-26 18:41 '18, 18:41 pm 2018-04-26 18:41

Prieš užduodant tokį klausimą, turėtumėte žinoti, kas yra EBNF.

0
12 дек. Atsakymą pateikė user3481141 12 Dec. 2018-12-12 18:33 '18 18:33 2018-12-12 18:33