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
.
Yanıtlar:
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']
E701 multiple statements on one line
yani ayrıca pitonik olmayan ...;)
x = object.get('attribute')
bu durumda
Dilin sözdizimini kullanmanıza izin vermemesinin nedeni
variable = "something" if a_condition
olmadan else
durumda nerede, yani a_condition == False
, variable
aniden 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, return
koşullu return
s 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.
variable=None
tamamen yasal değildir. : D
continue if i == 0
for döngüsü içinde.
else pass?
else pass
çalışmaz çünkü üçlü ifade, geçirilebilecek bir değer döndürmelidir return
. pass
geçerli bir return
değer değil .
if a_condition: variable = "something"
ve if a_condition: return variable
yasal. Dolayısıyla, aslında keyfi bir sözdizimsel python seçimidir.
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 else
cümle olmadan nasıl üçlü bir operatöre sahip olabilirsiniz ? Durum gerçek gibi değilse ne dönmesi gerekiyor?
Temelde do_thing() if <condition> else pass
yapı ( SyntaxError
eğ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
myList.extend(['myString'] if condition else [])
diğer çözümlerden daha fazla iş olsa da işe yarayacaktır.
Bunun gibi bir şey yapabilirsiniz:
myList.append('myString') if <condition> else False
veya
myList.append('myString') if <condition> else 0
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.
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