21 Soru: Python'un üçlü bir şartlı operatörü var mı?

tarafından oluşturulan soru Sat, Mar 23, 2019 12:00 AM

Python'un üçlü bir koşullu işleci yoksa, başka bir dil yapısını kullanarak birini taklit etmek mümkün mü?

    
5269
  1. 2.5 yaşından büyük olan Pytonlar yavaş yavaş tarihe sürükleniyor olsa da, eski 2.5 öncesi terner operatör numaralarının bir listesi: " Python Deyimler ", 'Koşullu ifade' metnini arayın . Vikipedi de oldukça yardımcı oldu. Ж :-)
    2011-05-26 00: 48: 06Z
  2. Yukarıdaki bir yorumda belirtilen Python 3.0 resmi belgelerinde, bu "koşullu ifadeler" olarak adlandırılır ve çok şifreli olarak tanımlanır. Bu dokümantasyon "üçlü" terimini bile içermiyor, bu yüzden tam olarak ne arayacağınızı bilmiyorsanız, Google üzerinden bulmaya zorlanacaksınız. sürüm 2 belgeleri biraz daha faydalıdır ve bir bağlantı içerir ilgili çok sayıda ilginç tarihsel bağlam içeren "PEP 308" 'e bu soruya.
    2013-01-10 05: 57: 30Z
  3. "üçlü" (üç girişe sahip), kavramın tanımlayıcı bir özelliği değil, bu uygulamanın bir sonucudur. örneğin: SQL, benzer bir etki için case [...] { when ... then ...} [ else ... ] end'a sahip ancak üçlüsü de yok.
    2014-12-15 21: 14: 24Z
  4. ayrıca ISO /IEC 9899 (C programlama dili standardı) bölümü 6.5.15 "condtitional operator" olarak adlandırılır
    2014-12-15 21: 20: 22Z
  5. Wikipedia bunu " ?: ".
    2016-06-09 08: 11: 03Z
21 Yanıtlar                              21                         

Evet, eklendi . İfade sözdizimi şudur:

 
a if condition else b

İlk condition değerlendirilir, sonra tam olarak a veya b'dan biri değerlendirilir ve Boolean değeri condition'dur. condition, True olarak değerlendirilirse, a değerlendirilir ve iade edilir, ancak b dikkate alınmaz veya b değerlendirildiğinde ve iade edildiğinde a dikkate alınmaz.

Bu, kısa devreye izin verir çünkü condition doğru olduğunda sadece a değerlendirilir ve b hiç değerlendirilmez, ancak condition yanlış olduğunda sadece b değerlendirilir ve a değerlendirilmez.

Örneğin:

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

Koşullu kelimelerin ifadesi değil, ifadesi olduğunu unutmayın. Bu, şartlı bir ifadede atama ifadeleri veya pass veya diğer ifadeleri kullanamayacağınız anlamına gelir:

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

Ancak, böyle bir değişken atamak için koşullu ifadeleri kullanabilirsiniz:

 
x = a if True else b

Koşullu ifadeyi iki değer arasında geçiş olarak düşünün. 'Bir değer veya başka' bir durumdayken çok faydalıdır, ancak çok fazla bir şey yapmaz.

İfadeleri kullanmanız gerekirse, koşullu bir ifadesi yerine normal bir if deyimi kullanmanız gerekir.


Bazı Pythonistas tarafından birkaç nedenden dolayı kaşlarını çattığını unutmayın:

  • Argümanların sırası, klasik condition ? a : b üçlü operatöre göre diğer birçok dilden (C, C ++, Go, Perl, Ruby, Java, Javascript, vb.) farklıdır;Python'un "şaşırtıcı" davranışını bilmediğiniz bir uygulamayı kullanın (argüman sırasını tersine çevirebilirler).
  • Bazıları normal düşünce akışına (önce durumu düşünmek ve sonra etkileri düşünmek) aykırı olduğu için "hantal" buluyor.
  • Stilistik nedenler. (Her ne kadar 'satır içi if' gerçekten faydalı olabilir ve komut dosyanızı daha özlü hale getirse de, kodunuzu gerçekten karmaşık hale getirir)

