Menulis pernyataan jika dalam satu baris dengan pengendali ternary Python (pengendali bersyarat)

Perniagaan

Python mempunyai gaya penulisan yang dipanggil pengendali ternary (operator bersyarat) yang boleh menerangkan proses seperti pernyataan if dalam satu baris.

Perkara berikut diterangkan di sini, bersama dengan kod sampel.

  • Penulisan asas pengendali ternary
  • if ... elif ... else ...Terangkan perkara ini dalam satu baris
  • Menggabungkan Notasi Komprehensif Senarai dan Operator Ternary
  • Gabungan fungsi tanpa nama (ungkapan lambda) dan pengendali ternary

Lihat artikel berikut untuk mendapatkan maklumat lanjut tentang pernyataan normal if.

Penulisan asas pengendali ternary

Dalam Python, pengendali ternary boleh ditulis seperti berikut

Expression evaluated when the conditional expression is true if conditional expression else Expression evaluated when the conditional expression is false

Jika anda ingin menukar nilai mengikut syarat, hanya tulis setiap nilai sebagaimana adanya.

Value to return if conditional expression is true if conditional expression else Value to return if conditional expression is false
a = 1
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# odd

a = 2
result = 'even' if a % 2 == 0 else 'odd'
print(result)
# even

Jika anda ingin menukar pemprosesan mengikut syarat, huraikan setiap ungkapan.

a = 1
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 3

a = 2
result = a * 2 if a % 2 == 0 else a * 3
print(result)
# 4

Ungkapan yang tidak mengembalikan nilai (ungkapan yang mengembalikan Tiada) juga boleh diterima. Bergantung pada keadaan, salah satu ungkapan dinilai dan prosesnya dilaksanakan.

a = 1
print('even') if a % 2 == 0 else print('odd')
# odd

Bersamaan dengan kod berikut yang ditulis dengan pernyataan if normal.

a = 1

if a % 2 == 0:
    print('even')
else:
    print('odd')
# odd

Ungkapan bersyarat berbilang juga boleh digabungkan menggunakan operator logik (dan, atau, dsb.).

a = -2
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# negative and even

a = -1
result = 'negative and even' if a < 0 and a % 2 == 0 else 'positive or odd'
print(result)
# positive or odd

if ... elif ... else ...Penerangan satu baris

if ... elif ... else ...Tiada cara istimewa untuk menulis ini pada satu baris. Walau bagaimanapun, ia boleh direalisasikan dengan menggunakan operator ternary lain dalam ungkapan yang dinilai apabila ungkapan bersyarat operator ternary adalah palsu. Imej pengendali ternary bersarang.

Walau bagaimanapun, adalah lebih baik untuk tidak menggunakannya secara meluas kerana ia mengurangkan kebolehbacaan.

a = 2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# positive

a = 0
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# zero

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

Ungkapan bersyarat berikut boleh ditafsirkan dalam dua cara berikut, tetapi dianggap sebagai yang pertama (1).

A if condition 1 else B if condition 2 else C
1. A if condition 1 else ( B if condition 2 else C )
2. ( A if condition 1 else B ) if condition 2 else C 

Contoh konkrit adalah seperti berikut. Ungkapan pertama dianggap seolah-olah ia adalah yang kedua.

a = -2
result = 'negative' if a < 0 else 'positive' if a > 0 else 'zero'
print(result)
# negative

result = 'negative' if a < 0 else ('positive' if a > 0 else 'zero')
print(result)
# negative

result = ('negative' if a < 0 else 'positive') if a > 0 else 'zero'
print(result)
# zero

Menggabungkan Notasi Komprehensif Senarai dan Operator Ternary

Penggunaan operator ternary yang berguna ialah apabila memproses senarai dalam tatatanda pemahaman senarai.

Dengan menggabungkan operator ternary dan notasi pemahaman senarai, adalah mungkin untuk menggantikan elemen senarai atau melakukan beberapa pemprosesan lain bergantung pada syarat.

l = ['even' if i % 2 == 0 else i for i in range(10)]
print(l)
# ['even', 1, 'even', 3, 'even', 5, 'even', 7, 'even', 9]
l = [i * 10 if i % 2 == 0 else i for i in range(10)]
print(l)
# [0, 1, 20, 3, 40, 5, 60, 7, 80, 9]

Untuk mendapatkan maklumat lanjut tentang notasi pemahaman senarai, lihat artikel berikut.

Gabungan fungsi tanpa nama (ungkapan lambda) dan pengendali ternary

Pengendali ternary, yang boleh diterangkan secara ringkas walaupun dalam fungsi tanpa nama (ungkapan lambda), berguna.

get_odd_even = lambda x: 'even' if x % 2 == 0 else 'odd'

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

Ambil perhatian bahawa, walaupun tidak berkaitan dengan pengendali ternary, contoh di atas memberikan nama kepada ungkapan lambda. Oleh itu, alat semakan automatik seperti konvensyen pengekodan Python PEP8 mungkin menjana Amaran.

Ini kerana PEP8 mengesyorkan penggunaan def apabila memberikan nama kepada fungsi.

Konsep PEP8 adalah seperti berikut

  • Ungkapan Lambda digunakan untuk menghantar objek boleh dipanggil sebagai argumen, contohnya, tanpa menamakannya
  • Dalam ungkapan lambda, gunakan def untuk mentakrifkan mengikut nama