ถ้า Python ไม่มีตัวดำเนินการเงื่อนไขที่ประกอบไปด้วยสามมันเป็นไปได้ที่จะจำลองโดยใช้โครงสร้างภาษาอื่นหรือไม่?
case [...] { when ... then ...} [ else ... ] end
ผลคล้ายกัน แต่ไม่ได้ประกอบไปด้วยสามส่วน
ถ้า Python ไม่มีตัวดำเนินการเงื่อนไขที่ประกอบไปด้วยสามมันเป็นไปได้ที่จะจำลองโดยใช้โครงสร้างภาษาอื่นหรือไม่?
case [...] { when ... then ...} [ else ... ] end
ผลคล้ายกัน แต่ไม่ได้ประกอบไปด้วยสามส่วน
คำตอบ:
ใช่มันถูกเพิ่มเข้ามาในเวอร์ชั่น 2.5 ไวยากรณ์นิพจน์คือ:
a if condition else b
ครั้งแรกที่condition
ได้รับการประเมินแล้วว่าหนึ่งอย่างใดอย่างหนึ่งa
หรือb
ได้รับการประเมินและกลับมาอยู่บนพื้นฐานของบูลีนcondition
มูลค่าของ หากcondition
ประเมินTrue
แล้วa
มีการประเมินและกลับ แต่b
ถูกละเว้นหรืออื่น ๆ เมื่อb
มีการประเมินและกลับมา แต่a
จะถูกละเว้น
สิ่งนี้ยอมให้มีการลัดวงจรเนื่องจากเมื่อcondition
มีการa
ประเมินความจริงเท่านั้นและb
ไม่ได้รับการประเมินเลย แต่เมื่อcondition
มีการb
ประเมินค่าเท็จเท่านั้นและa
ไม่ได้รับการประเมินเลย
ตัวอย่างเช่น:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
โปรดทราบว่าเงื่อนไขเป็นแสดงออกไม่ได้เป็นคำสั่ง ซึ่งหมายความว่าคุณไม่สามารถใช้คำสั่งมอบหมายหรือpass
หรือข้อความอื่น ๆภายในนิพจน์เงื่อนไข:
>>> pass if False else x = 3
File "<stdin>", line 1
pass if False else x = 3
^
SyntaxError: invalid syntax
อย่างไรก็ตามคุณสามารถใช้นิพจน์เงื่อนไขเพื่อกำหนดตัวแปรดังนี้:
x = a if True else b
คิดว่านิพจน์เงื่อนไขเป็นการสลับระหว่างค่าสองค่า มันมีประโยชน์มากเมื่อคุณอยู่ในสถานการณ์ 'หนึ่งค่าหรือสถานการณ์อื่น' แต่จะไม่ทำอะไรมาก
หากคุณจำเป็นต้องใช้งบที่คุณต้องใช้ปกติif
คำสั่งแทนเงื่อนไขการแสดงออก
โปรดทราบว่า Pythonist ถูกขมวดคิ้วด้วยเหตุผลหลายประการ:
condition ? a : b
ตัวดำเนินการแบบไตรภาคจากภาษาอื่น ๆ (เช่น C, C ++, Go, Perl, Ruby, Java, Javascript, ฯลฯ ) ซึ่งอาจนำไปสู่ข้อผิดพลาดเมื่อผู้คนไม่คุ้นเคยกับ Python " พฤติกรรมที่น่าแปลกใจใช้มัน (พวกเขาอาจกลับคำสั่งโต้แย้ง)if
' จะมีประโยชน์จริง ๆและทำให้สคริปต์ของคุณกระชับยิ่งขึ้น แต่ก็ทำให้โค้ดของคุณซับซ้อนยิ่งขึ้น)หากคุณมีปัญหาในการจดจำคำสั่งซื้อโปรดจำไว้ว่าเมื่ออ่านออกเสียงคุณ (เกือบ) จะพูดในสิ่งที่คุณหมายถึง ยกตัวอย่างเช่นจะอ่านออกเสียงเป็นx = 4 if b > 8 else 9
x will be 4 if b is greater than 8 otherwise 9
เอกสารอย่างเป็นทางการ:
f(x) = |x| = x if x > 0 else -x
ฟังดูเป็นธรรมชาติสำหรับนักคณิตศาสตร์ คุณอาจเข้าใจเช่นเดียวกับ A ในกรณีส่วนใหญ่ยกเว้นเมื่อ C คุณควรทำ B แทน ...
z = 3 + x if x < y else y
ยกตัวอย่างเช่นบรรทัด ถ้าx=2
และy=1
คุณอาจคาดหวังว่าจะให้ผลตอบแทน 4 แต่จริง ๆ แล้วจะให้ผลตอบแทน 1 z = 3 + (x if x > y else y)
คือการใช้งานที่ถูกต้อง
z = 3 + x if x < y else 3 + y
) หรือจัดกลุ่มตามเงื่อนไข ( z = 3 + (x if x < y else y)
หรือz = (x if x < y else y) + 3
)
คุณสามารถจัดทำดัชนีเป็นสิ่งอันดับ:
(falseValue, trueValue)[test]
test
ความต้องการที่จะกลับมาทรูหรือเท็จ
มันอาจปลอดภัยกว่าที่จะใช้มันเป็น:
(falseValue, trueValue)[test == True]
หรือคุณสามารถใช้บิวด์อินbool()
เพื่อรับรองค่าบูลีน :
(falseValue, trueValue)[bool(<expression>)]
(lambda: print("a"), lambda: print("b"))[test==true]()
[]
ของสามารถแสดงออกโดยพลการ นอกจากนี้เพื่อความปลอดภัยของคุณอย่างชัดเจนสามารถทดสอบ truthiness [bool(<expression>)]
โดยการเขียน bool()
ฟังก์ชั่นได้รับรอบตั้งแต่ v2.2.1
True
และFalse
เป็นกุญแจ: {True:trueValue, False:falseValue}[test]
ฉันไม่รู้ว่านี่มีประสิทธิภาพน้อยกว่าหรือไม่ แต่อย่างน้อยก็หลีกเลี่ยงทั้งหมด การอภิปราย "สง่างาม" และ "น่าเกลียด" ไม่มีความกำกวมที่คุณต้องจัดการกับบูลีนแทนที่จะเป็นแบบอินไลน์
สำหรับรุ่นก่อน 2.5 มีเคล็ดลับ:
[expression] and [on_true] or [on_false]
มันสามารถให้ผลลัพธ์ที่ผิดเมื่อon_true
มีค่าบูลีนเท็จ 1
แม้ว่ามันจะมีประโยชน์ในการประเมินการแสดงออกจากซ้ายไปขวาซึ่งเป็นที่ชัดเจนในความคิดของฉัน
<expression 1> if <condition> else <expression 2>
a = 1
b = 2
1 if a > b else -1
# Output is -1
1 if a > b else -1 if a < b else 0
# Output is -1
ผู้ประกอบการสำหรับการแสดงออกเงื่อนไขในหลามถูกเพิ่มเข้ามาในปี 2006 เป็นส่วนหนึ่งของงูหลามการเพิ่มประสิทธิภาพของการเสนอ 308 รูปแบบมันแตกต่างจาก?:
ผู้ประกอบการทั่วไปและมัน:
<expression1> if <condition> else <expression2>
ซึ่งเทียบเท่ากับ:
if <condition>: <expression1> else: <expression2>
นี่คือตัวอย่าง:
result = x if a > b else y
ไวยากรณ์อื่นที่สามารถใช้ (เข้ากันได้กับรุ่นก่อน 2.5):
result = (lambda:y, lambda:x)[a > b]()
ที่ถูกดำเนินการได้รับการประเมินอย่างเฉื่อยชา
อีกวิธีคือการจัดทำดัชนี tuple (ซึ่งไม่สอดคล้องกับตัวดำเนินการตามเงื่อนไขของภาษาอื่น ๆ ส่วนใหญ่):
result = (y, x)[a > b]
หรือพจนานุกรมที่สร้างขึ้นอย่างชัดเจน:
result = {True: x, False: y}[a > b]
วิธีอื่น (น่าเชื่อถือน้อยกว่า) แต่วิธีที่ง่ายกว่าคือการใช้งานand
และor
ตัวดำเนินการ:
result = (a > b) and x or y
อย่างไรก็ตามสิ่งนี้จะไม่ทำงานหากx
เป็นFalse
เช่นนั้น
วิธีแก้ปัญหาที่เป็นไปได้คือการสร้างx
และy
แสดงรายการหรือสิ่งอันดับดังต่อไปนี้:
result = ((a > b) and [x] or [y])[0]
หรือ:
result = ((a > b) and (x,) or (y,))[0]
หากคุณทำงานกับพจนานุกรมแทนที่จะใช้เงื่อนไขแบบไตรภาคคุณสามารถใช้ประโยชน์จากget(key, default)
ตัวอย่างเช่น:
shell = os.environ.get('SHELL', "/bin/sh")
แหล่งที่มา: ?: ใน Python ที่ Wikipedia
result = {1: x, 0: y}[a > b]
เป็นอีกหนึ่งตัวแปรที่เป็นไปได้ ( True
และFalse
จริงแล้วเป็นจำนวนเต็มที่มีค่า1
และ0
)
น่าเสียดายที่
(falseValue, trueValue)[test]
ทางออกไม่มีพฤติกรรมการลัดวงจร ดังนั้นทั้งสองfalseValue
และtrueValue
ได้รับการประเมินโดยไม่คำนึงถึงเงื่อนไข นี่อาจเป็นสิ่งที่ไม่ดีหรือแม้กระทั่งบั๊กกี้ (เช่นทั้งสองtrueValue
และfalseValue
อาจเป็นวิธีการและมีผลข้างเคียง)
ทางออกหนึ่งสำหรับสิ่งนี้ก็คือ
(lambda: falseValue, lambda: trueValue)[test]()
(การดำเนินการล่าช้าจนกว่าผู้ชนะจะทราบ;)) แต่มันแนะนำความไม่สอดคล้องระหว่างวัตถุที่เรียกได้และไม่สามารถเรียกได้ นอกจากนี้ยังไม่สามารถแก้ปัญหากรณีใช้คุณสมบัติ
ดังนั้นการเล่าเรื่อง - การเลือกระหว่าง 3 โซลูชั่นที่กล่าวถึงคือการแลกเปลี่ยนระหว่างการมีคุณสมบัติลัดวงจรโดยใช้อย่างน้อยЗython 2.5 (IMHO ไม่ใช่ปัญหาอีกต่อไป) และไม่เสี่ยงต่อtrueValue
ข้อผิดพลาด" -evaluates-to-false" .
if else if
เป็นไปได้เท่านั้นที่จะเป็นความคิดที่เหมาะสมถ้ามันสามารถเปลี่ยนโซ่ยาวของ
ที่นี่ฉันเพียงแค่พยายามที่จะแสดงความแตกต่างที่สำคัญบางอย่างternary operator
ระหว่างสองภาษาการเขียนโปรแกรม
ผู้ประกอบการที่ Ternary ใน Javascript
var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0
ผู้ประกอบการที่สามในทับทิม
a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0
ผู้ประกอบการที่สามใน Scala
val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0
ผู้ประกอบการที่สามในการเขียนโปรแกรม R
a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0
ผู้ประกอบการที่สามในงูหลาม
a = 1 if True else 0
# 1
b = 1 if False else 0
# 0
สำหรับ Python 2.5 และใหม่กว่านั้นมีไวยากรณ์เฉพาะ:
[on_true] if [cond] else [on_false]
ใน Pythons รุ่นเก่าจะไม่มีการใช้ตัวดำเนินการแบบไตรภาค แต่สามารถจำลองได้
cond and on_true or on_false
แต่มีปัญหาที่อาจเกิดขึ้นซึ่งหากcond
ประเมินTrue
และon_true
ประเมินFalse
แล้วจะถูกส่งกลับแทนon_false
on_true
หากคุณต้องการพฤติกรรมนี้วิธีการก็ใช้ได้เช่นกัน:
{True: on_true, False: on_false}[cond is True] # is True, not == True
ซึ่งสามารถห่อโดย:
def q(cond, on_true, on_false)
return {True: on_true, False: on_false}[cond is True]
และใช้วิธีนี้:
q(cond, on_true, on_false)
มันเข้ากันได้กับทุกรุ่นของหลาม
q("blob", on_true, on_false)
ผลตอบแทนon_false
ในขณะที่ผลตอบแทนon_true if cond else on_false
on_true
วิธีแก้ปัญหาคือการแทนที่cond
ด้วยcond is not None
ในกรณีเหล่านี้แม้ว่าจะไม่ใช่วิธีที่สมบูรณ์แบบ
bool(cond)
แทนcond is True
ล่ะ อดีตตรวจสอบความจริงของcond
หลังตรวจสอบตัวชี้ความเท่าเทียมกันกับTrue
วัตถุ ตามที่ไฮไลต์โดย @AndrewCecil "blob"
เป็นเรื่องจริง แต่ก็เป็นis not True
จริง
[on_false, on_True][cond is True]
เพื่อให้นิพจน์สั้นลง
คุณมักจะพบ
cond and on_true or on_false
แต่สิ่งนี้นำไปสู่ปัญหาเมื่อ on_true == 0
>>> x = 0
>>> print x == 0 and 0 or 1
1
>>> x = 1
>>> print x == 0 and 0 or 1
1
ที่คุณคาดหวังสำหรับผู้ประกอบการแบบไตรภาคปกติผลนี้
>>> x = 0
>>> print 0 if x == 0 else 1
0
>>> x = 1
>>> print 0 if x == 0 else 1
1
Python มีตัวดำเนินการแบบเงื่อนไขหรือไม่
ใช่. จากไฟล์ไวยากรณ์ :
test: or_test ['if' or_test 'else' test] | lambdef
ส่วนที่น่าสนใจคือ:
or_test ['if' or_test 'else' test]
ดังนั้นการดำเนินการตามเงื่อนไขแบบไตรภาคจึงอยู่ในรูปแบบ:
expression1 if expression2 else expression3
expression3
จะได้รับการประเมินอย่างเกียจคร้าน (นั่นคือประเมินเฉพาะในกรณีที่expression2
เป็นเท็จในบริบทบูลีน) และเนื่องจากคำจำกัดความซ้ำคุณสามารถโยงพวกมันไปเรื่อย ๆ (แม้ว่ามันอาจจะถือว่าเป็นสไตล์ที่ไม่ดีก็ตาม)
expression1 if expression2 else expression3 if expression4 else expression5 # and so on
โปรดทราบว่าทุกคนจะต้องปฏิบัติตามที่มีif
else
ผู้ที่เรียนรู้รายการความเข้าใจและนิพจน์ตัวสร้างอาจเป็นบทเรียนที่ยากต่อการเรียนรู้ - สิ่งต่อไปนี้ใช้ไม่ได้เนื่องจาก Python คาดหวังว่านิพจน์ที่สามจะเป็นอย่างอื่น:
[expression1 if expression2 for element in iterable]
# ^-- need an else here
SyntaxError: invalid syntax
ซึ่งก่อให้เกิด ดังนั้นข้างต้นเป็นทั้งชิ้นส่วนที่ไม่สมบูรณ์ของตรรกะ (บางทีผู้ใช้คาดหวังว่าไม่มี -op ในสภาพที่เป็นเท็จ) หรือสิ่งที่อาจจะมีวัตถุประสงค์เพื่อใช้ expression2 เป็นตัวกรอง - บันทึกว่าต่อไปนี้เป็น Python ที่ถูกกฎหมาย:
[expression1 for element in iterable if expression2]
expression2
ทำงานเป็นตัวกรองสำหรับความเข้าใจในรายการและไม่ใช่ตัวดำเนินการแบบมีเงื่อนไข
คุณอาจพบว่าค่อนข้างเจ็บปวดในการเขียนข้อความต่อไปนี้:
expression1 if expression1 else expression2
expression1
จะต้องได้รับการประเมินสองครั้งด้วยการใช้งานด้านบน มันสามารถ จำกัด การซ้ำซ้อนหากมันเป็นเพียงตัวแปรท้องถิ่น อย่างไรก็ตาม Pythonic idiom ที่ใช้กันทั่วไปและมีประสิทธิภาพสำหรับกรณีการใช้งานนี้คือการใช้or
พฤติกรรมการลัดของ:
expression1 or expression2
ซึ่งเทียบเท่าในความหมาย โปรดทราบว่าไกด์นำเที่ยวบางคนอาจ จำกัด การใช้งานนี้เนื่องจากมีความชัดเจน - มันบรรจุความหมายจำนวนมากไว้ในไวยากรณ์น้อยมาก
expression1 or expression2
มีความคล้ายคลึงกันและมีข้อเสียเปรียบ / บวกเช่นเดียวกับexpression1 || expression2
ใน javascript
expressionN
สำหรับทุกอินสแตนซ์จะสอดคล้องกัน แต่คุณอาจเข้าใจการตั้งชื่อได้ง่ายขึ้นซึ่งแยกแยะนิพจน์การทดสอบตามเงื่อนไขจากนิพจน์ผลลัพธ์สองรายการ เช่นresult1 if condition else result2
. โดยเฉพาะอย่างยิ่งเมื่อทำรัง (หรือการผูกมัด):result1 if condition1 else result2 if condition2 else result3
ผูกมัด): มาดูกันว่าวิธีนี้อ่านดีกว่ามากแค่ไหน?
การจำลองผู้ประกอบการที่ประกอบไปด้วยหลาม
ตัวอย่างเช่น
a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()
เอาท์พุท:
'b greater than a'
result = (y, x)[a < b]
คุณไม่ใช้lambda
ฟังก์ชั่น?
ผู้ประกอบการเงื่อนไข Ternary เพียงแค่ช่วยให้การทดสอบเงื่อนไขในบรรทัดเดียวแทนที่ multiline ถ้าอื่นทำให้รหัสกะทัดรัด
[on_true] ถ้า [expression] อื่น [on_false]
# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min) # Output: 10
# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lamda is more efficient than above two methods
# because in lambda we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10
# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
if a > b else "b is greater than a")
วิธีการดังกล่าวสามารถเขียนเป็น:
# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
if a > b:
print("a is greater than b")
else:
print("b is greater than a")
else:
print("Both a and b are equal")
# Output: b is greater than a
if-else
ไม่ใช่การเขียนจริงของผู้ประกอบการที่ประกอบไปด้วยและจะสร้างผลลัพธ์ที่แตกต่างกันสำหรับค่าที่เลือกของ a และ b (โดยเฉพาะหากมีประเภทที่ใช้__ne__
วิธีแปลก ๆ)
คุณสามารถทำได้: -
[condition] and [expression_1] or [expression_2] ;
ตัวอย่าง:-
print(number%2 and "odd" or "even")
สิ่งนี้จะพิมพ์ "คี่" ถ้าจำนวนคี่หรือ "คู่" ถ้าจำนวนเป็นคู่
บันทึก :- 0, None, False, emptylist, emptyString ประเมินว่าเป็นเท็จ และข้อมูลอื่นใดที่ไม่ใช่ 0 จะประเมินเป็น True
หากเงื่อนไข [เงื่อนไข] กลายเป็น "จริง" ดังนั้น expression_1 จะได้รับการประเมิน แต่ไม่ใช่ expression_2 ถ้าเรา "และ" มีค่า 0 (ศูนย์) ผลลัพธ์จะเป็น fasle เสมอดังนั้นในคำสั่งด้านล่าง
0 and exp
นิพจน์ exp จะไม่ถูกประเมินเลยตั้งแต่ "และ" กับ 0 จะประเมินเป็นศูนย์เสมอและไม่จำเป็นต้องประเมินนิพจน์ นี่คือการทำงานของคอมไพเลอร์ในทุกภาษา
ใน
1 or exp
exp ของนิพจน์จะไม่ถูกประเมินเลยตั้งแต่ "หรือ" ด้วย 1 จะเป็น 1 เสมอดังนั้นมันจะไม่รบกวนการประเมินค่า exp ของ expression เนื่องจากผลลัพธ์จะเป็น 1 อย่างไรก็ตาม วิธีการปรับให้เหมาะสมของคอมไพเลอร์.
แต่ในกรณีของ
True and exp1 or exp2
การแสดงออกที่สอง exp2 จะไม่ถูกประเมินตั้งแต่ True and exp1
จะเป็นจริงเมื่อ exp1 ไม่ใช่เท็จ
ในทำนองเดียวกันค่ะ
False and exp1 or exp2
นิพจน์ exp1 จะไม่ถูกประเมินเนื่องจาก False เทียบเท่ากับการเขียน 0 และการทำ "และ" ด้วย 0 จะเป็น 0 เอง แต่หลังจาก exp1 ตั้งแต่ "หรือ" ถูกใช้งานมันจะประเมินนิพจน์ exp2 หลัง "หรือ"
หมายเหตุ: -การแยกประเภทนี้โดยใช้ "หรือ" และ "และ" และ "สามารถใช้ได้เฉพาะเมื่อ expression_1 ไม่มีค่าความจริงเป็นเท็จ (หรือ 0 หรือไม่มีหรือ emptylist [] หรือ emptystring '') เนื่องจากถ้า expression_1 กลายเป็น เท็จจากนั้น expression_2 จะถูกประเมินเนื่องจากการมีอยู่ "หรือ" ระหว่าง exp_1 และ exp_2
ในกรณีที่คุณยังต้องการให้มันทำงานได้กับทุกกรณีโดยไม่คำนึงว่า exp_1 และ exp_2 คืออะไรให้ทำดังนี้: -
[condition] and ([expression_1] or 1) or [expression_2] ;
x = [condition] and ([expression_1] or 1) or [expression_2]
และexpression_1
ประเมินเป็นเท็จx
จะไม่1
expression_1
ใช้คำตอบที่ยอมรับได้
เคล็ดลับมากกว่าคำตอบ (ไม่จำเป็นต้องทำซ้ำอย่างชัดเจนสำหรับเวลา hundreth) แต่บางครั้งฉันใช้มันเป็นทางลัด oneliner ในโครงสร้าง:
if conditionX:
print('yes')
else:
print('nah')
, กลายเป็น:
print('yes') if conditionX else print('nah')
บางคน (หลายคน :) อาจขมวดคิ้วว่ามันเป็นเสียงที่ไม่ไพเราะ (แม้กระทั่ง ruby-ish :) แต่ฉันเองก็พบว่ามันเป็นธรรมชาติมากกว่า - นั่นคือวิธีที่คุณแสดงมันตามปกติบวกกับการดึงดูดสายตาเล็กน้อยในโค้ดขนาดใหญ่
print( 'yes' if conditionX else 'nah' )
คำตอบของคุณมากกว่า :-)
print()
ในทั้งสองกรณี - และมันก็ดูไพเราะมากกว่านี้ฉันต้องยอมรับ :) แต่ถ้าการแสดงออก / ฟังก์ชั่นไม่เหมือนกัน - เหมือนprint('yes') if conditionX else True
- เพื่อให้ได้ความจริงprint()
เท่านั้นconditionX
print('yes') if conditionX else print('nah')
คือการให้ SyntaxError ใน Python2
print "yes"
ในขณะที่งูใหญ่ 3 มันเป็นฟังก์ชั่น print("yes")
- ที่สามารถแก้ไขได้โดยการอย่างใดอย่างหนึ่งใช้มันเป็นคำสั่งหรือดีกว่า from future import print_function
-
a if condition else b
เพียงจำปิรามิดนี้หากคุณมีปัญหาในการจดจำ:
condition
if else
a b
ทางเลือกหนึ่งในการแสดงออกตามเงื่อนไขของ Python
"yes" if boolean else "no"
คือต่อไปนี้:
{True:"yes", False:"no"}[boolean]
ซึ่งมีส่วนขยายที่ดีดังต่อไปนี้:
{True:"yes", False:"no", None:"maybe"}[boolean_or_none]
ทางเลือกที่สั้นที่สุดยังคงอยู่:
("no", "yes")[boolean]
แต่ไม่มีทางเลือกอื่น
yes() if boolean else no()
หากคุณต้องการหลีกเลี่ยงการประเมินผลyes()
และ no()
เพราะใน
(no(), yes())[boolean] # bad
ทั้งno()
และyes()
ได้รับการประเมิน
ภาษาการเขียนโปรแกรมจำนวนมากที่ได้มาจากC
มักจะมีไวยากรณ์ต่อไปนี้ของผู้ประกอบการเงื่อนไขที่ประกอบไปด้วย:
<condition> ? <expression1> : <expression2>
ตอนแรก
Python
B enevolent D ictator FหรือL ife (ผมหมายถึงกุยรถตู้ซัมของหลักสูตร) ปฏิเสธมัน (ในฐานะที่ไม่ใช่ Pythonic สไตล์) เพราะมันค่อนข้างยากที่จะเข้าใจสำหรับคนที่ไม่ได้ใช้C
ภาษา นอกจากนี้เครื่องหมายโคลอน:
นั้นมีประโยชน์หลายอย่างอยู่Python
แล้ว หลังจากPEP 308ได้รับการอนุมัติPython
ในที่สุดก็ได้รับการแสดงออกทางลัดตามเงื่อนไขของตัวเอง (สิ่งที่เราใช้ตอนนี้):
<expression1> if <condition> else <expression2>
ดังนั้นก่อนอื่นประเมินสภาพ ถ้ามันกลับTrue
, Expression1จะได้รับการประเมินเพื่อให้ผลลัพธ์ที่มิฉะนั้นExpression2จะถูกประเมิน เนื่องจากกลไกการประเมินผลของ Lazy - นิพจน์เดียวเท่านั้นที่จะถูกดำเนินการ
นี่คือตัวอย่าง (เงื่อนไขจะถูกประเมินจากซ้ายไปขวา):
pressure = 10
print('High' if pressure < 20 else 'Critical')
# Result is 'High'
ผู้ประกอบการ Ternary สามารถถูกผูกมัดในซีรีส์:
pressure = 5
print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical')
# Result is 'Normal'
อันต่อไปนี้เหมือนกับอันก่อนหน้านี้:
pressure = 5
if pressure < 20:
if pressure < 10:
print('Normal')
else:
print('High')
else:
print('Critical')
# Result is 'Normal'
หวังว่านี่จะช่วยได้
ตามที่ได้ตอบไปแล้วใช่มีตัวดำเนินการที่ประกอบไปด้วยในหลาม:
<expression 1> if <condition> else <expression 2>
ข้อมูลเพิ่มเติม:
หาก<expression 1>
เป็นเงื่อนไขที่คุณสามารถใช้การประเมิน Short-cirquit :
a = True
b = False
# Instead of this:
x = a if a else b
# You could use Short-cirquit evaluation:
x = a or b
PS: แน่นอนการประเมินระยะสั้นของไซริคไม่ใช่ผู้ประกอบการที่สาม แต่บ่อยครั้งที่ผู้ประกอบการที่ใช้ในกรณีที่ไฟฟ้าลัดวงจรจะเพียงพอ
short-circuit
การประเมินผลนั้น
ใช่หลามมีผู้ประกอบการที่สามนี่คือไวยากรณ์และรหัสตัวอย่างเพื่อแสดงให้เห็นถึงเดียวกัน :)
#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false
a= input("Enter the First Number ")
b= input("Enter the Second Number ")
print("A is Bigger") if a>b else print("B is Bigger")
print
ไม่ใช่ตัวเลือกที่ดีจริงๆเพราะจะให้ SyntaxError ใน Python2
Python มีรูปแบบที่สามสำหรับการมอบหมาย; อย่างไรก็ตามอาจมีรูปแบบที่สั้นกว่าที่ผู้คนควรระวัง
เป็นเรื่องปกติที่จะต้องกำหนดให้กับตัวแปรหนึ่งค่าหรืออีกค่าหนึ่งขึ้นอยู่กับเงื่อนไข
>>> li1 = None
>>> li2 = [1, 2, 3]
>>>
>>> if li1:
... a = li1
... else:
... a = li2
...
>>> a
[1, 2, 3]
^ นี่เป็นรูปแบบยาวสำหรับการทำงานที่ได้รับมอบหมาย
ด้านล่างเป็นรูปแบบที่ประกอบไปด้วย แต่นี่ไม่ใช่วิธีที่รวบรัดที่สุด - ดูตัวอย่างสุดท้าย
>>> a = li1 if li1 else li2
>>>
>>> a
[1, 2, 3]
>>>
ด้วย Python คุณสามารถใช้or
สำหรับการมอบหมายอื่น
>>> a = li1 or li2
>>>
>>> a
[1, 2, 3]
>>>
การทำงานดังกล่าวข้างต้นli1
เป็นเพราะNone
และ interp ถือว่าเป็นเท็จในการแสดงออกทางตรรกะ จากนั้น interp จะดำเนินการต่อและประเมินค่านิพจน์ที่สองซึ่งไม่ใช่None
และไม่ใช่รายการที่ว่างเปล่าดังนั้นจึงได้รับการกำหนดให้
ใช้ได้กับรายการที่ว่างเปล่า ตัวอย่างเช่นหากคุณต้องการกำหนดa
รายการใดก็ตามที่มีรายการ
>>> li1 = []
>>> li2 = [1, 2, 3]
>>>
>>> a = li1 or li2
>>>
>>> a
[1, 2, 3]
>>>
เมื่อรู้สิ่งนี้คุณสามารถมอบหมายสิ่งเหล่านี้ได้ทุกเมื่อที่พบ นอกจากนี้ยังใช้งานได้กับสตริงและ iterables อื่น ๆ คุณสามารถกำหนดa
สตริงใดก็ได้ที่ไม่ว่างเปล่า
>>> s1 = ''
>>> s2 = 'hello world'
>>>
>>> a = s1 or s2
>>>
>>> a
'hello world'
>>>
ฉันชอบไวยากรณ์ T ของ Ternary เสมอ แต่ Python จะก้าวไปอีกขั้น!
ฉันเข้าใจว่าบางคนอาจพูดว่านี่ไม่ใช่ตัวเลือกโวหารที่ดีเพราะต้องอาศัยกลไกที่ไม่ชัดเจนสำหรับนักพัฒนาทั้งหมดทันที ฉันไม่เห็นด้วยกับมุมมองนั้น Python เป็นภาษาที่มีรูปแบบหลากหลายและมีอุบายทางอุทานมากมาย แต่ยิ่งคุณเรียนรู้และเข้าใจกลไกของระบบพื้นฐานมากเท่าไหร่คุณก็ยิ่งชื่นชมมันมากขึ้นเท่านั้น
คำตอบอื่น ๆ พูดคุยอย่างถูกต้องเกี่ยวกับตัวดำเนินการแบบไตรภาค ฉันต้องการที่จะเติมเต็มโดยการกล่าวถึงสถานการณ์ที่ผู้ประกอบการที่สามมักจะใช้ แต่ที่มีสำนวนที่ดีกว่า นี่คือสถานการณ์ของการใช้ค่าเริ่มต้น
สมมติว่าเราต้องการใช้option_value
กับค่าเริ่มต้นหากยังไม่ได้ตั้ง:
run_algorithm(option_value if option_value is not None else 10)
หรือเพียงแค่
run_algorithm(option_value if option_value else 10)
อย่างไรก็ตามทางออกที่ดีกว่าก็คือการเขียน
run_algorithm(option_value or 10)
หากมีการกำหนดตัวแปรและคุณต้องการตรวจสอบว่ามีค่าที่คุณสามารถทำได้ a or b
def test(myvar=None):
# shorter than: print myvar if myvar else "no Input"
print myvar or "no Input"
test()
test([])
test(False)
test('hello')
test(['Hello'])
test(True)
จะส่งออก
no Input
no Input
no Input
hello
['Hello']
True
x if x else y
x if z else y
วิธีที่เป็นระเบียบเพื่อเชื่อมโยงตัวดำเนินการหลายตัว
f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'
array = [(0,0),(0,1),(1,0),(1,1)]
for a in array:
x, y = a[0], a[1]
print(f(x,y))
# Output is:
# equal,
# less,
# greater,
# equal
ฉันพบว่ายุ่งยากกับ python ไวยากรณ์เริ่มต้นval = a if cond else b
ดังนั้นบางครั้งฉันทำสิ่งนี้:
iif = lambda (cond, a, b): a if cond else b
# so I can then use it like:
val = iif(cond, a, b)
แน่นอนว่ามันมีข้อเสียของการประเมินทั้งสองด้าน (a และ b) เสมอ แต่ไวยากรณ์มันชัดเจนกว่าสำหรับฉัน
val = a if cond else b
คำสั่งที่ง่ายกว่า
is_spacial=True if gender = "Female" else (True if age >= 65 else False)
**
สามารถซ้อนกันได้ตามความต้องการของคุณ ขอให้โชคดี
**