Siparişi hatırlamakta sorun yaşıyorsanız, yüksek sesle okurken yüksek sesle ne demek istediğinizi söyleyin. Örneğin, x = 4 if b > 8 else 9, x will be 4 if b is greater than 8 otherwise 9 olarak yüksek sesle okunur.

Resmi belgeler:

2019-05-18 10: 26: 57Z
  1. Sıralama kodlayıcılar için garip görünebilir ancak f(x) = |x| = x if x > 0 else -x matematikçilere çok doğal geliyor. Ayrıca, çoğu durumda A olarak da anlayabilirsiniz, ancak C'nin B yerine yapması gereken durumlar hariç ...
    2016-01-25 15: 07: 08Z
  2. Bunu kullanırken işlemlerin sırasına dikkat edin. Örneğin, z = 3 + x if x < y else y hattı. x=2 ve y=1 ise, 4 vermesini bekleyebilirsiniz, ancak gerçekte 1 olur. z = 3 + (x if x > y else y) doğru kullanımdır.
    2016-03-06 09: 23: 11Z
  3. Önemli olan, sonuç için bir değer eklemek gibi koşullu değerlendirmeden sonra ek değerlendirme yapmak istemenizdi; ek ifadeyi her iki tarafa da eklemeniz (z = 3 + x if x < y else 3 + y) veya şartlı grubu (z = 3 + (x if x < y else y) veya z = (x if x < y else y) + 3) gruplamanız gerekiyor
    2016-04-15 00: 36: 05Z
  4. birden fazla koşul varsa ne olur?
    2017-05-26 15: 31: 44Z
  5. @ MrGeek, ne demek istediğinizi anlıyorum, bu nedenle temel olarak işlemleri yerleştirmek istersiniz: `" foo ", eğer Bool baska (" bar ", Bool baska" foobar " ) `
    2017-08-11 00: 04: 32Z

Bir dizine endeksleyebilirsiniz:

 
(falseValue, trueValue)[test]

test, Doğru veya Yanlış değerini döndürmelidir.
Her zaman şu şekilde uygulamak daha güvenli olabilir:

 
(falseValue, trueValue)[test == True]

veya yerleşik bool() bir Boole değerini temin etmek için:

 
(falseValue, trueValue)[bool(<expression>)]
    
689
2015-10-17 07: 35: 10Z
  1. Bunun her zaman her şeyi değerlendirdiğini, if /else yapısının yalnızca kazanan ifadeyi değerlendirdiğini unutmayın.
    2011-02-04 02: 25: 24Z
  2. (lambda: print("a"), lambda: print("b"))[test==true]()
    2012-03-08 19: 31: 48Z
  3. [] s içinde olanın keyfi bir ifade olabileceği belirtilmelidir. Ayrıca, güvenlik için [bool(<expression>)] yazarak gerçeği açıkça test edebilirsiniz. bool() işlevi v2.2.1’den beri var.
    2012-05-31 18: 20: 15Z
  4. Bu kod golf için harika, gerçek kod için çok değil. Her ne kadar alıştığım halde, iki dize sabiti arasında seçim yapmak gibi açık bir şey yaparken bazen kısa bir süre için kullanıyorum.
    2014-12-0517: 52: 12Z
  5. Benzer bir numara yaptım - yalnızca bir veya iki kez, ancak yaptım - anahtarlar olarak True ve False olan bir sözlüğe endeksleyerek: {True:trueValue, False:falseValue}[test] Yapmam Bunun daha az verimli olup olmadığını bilmemekle birlikte, en azından "zarif" ve "çirkin" tartışmasından kaçınmaktadır. Int'den ziyade bir boole ile uğraştığınız belirsizlik yoktur.
    2016-03-01 18: 43: 37Z

2.5'ten önceki sürümler için püf noktası var:

 
[expression] and [on_true] or [on_false]

