Bir satır eğer koşul-atama


140

Takip koduna sahibim

num1 = 10
someBoolValue = True

Ben değerini ayarlamak gerekir num1için 20ise someBoolValueolduğu True; ve başka bir şey yapmayın. İşte bunun için kodum

num1 = 20 if someBoolValue else num1

Daha ...else num1temiz görünmesini sağlamak için parçayı önleyebileceğim bir şey var mı ? Eşdeğer

if someBoolValue:
    num1 = 20

Ben ile yerine çalıştı ...else passböyle: num1=20 if someBoolValue else pass. Tek aldığım sözdizimi hatasıydı. Ben de bu ...else num1kısmı atlayamadım .


2
Sadece hepsini değiştirin num1 = 20 if someBoolValue else 10. Sonra da num1=10hattı kurtarır mısın?
Thomas Ahle

Teşekkürler. Ama bu tam olarak benim kodum değil. Ben num1zaten var demek istedim ...
BDHAR

Yanıtlar:


196

Bunun Python'da mümkün olduğunu düşünmüyorum, çünkü aslında yapmaya çalıştığınız şey muhtemelen böyle bir şeye genişliyor:

num1 = 20 if someBoolValue else num1

Hariç tutursanız else num1, atamanın gerçekten bir şey döndürmesi gerektiğinden emin olduğum için bir sözdizimi hatası alırsınız.

Diğerlerinin de belirttiği gibi, bunu yapabilirsiniz, ancak kötüdür, çünkü bir dahaki sefere bu kod parçasını okurken muhtemelen kendinizi karıştırmanız gerekir:

if someBoolValue: num1=20

Ben de num1 = someBoolValue and 20 or num1aynı sebepten dolayı büyük bir hayran değilim . Aslında bu çizginin ne yaptığını iki kere düşünmeliyim.

Gerçekte ne yapmak istediğinizi başarmanın en iyi yolu orijinal versiyonudur:

if someBoolValue:
    num1 = 20

Bunun en iyi sonucunun nedeni, ne yapmak istediğinizin çok açık olması ve kendinizi karıştırmamanız veya daha sonra bu kodla başka kimseyle temasa geçeceğidir.

Ayrıca, yan not olarak, num1 = 20 if someBoolValueRuby kodu geçerlidir, çünkü Ruby biraz farklı çalışır.


8
PEP- 308'e ( docs.python.org/2.5/whatsnew/pep-308.html ) göre koşullu ifade, paren içine konursa olduğu gibi daha net hale getirilebilir num1 = (20 if someBoolValue else num1).
haridsv

46

Bunu kullan:

num1 = 20 if someBoolValue else num1

3
Bu ben ne kullanıyorum .. ve alternatif arıyor .. yine de teşekkürler!
bdhar

Bu blok nasıl adlandırılır? Yani adı ne?
fuat

1
üçlü bir operatör
Chris Maes

Büyük veri kümeleri arasında döngü yapılıyorsa, bu yaklaşımı kullanmamalıyız, çünkü else-deyimiyle sonuçlanırsak gereksiz bir atama yapar.
dapc

21

Bir satırda:

if someBoolValue: num1 = 20

Ama yapma. Bu tarz normalde beklenmez. İnsanlar daha uzun formu netlik ve tutarlılık için tercih ediyor.

if someBoolValue:
    num1 = 20

(Aynı şekilde, deve kapaklarından kaçınılmalıdır. Bu yüzden daha çok kullanın some_bool_value.)

Parça içermeyen bir satır içi ifadenin mevcut olmadığına dikkat edin, çünkü yüklem yanlışsa bir dönüş değeri olmaz. Ancak, ifadelerin tüm durumlarda açıkça tanımlanmış bir dönüş değerine sahip olması gerekir. Bu, örneğin Ruby veya Perl'deki gibi kullanımdan farklıdır.some_value if predicateelse


2
Çünkü okumak zorlaşıyor ve muhtemelen kendi kodunuzla karışacaksınız ve bu asla iyi bir fikir değil.
Frost

@bdhar, neden tek bir satıra koymak istiyorsun? Daha hızlı çalışmayacak, diğer insanların okuması daha zor olacak
John La Rooy

1
@gnibbler, aslında bir sebep yok. daha iyi okunabilirlik ile daha kısa bir form arıyordum ..
bdhar

17

