Python มีลักษณะการเขียนที่เรียกว่า ternary operators (ตัวดำเนินการตามเงื่อนไข) ที่สามารถอธิบายกระบวนการเช่นคำสั่ง if ในบรรทัดเดียว
มีการอธิบายสิ่งต่อไปนี้พร้อมกับโค้ดตัวอย่าง
- การเขียนตัวดำเนินการไตรภาคเบื้องต้น
if ... elif ... else ...
อธิบายเรื่องนี้ในบรรทัดเดียว- การรวมรายการสัญกรณ์ที่ครอบคลุมและตัวดำเนินการแบบสามส่วน
- การรวมกันของฟังก์ชันที่ไม่ระบุชื่อ (นิพจน์แลมบ์ดา) และตัวดำเนินการแบบไตรภาค
ดูบทความต่อไปนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคำสั่ง if ปกติ
- ที่เกี่ยวข้อง:วิธีเขียนเงื่อนไขสาขาด้วยคำสั่ง if ใน Python
การเขียนตัวดำเนินการไตรภาคเบื้องต้น
ใน 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
นิพจน์เงื่อนไขหลายรายการสามารถต่อกันได้โดยใช้ตัวดำเนินการทางตรรกะ (และ หรือ ฯลฯ)
- ที่เกี่ยวข้อง:ตัวดำเนินการเชิงตรรกะของ Python และหรือไม่ใช่ (การรวมเชิงตรรกะ การแตกแยกทางตรรกะ การปฏิเสธ)
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]
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสัญกรณ์ความเข้าใจรายการ ดูบทความต่อไปนี้
- ที่เกี่ยวข้อง:วิธีใช้ Python list comprehensions
การรวมกันของฟังก์ชันที่ไม่ระบุชื่อ (นิพจน์แลมบ์ดา) และตัวดำเนินการแบบไตรภาค
ตัวดำเนินการ 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 เพื่อกำหนดตามชื่อ