on_true’da yanlış sonuçlar verebilir  yanlış bir boolean değerine sahip. 1
Her ne kadar bence daha açık olan ifadeleri soldan sağa değerlendirme avantajına sahip olsa da.

1. orada bir karşılığı var mı C'ler? ”::” Üçlü operatör?

    
289
2014-01-13 07: 16: 48Z
  1. Çözüm, bu tuzağı engelleyen (test ve [true_value] veya [false_value]) [0] kullanmaktır.
    2009-10-21 15: 33: 59Z
  2. Üçlü operatör genellikle daha hızlı çalışır (bazen% 10-25 oranında).
    2014-01-13 07: 52: 08Z
  3. @ volcano Benim için kaynağınız var mı?
    2014-08-05 12: 30: 33Z
  4. 2018-03-19 20: 59: 54Z

<expression 1> if <condition> else <expression 2>

 
a = 1
b = 2

1 if a > b else -1 
# Output is -1

1 if a > b else -1 if a < b else 0
# Output is -1
    
200
2019-05-15 15: 03: 41Z
  1. Bu ve en iyi cevap arasındaki fark nedir?
    2010-05-27 07: 59: 27Z
  2. Bu, üçlü operatörün birincil amacını vurgular: değer seçimi. Ayrıca, birden fazla üçlünün tek bir ifadede birlikte zincirlenebileceğini gösterir.
    2010-10-04 21: 14: 21Z
  3. @ Craig, katılıyorum, ancak parantez olmadığında ne olacağını bilmek de yardımcı oluyor. Gerçek kodda, ben de açık parens ekleme eğiliminde olurdum.
    2014-12-01 21: 30: 51Z
  4. Her nasılsa, bunu en iyi cevaptan daha iyi anlayabiliyorum.
    2018-03-23 ​​05: 46: 05Z

:

  

Koşullu ifadeler (bazen "üçlü operatör" olarak adlandırılır) tüm Python işlemlerinde en düşük önceliğe sahiptir.

     

x if C else y ifadesi önce koşulu değerlendirir, C ( değil x ); C doğruysa, x değerlendirilir ve değeri döndürülür; aksi halde y değerlendirilir ve değeri döndürülür.

     

Bkz. PEP 308 daha fazla ayrıntı içinkoşullu ifadeler hakkında.

2.5 sürümünden beri yeni.

    
125
2015-10-17 07: 43: 53Z

Python'da koşullu ifade için bir işleç 2006 yılında Python Geliştirme Teklif 308 . Biçimi yaygın ?: operatöründen farklıdır ve bu:

 
<expression1> if <condition> else <expression2>

şuna eşdeğerdir:

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

İşte bir örnek:

 
result = x if a > b else y