aşağıdakilerden birini kullanabilirsiniz:

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal

1
Güzel bir liner şartlı atama
minhas23

Bu "yapı" nasıl adlandırılır? Python'u öğrendikten 6 ay sonra hiç görmedim.
Guimoute

1
En azından bunlar ödev değildir, önlerine koymazsanız ve ikincisi, burada açıklanan şekilde çalışmazlar. Birincisi bir demet oluşturur, daha sonra elemanlarından birini indeksle alır. Sadece ya arasında bir tam sayıyı geri 1 ve 1 testleri için çalışacak True/ Falseyana boolbir alt sınıfıdır int. Testin sadece doğru olarak değerlendirilecek bir şey döndürdüğü tüm durumlarda, bir istisna dışında başarısız olur. İkincisi sadece trueValyanlışın kendisini değerlendirmediği sürece çalışır , bu falseValda test doğru olsa bile arı atanmasına neden olur.
Bachsau

güzel kısa, ama aynı zamanda güvenle "önerilen desen" olarak kullanmak için çok zor , yukarıdaki Bachsau yorumuna bakın ... (bu yüzden aşağıya düşürdü)
tverrbjelke

6

Hayır. Sanırım böyle bir şeyin num1 = 20 if someBoolValueişe yaramasını umuyordunuz , ama işe yaramıyor. En iyi yol, ifyazdığınız gibi ifade ile düşünüyorum:

if someBoolValue:
    num1 = 20

5
num1 = 10 + 10*(someBoolValue is True)

Bu benim yeni son cevabım. Önceki cevap aşağıdaki gibiydi ve belirtilen sorun için aşırıya kaçmıştı. Getting_too_clever == not Good. İşte önceki cevap ... Truekoşul için bir şey eklemek istiyorsanız yine de iyi False:

num1 = 10 + (0,10)[someBoolValue is True]

Zaten bahsetmiş num1olduğunuz, yalnız bırakılması gereken bir değere sahip olacaksınız . Gönderinin num1 = 10ilk ifadesi olduğundan beri varsaydım , bu yüzden almak için 20işlem eklemek 10.

num1 = 10
someBoolValue = True

num1 = 10 + (0,10)[someBoolValue is True]

print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}')

bu çıktıyı üretti

num1 = 20
someBoolValue = True

Şimdi 'num1 = 10 + 10 * (someBoolValue == True)' Temelde no-op olarak 'False' koşulu olarak tanımlanan problemi cevaplamam gerektiğini düşünüyorum. 'False' için farklı bir değer ekleme seçeneği olması gerekiyorsa, önceki cevap daha iyi bir seçimdir. Gönderiyi düzenler miyim veya yorumlarda mı yaparım?
MikeyB


2

Eğer bir boole doğruysa bir yöntemi çağırmak isterseniz else None, üçüncüyü sonlandırabilirsiniz.

>>> a=1
>>> print(a) if a==1 else None
1
>>> print(a) if a==2 else None
>>> a=2
>>> print(a) if a==2 else None
2
>>> print(a) if a==1 else None
>>>

1

Bir satır kod kesinlikle sizin için ne olacak ise, Python 3.8 tanıtır atama ifadeleri sevgiyle “mors operatörü” olarak da bilinir.

:=

someBoolValue and (num := 20)

20Atanacak numilk mantıksal ifade ise True. Ödev burada parantez içinde olmalıdır, aksi takdirde bir sözdizimi hatası alırsınız.

num = 10
someBoolValue = True

someBoolValue and (num := 20)
print(num) # 20

num = 10
someBoolValue = False

someBoolValue and (num := 20)
print(num) # 10

0

Google'dan gelecek zaman yolcusu için işte yeni bir yol (python 3.8'den itibaren kullanılabilir):

b = 1
if a := b:
    # this section is only reached if b is not 0 or false.
    # Also, a is set to b
    print(a, b)


-1

İşte ne önerebilirim. İf deyimini türetmek ve num1 öğesine atamak için başka bir değişken kullanın.

Kod:

num2 =20 if someBoolValue else num1
num1=num2


-1

Bunu bu şekilde yapabilirsiniz.

try:
    a = [i for i in [20] if False][0]
except IndexError:
    print("Do what ever you want here")

Sorununuzu bu şekilde çözebilirsiniz, ancak 'try / hariç blok'u kullanmak python için en iyi yöntem değildir.

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.