Satu baris jika-kondisi-tugas

145

Saya memiliki kode berikut

num1 = 10
someBoolValue = True

Saya perlu mengatur nilai num1untuk 20jika someBoolValueadalah True; dan tidak melakukan hal lain. Jadi, inilah kode saya untuk itu

num1 = 20 if someBoolValue else num1

Adakah cara agar saya bisa menghindari ...else num1bagian tersebut agar terlihat lebih bersih? Setara dengan

if someBoolValue:
    num1 = 20

Aku mencoba menggantinya dengan ...else passseperti ini: num1=20 if someBoolValue else pass. Yang saya dapatkan hanyalah kesalahan sintaks. Aku juga tidak bisa mengabaikan ...else num1bagian itu.

bdhar
sumber
2
Ubah saja semuanya menjadi num1 = 20 if someBoolValue else 10. Lalu Anda menyimpan num1=10garis juga?
Thomas Ahle
Terima kasih. Tapi ini bukan kode saya. Maksud saya yang num1sudah ada ...
bdhar

Jawaban:

205

Saya tidak berpikir ini mungkin dengan Python, karena apa yang sebenarnya Anda coba lakukan mungkin diperluas menjadi sesuatu seperti ini:

num1 = 20 if someBoolValue else num1

Jika Anda mengecualikan else num1, Anda akan menerima kesalahan sintaks karena saya yakin tugas tersebut pasti mengembalikan sesuatu.

Seperti yang telah disebutkan orang lain, Anda dapat melakukan ini, tetapi itu buruk karena Anda mungkin akan membingungkan diri sendiri saat membaca kode itu di lain waktu:

if someBoolValue: num1=20

Saya bukan penggemar berat num1 = someBoolValue and 20 or num1karena alasan yang sama. Saya harus benar-benar berpikir dua kali tentang apa yang dilakukan baris itu.

Cara terbaik untuk benar-benar mencapai apa yang ingin Anda lakukan adalah versi aslinya:

if someBoolValue:
    num1 = 20

Alasan mengapa verison terbaik adalah karena sangat jelas apa yang ingin Anda lakukan, dan Anda tidak akan bingung, atau siapa pun yang akan menghubungi kode itu nanti.

Juga, sebagai catatan tambahan, num1 = 20 if someBoolValueadalah kode Ruby yang valid, karena Ruby bekerja sedikit berbeda.

Embun beku
sumber
9
Sesuai PEP-308 ( docs.python.org/2.5/whatsnew/pep-308.html ), ekspresi kondisional dapat dibuat lebih jelas jika dimasukkan ke dalam tanda kurung, seperti pada num1 = (20 if someBoolValue else num1).
haridsv
49

Gunakan ini:

num1 = 20 if someBoolValue else num1
gigimon
sumber
3
ini adalah apa yang telah saya gunakan .. dan mencari alternatif .. terima kasih !!
bdhar
Bagaimana cara memanggil blok ini? Maksud saya apa namanya?
fuat
2
itu adalah operator terner
Chris Maes
1
Seseorang tidak boleh menggunakan pendekatan ini jika melakukan perulangan melalui kumpulan data yang besar karena ini memperkenalkan tugas yang tidak perlu jika kita berakhir di pernyataan lain.
dapc
22

Dalam satu baris:

if someBoolValue: num1 = 20

Tapi jangan lakukan itu. Gaya ini biasanya tidak diharapkan. Orang lebih suka bentuk yang lebih panjang untuk kejelasan dan konsistensi.

if someBoolValue:
    num1 = 20

(Sama halnya, topi unta harus dihindari. Jadi sebaiknya gunakan some_bool_value.)

Perhatikan bahwa ekspresi sebaris some_value if predicatetanpa elsebagian tidak ada karena tidak akan ada nilai yang dikembalikan jika predikatnya salah. Namun, ekspresi harus memiliki nilai hasil yang ditentukan dengan jelas dalam semua kasus. Ini berbeda dari penggunaan seperti di, katakanlah, Ruby atau Perl.

Debilski
sumber
2
Karena sulit dibaca dan Anda mungkin akan bingung dengan kode Anda sendiri, dan itu bukan ide yang bagus.
Frost
@bdhar, mengapa Anda ingin meletakkannya dalam satu baris? Itu tidak akan berjalan lebih cepat, itu hanya akan lebih sulit bagi orang lain untuk membaca
John La Rooy
1
@gnibbler, sebenarnya tidak ada alasan. saya sedang mencari formulir yang lebih pendek dengan keterbacaan yang lebih baik ..
bdhar
17