Kullanılabilecek başka bir sözdizimi (2.5'ten önceki sürümlerle uyumlu):

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

işlenenlerin nerede olduğu tembelce değerlendirildi .

Başka bir yol, bir dize dizine eklemektir (bu, diğer birçok dilin koşullu işleciyle tutarlı değildir):

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

veya açıkça oluşturulmuş bir sözlük:

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

Başka (daha az güvenilir), ancak daha basit bir yöntem and ve or operatörlerini kullanmaktır:

 
result = (a > b) and x or y

ancak x, False olacaksa bu işe yaramaz.

Muhtemel bir geçici çözüm, x ve y'un aşağıdaki gibi listelenmesi veya tote edilmesidir:

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

veya

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

Sözlüklerle çalışıyorsanız, bir koşullu üçlü kullanmak yerine get(key, default) , örneğin:

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

Kaynak: ?: Wikipedia'da Python'da

    
95
2017-08-07 14: 22: 32Z
  1. result = {1: x, 0: y}[a > b] başka bir olası değişkendir (True ve False aslında 1 ve 0 değerleriyle tamsayılardır)
    2019-02-09 18: 07: 40Z

Maalesef

 
(falseValue, trueValue)[test]

Çözüm, kısa devre davranışına sahip değil; Böylece hem falseValue hem de trueValue durumdan bağımsız olarak değerlendirilir. Bu, en düşük kalitede ve hatta buggy olabilir (yani, hem trueValue hem de falseValue, yöntemler olabilir ve yan etkileri olabilir).

Buna bir çözüm olabilir:

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

(yürütme kazanana kadar ertelenir;); ancak çağrılabilir ve çağrılmaz nesneler arasında tutarsızlık yaratır. Ayrıca, özellikleri kullanırken davayı çözmez.

Ve böylece hikaye devam ediyor - bahsedilen 3 çözüm arasından seçim yapmak, en az Зython 2.5 (IMHO artık sorun değil) kullanarak ve "trueValue değerlemesine eğilimli" olmaya eğilimli olma -false "hataları.

    
86
2019-05-09 09: 45: 33Z
  1. Lambdas hilesi, üçlü operatör kadar kabaca 3x sürüyor. Uzun bir if else if zincirini değiştirebilirse, yalnızca makul bir fikir olması muhtemeldir.
    2018-10-11 17: 34: 51Z

Farklı programlama Dillerinde Üçlü Operatör

Burada birkaç programlama dili arasında ternary operator'da bazı önemli farklar göstermeye çalışıyorum.

  

Javascript'te Üçlü Operatör

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

Ruby'deki Üçlü Operatör

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

Scala'daki üçlü operatör

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

R programlamasında üçlü operatör

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

Python’da üçlü operatör

 
a = 1 if True else 0
# 1
b = 1 if False else 0
# 0
    
56
2019-01-26 14: 05: 18Z
  1. 2017-02-15 23: 08: 50Z
  2. Ruby, a = true ? 1 : 0 ile de çalışıyor
    2017-05-15 17: 50: 10Z
  3. "Artık python dilinin güzelliğini görebilirsiniz. Çok okunaklı ve bakımı kolay." Bu cümlenin uygunluğunu ya da üçlü operatör sözdiziminin bunu nasıl gösterdiğini göremiyorum.
    2017-12-08 15: 38: 17Z
  4. Fikirli görünebilir; Fakat esasen söylediği şey, Python sözdiziminin asla üçlü bir operatör görmeyen bir kişi tarafından anlaşılması muhtemel olduğu, ancak çok az kişinin ilk ne anlama geldiği söylenmedikçe daha normal sözdizimini anlayacağı söylenebilir.
    2018-01-10 17: 12: 28Z
  5. Algol68: a = .if. .doğru. .sonra. 1. 0 .fi. Bu aynı zamanda bir = (. True. | 1 | 0) olarak da ifade edilebilir. Her zamanki gibi Algol68 halefleri üzerinde bir gelişmedir.
    2018-06-17 12: 55: 29Z

Python 2.5 ve daha yenisi için belirli bir sözdizimi vardır:

 
[on_true] if [cond] else [on_false]

Eski Pythons'ta üçlü bir operatör uygulanmadı, ancak bunu simüle etmek mümkün.

 
cond and on_true or on_false

Yine de, cond, True olarak değerlendirirse ve on_true, False olarak değerlendirirse, on_false yerine on_true döndürülen olası bir sorun vardır. Bu davranışı istiyorsanız, yöntem tamam, aksi halde şunu kullanın:

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

, aşağıdakilerle sarılabilir:

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

ve bu şekilde kullanıldı:

 
q(cond, on_true, on_false)

Tüm Python sürümleriyle uyumludur.

    
55
2012-04-25 12: 02: 06Z
  1. Davranış aynı değil - q("blob", on_true, on_false) on_false, on_true if cond else on_false ise on_true döndürür. Bu çözüm, mükemmel bir çözüm olmasa da, bu durumlarda cond'u cond is not None ile değiştirmektir.
    2012-09-26 09: 09: 29Z
  2. Neden bool(cond) yerine cond is True değil? İlki cond'un doğruluğunu kontrol eder, ikincisi True nesnesinin gösterici eşitliği olup olmadığını kontrol eder. @AndrewCecil tarafından vurgulandığı gibi, "blob" truthy ama is not True.
    2013-11-11 16: 11: 06Z
  3. Vay, bu gerçekten hacky görünüyor! :) Teknik olarak, [on_false, on_True][cond is True] bile yazabilirsiniz, böylece ifade kısalır.
    2014-02-24 11: 51: 08Z
  4. Bu cevapta kısa devre yok. On_true ve on_false'ın çağırması pahalıysa bu kötü bir cevaptır.
    2019-03-28 14: 08: 20Z

