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 lineyani ayrıca pitonik olmayan ...;)
x = object.get('attribute')bu durumda
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.
variable=Nonetamamen yasal değildir. : D
continue if i == 0for döngüsü içinde.
else pass?
else passçalışmaz çünkü üçlü ifade, geçirilebilecek bir değer döndürmelidir return. passgeçerli bir returndeğer değil .
if a_condition: variable = "something"ve if a_condition: return variableyasal. 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 elsecü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 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 NonemyList.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