Anda dapat menggunakan salah satu dari berikut ini:

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal
kerwal
sumber
1
Tugas bersyarat satu baris yang bagus
minhas23
Bagaimana "struktur" itu disebut? Saya belum pernah melihat itu dalam ~ 6 bulan belajar Python.
Guimoute
2
Setidaknya ini bukan tugas, kecuali jika Anda meletakkannya di depan mereka, dan kedua, tugas itu tidak akan berfungsi seperti yang dijelaskan di sini. Yang pertama membuat tupel, lalu mengambil salah satu elemennya berdasarkan indeks. Ini hanya akan berfungsi untuk pengujian yang mengembalikan integer antara -1 dan 1, atau True/ False, karena boolmerupakan subclass dari int. Dalam semua kasus di mana tes mengembalikan sesuatu yang hanya akan dievaluasi benar, itu gagal dengan pengecualian. Yang kedua hanya berfungsi selama trueValtidak mengevaluasi salah itu sendiri, yang akan menghasilkan nilai yang falseValditetapkan meskipun tes itu benar.
Bachsau
ini cukup pendek, tetapi juga sangat sulit untuk digunakan dengan aman sebagai "pola yang direkomendasikan", lihat komentar di atas dari Bachsau ... (jadi saya
memilihnya
6

Tidak. Saya kira Anda berharap sesuatu seperti itu num1 = 20 if someBoolValueakan berhasil, tetapi ternyata tidak. Saya pikir cara terbaik adalah dengan ifpernyataan seperti yang Anda tulis:

if someBoolValue:
    num1 = 20
Mark Byers
sumber
5
num1 = 10 + 10*(someBoolValue is True)

Itulah jawaban terakhir saya yang baru. Jawaban sebelumnya adalah sebagai berikut dan berlebihan untuk masalah yang disebutkan. Getting_too_clever == not Good. Inilah jawaban sebelumnya ... masih bagus jika Anda ingin menambahkan satu hal untuk Truecond dan satu lagi untuk False:

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

Anda sebutkan num1tentunya sudah memiliki nilai yang harus dibiarkan begitu saja. Saya berasumsi num1 = 10karena itu adalah pernyataan pertama dari posting, jadi operasi yang harus dilakukan 20adalah menambahkan 10.

num1 = 10
someBoolValue = True

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

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

menghasilkan keluaran ini

num1 = 20
someBoolValue = True
MikeyB
sumber
Sekarang saya berpikir bahwa saya seharusnya menjawab 'num1 = 10 + 10 * (someBoolValue == True)' Masalah yang didefinisikan sebagai kondisi 'Salah' sebagai no-op pada dasarnya. Jika itu perlu menjadi pilihan untuk menambahkan nilai yang berbeda untuk 'Salah' maka jawaban sebelumnya lebih cocok. Apakah saya mengedit posting saya atau melakukan ini di komentar?
MikeyB
2
num1 = 20 * someBoolValue or num1
kerwal
sumber
2

Jika Anda ingin memanggil metode jika beberapa boolean benar, Anda dapat else Nonemenghentikan trinary.

>>> 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
>>>
soultech67
sumber
1

Jika satu kode baris pasti akan terjadi untuk Anda, Python 3.8 memperkenalkan ekspresi tugas yang dikenal sebagai "operator walrus".

:=

someBoolValue and (num := 20)

Ini 20akan ditetapkan ke numjika ekspresi boolean pertama adalah True. Tugas harus berada di dalam tanda kurung di sini jika tidak, Anda akan mendapatkan kesalahan sintaks.

num = 10
someBoolValue = True

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

num = 10
someBoolValue = False

someBoolValue and (num := 20)
print(num) # 10
Vahid Hallaji
sumber
0

Untuk penjelajah waktu masa depan dari google, berikut adalah cara baru (tersedia dari python 3.8 dan seterusnya):

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)
Adnan Y
sumber
-1

Anda pasti bisa menggunakan num1 = (20 if someBoolValue else num1) jika Anda mau.

Yaonan Qian
sumber
Jawaban duplikat di atas?
Adam Smith
-1

Inilah yang bisa saya sarankan. Gunakan variabel lain untuk mendapatkan klausa if dan tetapkan ke num1.

Kode:

num2 =20 if someBoolValue else num1
num1=num2
j raj
sumber
-1

Cara lain num1 = (20*boolVar)+(num1*(not boolVar))

Rody Dari Argentina
sumber
-1

Anda bisa melakukannya dengan cara ini.

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

Anda dapat menyelesaikan masalah Anda dengan cara ini tetapi, menggunakan 'coba / kecuali blok' bukanlah praktik terbaik untuk python.

Ayesh Weerasinghe
sumber