Sık sık bulabilirsiniz

 
cond and on_true or on_false

ancak bu on_true == 0

olduğunda soruna yol açar  
>>> x = 0
>>> print x == 0 and 0 or 1 
1
>>> x = 1
>>> print x == 0 and 0 or 1 
1

normal bir üçlü operatör için bu sonucu beklediğiniz yerde

 
>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1
    
35
2013-01-14 15: 56: 09Z
  

Python'un üçlü bir koşullu işleci var mı?

Evet. gramer dosyasından :

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

İlgilendiğiniz kısım:

 
or_test ['if' or_test 'else' test]

Dolayısıyla, üçlü bir koşullu işlem şu şekildedir:

 
expression1 if expression2 else expression3

expression3 tembel olarak değerlendirilecektir (yani, yalnızca expression2 boolean bağlamında yanlışsa değerlendirilir). Özyinelemeli tanımı nedeniyle, onları sonsuza kadar zincirleyebilirsin (kötü bir stil olarak görünse de).)

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

Kullanımla ilgili bir not:

Her if'da bir else ile takip edilmesi gerektiğini unutmayın. Python bir başka ifadeyle üçüncü bir ifade beklediğinden, liste kavramalarını ve üreteç ifadelerini öğrenenlerin bunu öğrenmesi zor bir ders olarak bulabilirler - aşağıdakiler işe yaramayacaktır:

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

SyntaxError: invalid syntax'u yükseltir. Bu yüzden yukarıdaki ya eksik bir mantık parçası (belki de kullanıcı yanlış durumda işlem yapmamasını bekler) ya da bir filtre olarak ifade2'yi kullanmak niyetinde olabilir - aşağıdakilerin yasal Python olduğunu not eder:

 
[expression1 for element in iterable if expression2]

expression2 liste anlama için bir süzgeç işlevi görür ve üçlü bir koşullu işleç değildir .

Daha dar bir vaka için alternatif sözdizimi:

Aşağıdakini yazmak biraz acı verici olabilir:

 
expression1 if expression1 else expression2

expression1, yukarıdaki kullanımla iki kez değerlendirilmelidir. Yalnızca yerel bir değişkense fazlalığı sınırlayabilir. Bununla birlikte, bu kullanım durumu için ortak ve başarılı bir Pythonic deyim, or'un kısayol davranışını kullanmaktır:

 
expression1 or expression2
anlam anlamında eşdeğer olan

