การเขียนคำสั่ง if ในหนึ่งบรรทัดด้วยโอเปอเรเตอร์ ternary ของ Python (ตัวดำเนินการแบบมีเงื่อนไข)

ธุรกิจ

Python มีลักษณะการเขียนที่เรียกว่า ternary operators (ตัวดำเนินการตามเงื่อนไข) ที่สามารถอธิบายกระบวนการเช่นคำสั่ง if ในบรรทัดเดียว

มีการอธิบายสิ่งต่อไปนี้พร้อมกับโค้ดตัวอย่าง

  • การเขียนตัวดำเนินการไตรภาคเบื้องต้น
  • if ... elif ... else ...อธิบายเรื่องนี้ในบรรทัดเดียว
  • การรวมรายการสัญกรณ์ที่ครอบคลุมและตัวดำเนินการแบบสามส่วน
  • การรวมกันของฟังก์ชันที่ไม่ระบุชื่อ (นิพจน์แลมบ์ดา) และตัวดำเนินการแบบไตรภาค

ดูบทความต่อไปนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคำสั่ง if ปกติ

การเขียนตัวดำเนินการไตรภาคเบื้องต้น

ใน Python ตัวดำเนินการ ternary สามารถเขียนได้ดังนี้

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

หากคุณต้องการเปลี่ยนค่าตามเงื่อนไข ให้เขียนแต่ละค่าตามที่เป็นอยู่

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

หากคุณต้องการสลับการประมวลผลตามเงื่อนไข ให้อธิบายแต่ละนิพจน์

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

นิพจน์ที่ไม่คืนค่า (นิพจน์ที่ส่งคืน none) ก็เป็นที่ยอมรับเช่นกัน นิพจน์ใดนิพจน์หนึ่งจะถูกประเมินและดำเนินการตามเงื่อนไข ทั้งนี้ขึ้นอยู่กับเงื่อนไข

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

เทียบเท่ากับโค้ดต่อไปนี้ที่เขียนด้วยคำสั่ง if ปกติ

a = 1

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

นิพจน์เงื่อนไขหลายรายการสามารถต่อกันได้โดยใช้ตัวดำเนินการทางตรรกะ (และ หรือ ฯลฯ)

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 ...คำอธิบายหนึ่งบรรทัด

if ... elif ... else ...ไม่มีทางพิเศษที่จะเขียนสิ่งนี้ในบรรทัดเดียว อย่างไรก็ตาม สามารถรับรู้ได้โดยใช้ตัวดำเนินการ ternary อื่นในนิพจน์ที่ประเมินเมื่อนิพจน์เงื่อนไขของตัวดำเนินการ ternary เป็นเท็จ รูปภาพของโอเปอเรเตอร์สามชั้นที่ทำรัง

อย่างไรก็ตาม อาจเป็นการดีที่สุดที่จะไม่ใช้ข้อมูลนี้อย่างกว้างขวาง เนื่องจากจะทำให้อ่านง่ายขึ้น

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

นิพจน์เงื่อนไขต่อไปนี้สามารถตีความได้สองวิธีต่อไปนี้ แต่จะถือว่าเป็นนิพจน์แบบเดิม (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 

ตัวอย่างที่เป็นรูปธรรมมีดังนี้ นิพจน์แรกถือเป็นนิพจน์ที่สอง

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

การรวมรายการสัญกรณ์ที่ครอบคลุมและตัวดำเนินการแบบสามส่วน

การใช้งานที่เป็นประโยชน์ของตัวดำเนินการ ternary คือเมื่อประมวลผลรายการในรูปแบบรายการความเข้าใจ

ด้วยการรวมโอเปอเรเตอร์ ternary และสัญลักษณ์แสดงความเข้าใจรายการ มันเป็นไปได้ที่จะแทนที่องค์ประกอบของรายการหรือดำเนินการอื่น ๆ ขึ้นอยู่กับเงื่อนไข

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]

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสัญกรณ์ความเข้าใจรายการ ดูบทความต่อไปนี้

การรวมกันของฟังก์ชันที่ไม่ระบุชื่อ (นิพจน์แลมบ์ดา) และตัวดำเนินการแบบไตรภาค

ตัวดำเนินการ ternary ซึ่งสามารถอธิบายได้กระชับแม้ในฟังก์ชันที่ไม่ระบุชื่อ (นิพจน์แลมบ์ดา) ก็มีประโยชน์

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

print(get_odd_even(1))
# odd

print(get_odd_even(2))
# even

โปรดทราบว่าแม้ว่าจะไม่เกี่ยวข้องกับโอเปอเรเตอร์ไตรภาค แต่ตัวอย่างด้านบนกำหนดชื่อให้กับนิพจน์แลมบ์ดา ดังนั้น เครื่องมือตรวจสอบอัตโนมัติ เช่น แบบแผนการเข้ารหัส PEP8 ของ Python อาจสร้างคำเตือน

เนื่องจาก PEP8 แนะนำให้ใช้ def เมื่อกำหนดชื่อให้กับฟังก์ชัน

แนวคิดของ PEP8 มีดังนี้

  • นิพจน์แลมบ์ดาใช้เพื่อส่งผ่านอ็อบเจ็กต์ที่เรียกได้เป็นอาร์กิวเมนต์ เช่น โดยไม่ต้องตั้งชื่อ
  • ในนิพจน์แลมบ์ดา ใช้ def เพื่อกำหนดตามชื่อ