Python Ternary Operatörü Olmadan


85

Bunu Python'da tek satırda yapmak mümkün mü?

if <condition>:
    myList.append('myString')

Üçlü operatörü denedim:

myList.append('myString' if <condition>)

ama benim IDE ( MyEclipse ) bir else.


1
Üç bölümü olmayan üçlü bir operatör gibi mi? Bu bir çelişki değil mi?
user207421

Yanıtlar:


119

Evet, bunu yapabilirsin:

<condition> and myList.append('myString')

Eğer <condition>yanlış, o zaman devreye girer kısa devre ve sağ taraftaki değerlendirmeye alınmayacaktır. Eğer <condition>doğruysa, o zaman sağ tarafta değerlendirilecek ve eleman eklenecektir.

Yukarıdakileri yapmanın pitonik olmadığını ve muhtemelen şunu yazmanın en iyisi olacağını belirteceğim:

if <condition>: myList.append('myString')

Gösteri:

>>> myList = []
>>> False and myList.append('myString')
False
>>> myList
[]
>>> True and myList.append('myString')
>>> myList
['myString']

10
Bu cevap teknik olarak doğru olsa da, iyi bir programlama uygulaması değildir. Python, kolayca okunabilen bir dil olmayı hedeflediğinden, bu kod Pythonic dışı olarak kabul edilecektir.
Bay Lance E Sloan

10
@LS: Katılıyorum, bu yüzden sadece if ifadesini kullanmanın en iyisi olacağını söyledim. Ama bunu daha net hale getirmek için cevabı biraz değiştirdim.
Claudiu

2
fyi ikinci örnek pep8 kontrollerinde başarısız olur: E701 multiple statements on one lineyani ayrıca pitonik olmayan ...;)
Cas

1
@hard_working_ant "doğru" yol olacaktır x = object.get('attribute')bu durumda
wihlke

1
@wihlke: evet ve varsayılan olarak x = object.get ('attribute', None) 'i Yok'a
ekliyor

45

Dilin sözdizimini kullanmanıza izin vermemesinin nedeni

variable = "something" if a_condition

olmadan elsedurumda nerede, yani a_condition == False, variableaniden bilinmemektedir. Belki varsayılan olabilir None, ancak Python tüm değişken atamalarının aslında açık atamalarla sonuçlanmasını gerektirir. Bu aynı zamanda işlev çağrınız gibi durumlar için de geçerlidir, çünkü işleve iletilen değer RHS'de olduğu gibi değerlendirilir. , bir atama ifadesinin .

Benzer şekilde, returnkoşullu returns olsalar bile tüm s'ler gerçekten dönmelidir . Örneğin:

return variable if a_condition

izin verilmez, ancak

return variable if a_condition else None

İkinci örneğin açıkça bir şeyi döndürmesi garantili olduğundan izin verilir.


1
Python'un bunu kullanmamıza izin vermemesi ironiktir, böylece değişken hiçbir zaman henüz variable=Nonetamamen yasal değildir. : D
Guy

1
Ama bunu şu şekilde kullanmak istedim: continue if i == 0for döngüsü içinde.
karantan

2
else pass?
Yapmana

5
else passçalışmaz çünkü üçlü ifade, geçirilebilecek bir değer döndürmelidir return. passgeçerli bir returndeğer değil .
Emmett Butler

4
Bu motivasyon göz önüne alındığında, gerçek nedeni olduğunu kabul etmiyorum if a_condition: variable = "something"ve if a_condition: return variableyasal. Dolayısıyla, aslında keyfi bir sözdizimsel python seçimidir.
oulenz

13
if <condition>: myList.append('myString')

Aksi takdirde hayır. Neden tek satıra koymaya ihtiyaç duyuyorsunuz?

"Üçlü operatörün" bir operatör olduğunu unutmayın . Herhangi bir operatör gibi, bir şey döndürmesi gerekir , peki elsecümle olmadan nasıl üçlü bir operatöre sahip olabilirsiniz ? Durum gerçek gibi değilse ne dönmesi gerekiyor?


10

Temelde do_thing() if <condition> else passyapı ( SyntaxErroreğer çalıştırılırsa fırlatır ) istiyorsun. Araştırma sırasında keşfettiğim gibi (biraz) benzer soru do_thing() if condition else None alabileceğiniz kadar yakındır (ki bu da yapmanın başka bir yoludur <condition> and do_thing()). Öyleyse, bu fikri ve diğer cevapları özetlemek için seçenekleriniz şunlardır:

  • if <condition>: myList.append('myString') - en az 'hacky' (ve dolayısıyla tercih edilen) yol gibi görünüyor
  • <condition> and myList.append('myString')
  • myList.append('myString') if <condition> else None

En az hacky yol işe yaramıyor. En azından REPL'de değil - bir sözdizimi hatası alır. Aynı satırdaki önceki koddan kaynaklanıyor gibi görünüyor. Bunun yerine kendi satırında yürütülmesi gerekiyor. Ancak o zaman bile üç noktayı atlamak için kullanıcı girdisi gereklidir.
Unknow0059

3

myList.extend(['myString'] if condition else []) diğer çözümlerden daha fazla iş olsa da işe yarayacaktır.


0

Bunun gibi bir şey yapabilirsiniz:

myList.append('myString') if <condition> else False

veya

myList.append('myString') if <condition> else 0

False ve 0 listeye eklenmez. Koşul yerine getirilmezse satırın bir şey döndürmesi gerekir. 0 veya Yanlış değerini Yok veya boş bir dizeyle veya istediğiniz herhangi bir şeyle değiştirebilirsiniz ve bu listeyi etkilemez.
Zachary Chiodini

Sanırım o zamanki düşüncem bir liste kavrama durumundaydı. Yorumumu sildim, olumsuz oy ben değildim. Sanırım daha temiz bir yol yapılacak myList.append('myString') if True else _ama eğer hiçbir şeye görev vermiyorsan, önemli değil. Yine de bu kişinin benzer mantıkla bir liste anlama girişiminde bulunmasından endişe ediyorum.
Dave Liu

0

Bir koşula göre bir listeye isteğe bağlı öğeler eklemek istersem bunu yapardım.

nums = [
        1,
        2,
        3 if <condition> else None,
        4,
       ]
nums = [i for i in nums if i is not None]

bu, koşul yerine getirilmezse değeri Yok ile değiştirir ve daha sonra listeyi Yok Değerleri olmadan yeniden tanımlar. bu şekilde koşul karşılanırsa dizinlerini korurlar

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.