. Bazı stil rehberlerinin bu kullanımı netlik temelinde sınırlayabileceğini unutmayın - çok az sözdizimine çok fazla anlam kazandırır.

    
28
2016-08-08 18: 56: 31Z
  1. expression1 or expression2 benzer ve javascript'te expression1 || expression2 ile aynı dezavantajlara /pozitiflere sahip
    2016-02-18 13: 05: 59Z
  2. Teşekkürler, @selurvedu - doğrudan elde edene kadar kafa karıştırıcı olabilir. Zor yoldan öğrendim, o yüzden yolun o kadar zor olmayabilir. ;) Aksi belirtilmedikçe, bir jeneratör ifadesinin sonunda veya listenin anlaşılması, yinelemeye filtre uygular. Önünde, bu üçlü bir şartlı işlem ve diğerini gerektirir. Şerefe !!
    2016-05-27 04: 37: 39Z
  3. @ AaronHall Tüm örnekler için metasyntactic expressionN kullanımınız tutarlı olsa da, koşullu test ifadesini iki sonuç ifadesinden ayırt eden isimlendirmeyi anlamak daha kolay olabilir; örneğin, result1 if condition else result2. Bu özellikle yuvalama sırasında belirgindir (aka zincirleme): result1 if condition1 else result2 if condition2 else result3. Bu şekilde ne kadar iyi okuduğunu görüyor musun?
    2019-01-26 14: 12: 47Z
  4. @ tchrist inceleme için teşekkürler - revizyon geçmişine bakarsanız, bu yayın şu anda iki revizyona sahiptir. Diğer cevaplarımın çoğu, özellikle de en tepedekiler tekrar tekrar ziyaret edildi. Bu cevap hiç dikkatimi çekmiyor çünkü topluluk wiki durumu içerik için bana kredi vermiyor ve bu yüzden hiçbir oylama görmedim. Şu an bu konuda bir düzenleme yapmak için gerçekten zamanım olmadığından, kurbağa gelecekte tekrar dikkatime ne zaman varacağını biliyor. En iyi cevabı düzenlediğinizi görebiliyorum, bu yüzden bu yazıdaki materyalimi ödünç almaktan /alıntı yapmaktan çekinmeyin (ve eğer apropos ise beni alıntı yapın!)
    2019-01-26 18: 24: 21Z

Python üçlü operatörünü simüle etme.

Örneğin

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

çıkışı:

 
'b greater than a'
    
17
2013-11-20 10: 44: 12Z
  1. Neden basitçe result = (y, x)[a < b] Neden lambda işlevini kullanmıyorsunuz ?
    2013-12-27 05: 50: 06Z
  2. @ GrijeshChauhan "Zorunlu" ifadelerden dolayı, e. g. Bir işlev çağrısı vs. içeren, bu her iki durumda da gerçekleştirilecektir. Bu istenmeyebilir.
    2014-02-13 08: 14: 33Z

bunu yapabilirsiniz: -

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

Örnek: -

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

Bu sayı, tek ise veya "çift" ise "çift" ise "tek" olarak yazdırılır.


Sonuç: - Eğer durum doğruysa exp_1 is çalıştırıldı exp.2 çalıştırıldı.

Not: - 0, Yok, Yanlış, boş liste, emptyString, Yanlış olarak değerlendirilir. Ve 0 dışındaki veriler True olarak değerlendirilir.

İşte nasıl çalışıyor:

[koşul] koşulu "Doğru" olursa, expression_1 değerlendirilir, ancak expression_2 değil. Eğer biz "ve" 0 (sıfır) olan bir şey olursa, sonuç daima boş olacaktır. Aşağıdaki ifadede,

 
0 and exp

exp ifadesi hiç bir zaman değerlendirilmez, çünkü "ve" 0 ile her zaman sıfırı değerlendirir ve ifadeyi değerlendirmeye gerek yoktur. Derleyicinin kendisi, tüm dillerde bu şekilde çalışır.

İçinde

 
1 or exp

exp ifadesi "veya" her zaman 1 olacağı için "exp" hiç bir şekilde değerlendirilmez. Dolayısıyla, sonuç yine de 1 olacağı için exp ifadesini değerlendirmek zahmete girmez. (derleyici optimizasyon yöntemleri).

Ancak,

durumunda  
True and exp1 or exp2

İkinci ifade exp2, exp3 yanlış olmadığında True and exp1, Doğru olacağı için değerlendirilmeyecektir.

Benzer şekilde

 
False and exp1 or exp2

exp1 ifadesi, False 0 yazmaya eşdeğer olduğundan ve "ve" 0 ile aynı olduğunda 0'ın kendisi olacağı için değerlendirilmez, ancak "veya" kullanıldığından beri exp1'den sonra "veya" ifadesinden sonra exp2 ifadesini değerlendirir.


Not: - "veya" ve "ve" kullanarak bu tür bir dallanma, yalnızca ifadenin_1 değerinin Yanlış değerine sahip olmadığı durumlarda kullanılabilir (veya 0 veya Yok veya boş liste [] ya da emptystring ''.) çünkü expression_1 ifadesi False olursa, ifadesi_2 "veya" exp_1 ve exp_2 arasındaki varlığından dolayı değerlendirilecektir.

Hala exp_1 ve exp_2 doğruluk değerlerinin ne olduğuna bakılmaksızın tüm durumlar için çalışmasını sağlamak istiyorsanız, şunu yapın: -

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

    
15
2017-08-20 07: 48: 54Z
  1. x = [condition] and ([expression_1] or 1) or [expression_2] ve expression_1 bağlamında false olarak değerlendirmek istiyorsanız, x, 1 değil, expression_1 olur. Kabul edilen cevabı kullanın.
    2017-10-20 06: 37: 01Z

Üçlü koşullu işleç, bir kodu tek satırda sınamanıza izin verir, aksi halde kodu küçük hale getirirse, çok satırlı olanı değiştirir.

Sözdizimi:

  

[on_true] eğer [ifade] başka [on_false]

1- Üçlü işlecin kullanılması için basit Yöntem:

 
# 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- Doğrudan tuples, Sözlük ve lambda kullanmanın yöntemi:

 
# 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- Üçlü operatör, eğer varsa başka bir yuvaya yazılabilir:

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

Yukarıdaki yaklaşım şu şekilde yazılabilir:

 
# 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
2018-04-04 14: 02: 17Z
  1. Üçlü işlecin iç içe olduğundan daha küçük (bellekte) ve daha hızlı olduğunu unutmayın. Ayrıca, iç içe geçmiş if-else gerçekte üçlü operatörün bir yeniden yazması değildir ve a ve b'nin seçili değerleri için farklı çıktılar üretecektir (özellikle biri tuhaf bir __ne__ yöntemi uygulayan bir tür ise).
    2018-10-11 17: 28: 46Z

Bir cevaptan daha fazla püf noktası (hundreth zamanı için açık olanı tekrarlamana gerek yok), ancak bazen bu tür yapılarda oneliner kısayol olarak kullanıyorum:

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

, olur:

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

Bazıları (çoğu :) üzerine unpythonic (hatta, ruby-ish :) gibi kaşlarını çattırabilir, ancak şahsen daha doğal buluyorum - yani normalde nasıl ifade edeceğinizi, ayrıca büyük bloklarda görsel olarak daha çekici olduğunu kodu.

    
12
2016-05-23 19: 16: 26Z
  1. Cevabınızı print( 'yes' if conditionX else 'nah' )'u tercih ediyorum. : -)
    2017-08-20 06: 07: 17Z
  2. Her iki durumda da print()'a ulaşmak istiyorsanız - ve biraz daha pitonik görünüyorsa, itiraf etmeliyim :) Ama ifadeler /işlevler değilse aynı - print('yes') if conditionX else True gibi - print()’u sadece benn truthy conditionX
    2017-10-26 11: 40: 17Z
  3. Frederick99'un sözlerine eklemek için print('yes') if conditionX else print('nah')'dan kaçınmanın başka bir nedeni de Python2'de bir SyntaxError vermesidir.
    2018-10-21 21: 51: 29Z
  4. Sözdizimi hatası vermesinin tek nedeni Python 2'de bir ifade - print "yes", Python 3'te bir işlev - print("yes") olmasıdır. Bu, bir deyim olarak ya da daha iyisi kullanılarak çözülebilir - from future import print_function.
    2018-10-22 04: 09: 00Z
 
a if condition else b

Hatırlamakta zorlanıyorsanız sadece bu piramidi ezberleyin:

 
     condition
  if           else
a                   b 
    
9
2018-12-06 14: 45: 27Z

YES, python üçlü bir operatöre sahip, işte sözdizimi ve aynısını göstermek için bir örnek kod: :)

 
#[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")
    
4
2018-10-21 20: 46: 34Z
  1. Hangi sayının daha fazla ayrıntılandırılmasının büyük olduğunu kontrol etmek için bir satırlık ifade örneği ekledim
    2018-10-21 20: 45: 54Z
  2. print, Python2'de bir SyntaxError verecek olduğundan gerçekten iyi bir seçim değildir.
    2018-10-21 21: 52: 56Z
  3. @ Thierry Lathuille burada print () işlevini yazdırmıyordum, print işlevi Python 3 için, print deyimi Python 2 için ise kullandım
    2018-10-21 21: 54: 21Z
  4. Soru SO'da zaten sorulmuş, Python 2 ile deneyiniz ve kendiniz göreceksiniz. 'print (' hello ') Python 2.7’de tamamen geçerli bir sözdizimidir, ancak ayrıştırma yöntemi yukarıdaki kodunuzu bir SyntaxError atar.
    2018-10-21 21: 58: 23Z
  5. Lütfen doğru olanı söyleyin
    2018-10-21 22: 00: 52Z

C'dan türetilen pek çok programlama dili, genellikle üçlü koşullu işlecin aşağıdaki sözdizimine sahiptir:

 
<condition> ? <expression1> : <expression2>
  

İlk başta, Python B zengin D ictator F veya L ife (Guido van Rossum demek istiyorum) Tabii ki) (Pythonic tarzı olmayan) reddetti, çünkü C diline alışık olmayan insanları anlamak oldukça zor. Ayrıca, : iki nokta üst üste işaretinin Python'da zaten birçok kullanımı vardır. PEP 308 onaylandıktan sonra, Python nihayet kendi kısa yollu koşullu ifadesini aldı (şimdi ne kullanıyoruz):

 
<expression1> if <condition> else <expression2>

Yani, öncelikle durumu değerlendirir. True döndürülürse, sonucu vermek için expression1 değerlendirilir, aksi takdirde expression2 değerlendirilir. Tembel Değerlendirme mekaniklerinden dolayı - yalnızca bir ifade yürütülür.

İşte bazı örnekler (koşullar soldan sağa değerlendirilecektir):

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

# Result is 'High'

Üçlü operatörler seri olarak zincirlenebilir:

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

# Result is 'Normal'

Aşağıdaki, öncekiyle aynı:

 
pressure = 5

if pressure < 20:
    if pressure < 10:
        print('Normal')
    else:
        print('High')
else:
    print('Critical')

# Result is 'Normal'

Bu yardımcı olur umarım.

    
4
2019-01-04 22: 02: 14Z

Python'un alternatiflerinden biri koşullu ifade aşağıdaki gibidir:

 
{True:"yes", False:"no"}[boolean]

aşağıdaki hoş uzantıya sahip:

 
{True:"yes", False:"no", None:"maybe"}[boolean_or_none]

En kısa değişiklik kalır:

 
("no", "yes")[boolean]

ancak aşağıda yes() ve no()’un değerlendirilmesinden kaçınmak istiyorsanız alternatif yoktur:

 
yes() if [condition] else no()
    
3
2019-02-09 18: 23: 18Z

Birden fazla operatörü zincirlemenin iyi bir yolu:

 
f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'

array = [(0,0),(0,1),(1,0),(1,1)]

for a in array:
  x, y = a[0], a[1]
  print(f(x,y))

# Output is:
#   equal,
#   less,
#   greater,
#   equal

    
0
2019-05-12 13: 03: 48Z

değişken tanımlanmışsa ve değeri olup olmadığını kontrol etmek istiyorsanız, sadece 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)

çıkacak

 
no Input
no Input
no Input
hello
['Hello']
True
    
- 1
2018-04-26 16: 22: 58Z
  1. Benzer sorunlar için faydalı olsa da, bu üçlü bir şartlı değildir. x if x else y'un yerini almaya çalışıyor, ancak x if z else y'u değil.
    2018-10-11 17: 13: 50Z
kaynak yerleştirildi İşte