Nếu Python không có toán tử điều kiện ternary, có thể mô phỏng một toán tử bằng các cấu trúc ngôn ngữ khác không?
case [...] { when ... then ...} [ else ... ] endmột hiệu ứng tương tự nhưng hoàn toàn không phải là ternary.
                Nếu Python không có toán tử điều kiện ternary, có thể mô phỏng một toán tử bằng các cấu trúc ngôn ngữ khác không?
case [...] { when ... then ...} [ else ... ] endmột hiệu ứng tương tự nhưng hoàn toàn không phải là ternary.
                Câu trả lời:
Có, nó đã được thêm vào trong phiên bản 2.5. Cú pháp biểu thức là:
a if condition else bĐầu tiên conditionđược đánh giá, sau đó chính xác một trong hai ahoặc bđược đánh giá và trả về dựa trên giá trị Boolean của condition. Nếu conditionđánh giá True, sau đó ađược đánh giá và trả về nhưng bbị bỏ qua, hoặc nếu không bđược đánh giá và trả lại nhưng abị bỏ qua.
Điều này cho phép đoản mạch vì khi nào conditionđúng chỉ ađược đánh giá và hoàn toàn bkhông được đánh giá, nhưng khi nào conditionsai chỉ bđược đánh giá và hoàn toàn akhông được đánh giá.
Ví dụ:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
Lưu ý rằng các điều kiện là một biểu thức , không phải là một tuyên bố . Điều này có nghĩa là bạn không thể sử dụng câu lệnh gán hoặc passhoặc câu lệnh khác trong biểu thức điều kiện :
>>> pass if False else x = 3
  File "<stdin>", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax
Tuy nhiên, bạn có thể sử dụng các biểu thức điều kiện để gán một biến như vậy:
x = a if True else bHãy nghĩ về biểu thức điều kiện như chuyển đổi giữa hai giá trị. Nó rất hữu ích khi bạn ở trong tình huống 'một giá trị này hoặc một giá trị khác', nhưng nó không làm được gì nhiều.
Nếu bạn cần sử dụng các câu lệnh, bạn phải sử dụng một if câu lệnh bình thường thay vì một biểu thức điều kiện .
Hãy nhớ rằng nó bị một số Pythonistas cau mày vì một số lý do:
condition ? a : btoán tử ternary cổ điển từ nhiều ngôn ngữ khác (như C, C ++, Go, Perl, Ruby, Java, Javascript, v.v.), có thể dẫn đến lỗi khi mọi người không quen với Python " đáng ngạc nhiên "hành vi sử dụng nó (họ có thể đảo ngược thứ tự đối số).if' có thể thực sự hữu ích và làm cho tập lệnh của bạn ngắn gọn hơn, nhưng nó thực sự làm phức tạp mã của bạn)Nếu bạn gặp khó khăn trong việc ghi nhớ thứ tự, thì hãy nhớ rằng khi đọc to, bạn (gần như) nói ý của bạn. Ví dụ, x = 4 if b > 8 else 9được đọc to như x will be 4 if b is greater than 8 otherwise 9.
Tài liệu chính thức:
f(x) = |x| = x if x > 0 else -xnghe có vẻ rất tự nhiên đối với các nhà toán học. Bạn cũng có thể hiểu nó giống như làm A trong hầu hết các trường hợp, ngoại trừ khi C thì bạn nên làm B thay vì ...
                    z = 3 + x if x < y else y. Nếu x=2và y=1, bạn có thể mong đợi rằng mang lại 4, nhưng nó thực sự mang lại 1. z = 3 + (x if x > y else y)là cách sử dụng đúng.
                    z = 3 + x if x < y else 3 + y) hoặc nhóm điều kiện ( z = 3 + (x if x < y else y)hoặc z = (x if x < y else y) + 3)
                    Bạn có thể lập chỉ mục thành một tuple:
(falseValue, trueValue)[test]testcần trả về Đúng hay Sai . 
Có thể an toàn hơn khi luôn thực hiện nó như sau:
(falseValue, trueValue)[test == True]hoặc bạn có thể sử dụng tích hợp bool()để đảm bảo giá trị Boolean :
(falseValue, trueValue)[bool(<expression>)](lambda: print("a"), lambda: print("b"))[test==true]()
                    []s có thể là một biểu thức tùy ý. Ngoài ra, để an toàn, bạn có thể kiểm tra tính trung thực bằng cách viết [bool(<expression>)]. Các bool()chức năng đã được khoảng từ v2.2.1.
                    Truevà Falsenhư các khóa:   {True:trueValue, False:falseValue}[test]  Tôi không biết liệu điều này có kém hiệu quả hơn không, nhưng ít nhất nó cũng tránh được toàn bộ Cuộc tranh luận "thanh lịch" so với "xấu xí". Không có sự mơ hồ rằng bạn đang đối phó với một boolean hơn là một int.
                    Đối với các phiên bản trước 2.5, có mẹo:
[expression] and [on_true] or [on_false]Nó có thể cho kết quả sai khi on_true 
 có giá trị boolean sai. 1
 
Mặc dù nó có lợi ích trong việc đánh giá các biểu thức từ trái sang phải, nhưng theo tôi thì rõ ràng hơn.
 <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 -1Từ tài liệu :
Các biểu thức có điều kiện (đôi khi được gọi là toán tử ba chiều của người Viking) có mức ưu tiên thấp nhất trong tất cả các hoạt động của Python.
Biểu thức
x if C else yđầu tiên đánh giá điều kiện, C ( không phải x ); nếu C đúng, x được ước tính và giá trị của nó được trả về; mặt khác, y được ước tính và giá trị của nó được trả về.Xem PEP 308 để biết thêm chi tiết về các biểu thức điều kiện.
Mới kể từ phiên bản 2.5.
Một toán tử cho một biểu thức có điều kiện trong Python đã được thêm vào năm 2006 như là một phần của Đề xuất nâng cao Python 308 . Hình thức của nó khác với ?:toán tử thông thường và nó:
<expression1> if <condition> else <expression2>tương đương với:
if <condition>: <expression1> else: <expression2>Đây là một ví dụ:
result = x if a > b else yMột cú pháp khác có thể được sử dụng (tương thích với các phiên bản trước 2.5):
result = (lambda:y, lambda:x)[a > b]()trong đó toán hạng được đánh giá lười biếng .
Một cách khác là lập chỉ mục một tuple (không phù hợp với toán tử điều kiện của hầu hết các ngôn ngữ khác):
result = (y, x)[a > b]hoặc từ điển được xây dựng rõ ràng:
result = {True: x, False: y}[a > b]Một phương pháp khác (ít đáng tin cậy hơn), nhưng đơn giản hơn là sử dụng andvà ortoán tử:
result = (a > b) and x or ytuy nhiên điều này sẽ không hoạt động nếu xcó thể False.
Một cách giải quyết khác có thể là tạo xvà yliệt kê hoặc bộ dữ liệu như sau:
result = ((a > b) and [x] or [y])[0]hoặc là:
result = ((a > b) and (x,) or (y,))[0]Nếu bạn đang làm việc với từ điển, thay vì sử dụng một điều kiện ternary, bạn có thể tận dụng get(key, default), ví dụ:
shell = os.environ.get('SHELL', "/bin/sh")result = {1: x, 0: y}[a > b]là một biến thể có thể khác ( Truevà Falsethực sự là số nguyên với các giá trị 1và 0)
                    thật không may
(falseValue, trueValue)[test]giải pháp không có hành vi ngắn mạch; do đó cả hai falseValuevà trueValueđược đánh giá bất kể điều kiện. Đây có thể là tối ưu hoặc thậm chí là lỗi (tức là cả hai trueValuevà falseValuecó thể là phương pháp và có tác dụng phụ).
Một giải pháp cho vấn đề này là
(lambda: falseValue, lambda: trueValue)[test]()(thực thi bị trì hoãn cho đến khi người chiến thắng được biết;)), nhưng nó đưa ra sự không nhất quán giữa các đối tượng có thể gọi và không thể gọi được. Ngoài ra, nó không giải quyết trường hợp khi sử dụng thuộc tính.
Và câu chuyện đã xảy ra - lựa chọn giữa 3 giải pháp được đề cập là sự đánh đổi giữa việc có tính năng ngắn mạch, sử dụng ít nhất Зython 2.5 (IMHO không phải là vấn đề nữa) và không dễ bị lỗi " trueValue-đánh giá thành sai" .
if else if.
                    Ở đây tôi chỉ cố gắng thể hiện một số khác biệt quan trọng ternary operatorgiữa một vài ngôn ngữ lập trình.
Toán tử Ternary trong Javascript
var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0Toán tử Ternary trong Ruby
a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0Toán tử ternary ở Scala
val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0Toán tử ternary trong lập trình R
a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0Toán tử ternary trong Python
a = 1 if True else 0
# 1
b = 1 if False else 0
# 0Đối với Python 2.5 và mới hơn có một cú pháp cụ thể:
[on_true] if [cond] else [on_false]Ở Pythons cũ, một toán tử ternary không được triển khai nhưng có thể mô phỏng nó.
cond and on_true or on_falseMặc dù, có một vấn đề tiềm ẩn, nếu condđánh giá Truevà on_trueđánh giá Falsesau đó on_falseđược trả lại thay vì on_true. Nếu bạn muốn hành vi này phương thức là OK, nếu không hãy sử dụng:
{True: on_true, False: on_false}[cond is True] # is True, not == Truecó thể được bọc bởi:
def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]và sử dụng theo cách này:
q(cond, on_true, on_false)Nó tương thích với tất cả các phiên bản Python.
q("blob", on_true, on_false)trả về on_false, trong khi on_true if cond else on_falsetrả về on_true. Một cách giải quyết là để thay thế condvới cond is not Nonetrong những trường hợp này, mặc dù đó không phải là một giải pháp hoàn hảo.
                    bool(cond)thay thế cond is True? Cái trước kiểm tra tính trung thực của condcái sau, cái sau kiểm tra sự bằng nhau của con trỏ với Trueđối tượng. Như được nhấn mạnh bởi @AndrewCecil, "blob"là sự thật nhưng nó is not True.
                    [on_false, on_True][cond is True]để biểu thức trở nên ngắn hơn.
                    Bạn có thể thường xuyên tìm thấy
cond and on_true or on_falsenhưng điều này dẫn đến sự cố khi on_true == 0
>>> x = 0
>>> print x == 0 and 0 or 1 
1
>>> x = 1
>>> print x == 0 and 0 or 1 
1nơi bạn mong đợi cho một nhà điều hành ternary bình thường kết quả này
>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1Python có một toán tử điều kiện ternary?
Đúng. Từ tệp ngữ pháp :
test: or_test ['if' or_test 'else' test] | lambdefPhần quan tâm là:
or_test ['if' or_test 'else' test]Vì vậy, một hoạt động có điều kiện ternary có dạng:
expression1 if expression2 else expression3expression3sẽ được đánh giá một cách lười biếng (nghĩa là chỉ được đánh giá nếu expression2sai trong bối cảnh boolean). Và vì định nghĩa đệ quy, bạn có thể xâu chuỗi chúng vô thời hạn (mặc dù nó có thể được coi là phong cách xấu.)
expression1 if expression2 else expression3 if expression4 else expression5 # and so onLưu ý rằng mỗi ifphải được theo sau với một else. Những người học hiểu danh sách và biểu thức trình tạo có thể thấy đây là một bài học khó học - những điều sau đây sẽ không hoạt động, vì Python mong đợi một biểu thức thứ ba cho một biểu thức khác:
[expression1 if expression2 for element in iterable]
#                          ^-- need an else heremà tăng a SyntaxError: invalid syntax. Vì vậy, ở trên là một đoạn logic chưa hoàn chỉnh (có lẽ người dùng mong đợi không có op trong điều kiện sai) hoặc điều có thể được dự định là sử dụng biểu thức 2 làm bộ lọc - lưu ý rằng sau đây là Python hợp pháp:
[expression1 for element in iterable if expression2]expression2hoạt động như một bộ lọc để hiểu danh sách, và không phải là một toán tử điều kiện ternary.
Bạn có thể thấy hơi đau khi viết như sau:
expression1 if expression1 else expression2expression1sẽ phải được đánh giá hai lần với cách sử dụng ở trên. Nó có thể hạn chế sự dư thừa nếu nó chỉ đơn giản là một biến cục bộ. Tuy nhiên, một thành ngữ Pythonic phổ biến và hiệu quả cho trường hợp sử dụng này là sử dụng orhành vi rút gọn của:
expression1 or expression2tương đương về ngữ nghĩa. Lưu ý rằng một số hướng dẫn kiểu có thể hạn chế việc sử dụng này với lý do rõ ràng - nó có rất nhiều ý nghĩa thành rất ít cú pháp.
expression1 or expression2tương tự và có cùng nhược điểm / tích cực như expression1 || expression2trong javascript
                    expressionNcho tất cả các trường hợp là nhất quán, nhưng có thể dễ hiểu hơn với cách đặt tên phân biệt biểu thức kiểm tra có điều kiện với hai biểu thức kết quả; ví dụ result1 if condition else result2. Điều này đặc biệt rõ ràng khi làm tổ (còn gọi là chuỗi) : result1 if condition1 else result2 if condition2 else result3. Xem cách này tốt hơn bao nhiêu?
                    Mô phỏng toán tử ternary python.
Ví dụ
a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()đầu ra:
'b greater than a'result = (y, x)[a < b]Tại sao bạn sử dụng lambdachức năng ? 
                    Toán tử điều kiện ternary chỉ đơn giản cho phép kiểm tra một điều kiện trong một dòng duy nhất thay thế cho multiline if-other làm cho mã nhỏ gọn.
[on_true] nếu [biểu thức] khác [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")Cách tiếp cận trên có thể được viết là:
# 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 aif-elsekhông thực sự là một bản viết lại của toán tử ternary và sẽ tạo ra đầu ra khác nhau cho các giá trị được chọn của a và b (cụ thể nếu một loại là một __ne__phương thức thực hiện một phương thức kỳ lạ ).
                    bạn có thể làm được việc này :-
[condition] and [expression_1] or [expression_2] ;Thí dụ:-
print(number%2 and "odd" or "even")Điều này sẽ in "lẻ" nếu số là số lẻ hoặc "chẵn" nếu số đó là số chẵn.
Lưu ý: - 0, Không có, Sai, danh sách trống, blankString đánh giá là Sai. Và bất kỳ dữ liệu nào khác 0 đều đánh giá là True.
nếu điều kiện [điều kiện] trở thành "Đúng" thì biểu thức_1 sẽ được ước tính nhưng không phải là biểu thức_2. Nếu chúng ta "và" một cái gì đó có 0 (không), kết quả sẽ luôn luôn bị sai lệch. Vì vậy, trong câu lệnh dưới đây,
0 and expBiểu thức exp sẽ không được đánh giá ở tất cả vì "và" với 0 sẽ luôn luôn được ước tính bằng 0 và không cần phải đánh giá biểu thức. Đây là cách trình biên dịch tự hoạt động, trong tất cả các ngôn ngữ.
Trong
1 or expexp của biểu thức sẽ không được đánh giá ở tất cả vì "hoặc" với 1 sẽ luôn là 1. Vì vậy, sẽ không bận tâm để đánh giá biểu thức exp vì dù sao kết quả sẽ là 1. (phương pháp tối ưu hóa trình biên dịch).
Nhưng trong trường hợp
True and exp1 or exp2Biểu thức thứ hai exp2 sẽ không được đánh giá vì True and exp1sẽ là True khi exp1 không sai.
Tương tự như vậy trong
False and exp1 or exp2Biểu thức exp1 sẽ không được đánh giá vì Sai tương đương với viết 0 và thực hiện "và" với 0 sẽ là 0 nhưng sau khi exp1 kể từ "hoặc" được sử dụng, nó sẽ đánh giá biểu thức exp2 sau "hoặc".
Lưu ý: - Loại phân nhánh này sử dụng "hoặc" và "và" chỉ có thể được sử dụng khi biểu thức_1 không có giá trị Truth là Sai (hoặc 0 hoặc Không hoặc danh sách trống [] hoặc chuỗi rỗng ''.) Kể từ khi biểu thức_1 trở thành Sai, sau đó biểu thức_2 sẽ được đánh giá vì sự hiện diện "hoặc" giữa exp_1 và exp_2.
Trong trường hợp bạn vẫn muốn làm cho nó hoạt động cho tất cả các trường hợp bất kể giá trị thật của exp_1 và exp_2 là gì, hãy làm điều này: -
[condition] and ([expression_1] or 1) or [expression_2] ;x = [condition] and ([expression_1] or 1) or [expression_2]và expression_1đánh giá là sai, xsẽ 1không expression_1. Sử dụng câu trả lời được chấp nhận.
                    Nhiều hơn một mẹo hơn là một câu trả lời (không cần lặp lại điều hiển nhiên trong thời gian hundreth), nhưng đôi khi tôi sử dụng nó như một lối tắt oneliner trong các cấu trúc như vậy:
if conditionX:
    print('yes')
else:
    print('nah'), trở thành:
print('yes') if conditionX else print('nah')Một số (nhiều :) có thể cau mày vì nó là unpythonic (thậm chí, ruby-ish :), nhưng cá nhân tôi thấy nó tự nhiên hơn - tức là cách bạn thể hiện nó bình thường, cộng với một chút trực quan hấp dẫn hơn trong các khối mã lớn.
print( 'yes' if conditionX else 'nah' )hơn câu trả lời của bạn. :-)
                    print()trong cả hai trường hợp - và có vẻ hơi pythonic hơn, tôi phải thừa nhận :) Nhưng điều gì sẽ xảy ra nếu các biểu thức / chức năng không giống nhau - giống như print('yes') if conditionX else True- để có được sự thật print()duy nhấtconditionX 
                    print('yes') if conditionX else print('nah')là nó đưa ra một SyntaxError trong Python2.
                    print "yes"trong khi trong Python 3 nó là một hàm - print("yes"). Điều đó có thể được giải quyết bằng cách sử dụng nó như một tuyên bố, hoặc tốt hơn - from future import print_function.
                    Một trong những lựa chọn thay thế cho biểu thức điều kiện của Python
"yes" if boolean else "no"như sau:
{True:"yes", False:"no"}[boolean]có phần mở rộng tốt đẹp sau:
{True:"yes", False:"no", None:"maybe"}[boolean_or_none]Sự thay thế ngắn nhất vẫn còn:
("no", "yes")[boolean]nhưng không có cách nào khác
yes() if boolean else no()nếu bạn muốn tránh việc đánh giá yes() và no() , bởi vì
(no(), yes())[boolean]  # badcả hai no()và yes()được đánh giá.
Nhiều ngôn ngữ lập trình bắt nguồn từ Cthường có cú pháp sau của toán tử điều kiện ternary:
<condition> ? <expression1> : <expression2>Lúc đầu,
PythonB enevolent D ictator F hoặc L ife (ý tôi là Guido van Rossum, tất nhiên) đã từ chối nó (như phong cách không phải Pythonic), vì nó khá khó hiểu đối với những người không quen sử dụngCngôn ngữ. Ngoài ra, dấu hai chấm:đã có nhiều công dụng trongPython. Sau khi PEP 308 được phê duyệt,Pythoncuối cùng đã nhận được biểu thức điều kiện tắt của chính nó (những gì chúng ta sử dụng bây giờ):
<expression1> if <condition> else <expression2>Vì vậy, trước tiên nó đánh giá điều kiện. Nếu nó trả về True, biểu thức1 sẽ được ước tính để đưa ra kết quả, nếu không thì biểu thức 2 sẽ được ước tính. Do cơ chế đánh giá lười biếng - chỉ một biểu thức sẽ được thực thi.
Dưới đây là một số ví dụ (điều kiện sẽ được đánh giá từ trái sang phải):
pressure = 10
print('High' if pressure < 20 else 'Critical')
# Result is 'High'Toán tử ternary có thể được nối tiếp trong chuỗi:
pressure = 5
print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical')
# Result is 'Normal'Cái sau giống như cái trước:
pressure = 5
if pressure < 20:
    if pressure < 10:
        print('Normal')
    else:
        print('High')
else:
    print('Critical')
# Result is 'Normal'Hi vọng điêu nay co ich.
Như đã trả lời, vâng, có một toán tử ternary trong python:
<expression 1> if <condition> else <expression 2>Thông tin thêm:
Nếu <expression 1>là điều kiện bạn có thể sử dụng đánh giá ngắn cirquito :
a = True
b = False
# Instead of this:
x = a if a else b
# You could use Short-cirquit evaluation:
x = a or bPS: Tất nhiên, việc đánh giá xơ gan ngắn không phải là toán tử ternary nhưng thường thì ternary được sử dụng trong trường hợp ngắn mạch là đủ.
short-circuitđánh giá đó .
                    CÓ, python có một toán tử ternary, đây là cú pháp và mã ví dụ để chứng minh tương tự :)
#[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")printthực sự không phải là một lựa chọn tốt, vì điều này sẽ cung cấp một SyntaxError trong Python2.
                    Python có một hình thức ternary cho các bài tập; tuy nhiên có thể có một dạng ngắn hơn mà mọi người nên biết.
Rất cần phải gán cho một giá trị biến hoặc giá trị khác tùy thuộc vào một điều kiện.
>>> li1 = None
>>> li2 = [1, 2, 3]
>>> 
>>> if li1:
...     a = li1
... else:
...     a = li2
...     
>>> a
[1, 2, 3]^ Đây là hình thức dài để làm bài tập như vậy.
Dưới đây là hình thức chim nhạn. Nhưng đây không phải là cách ngắn gọn nhất - xem ví dụ cuối cùng.
>>> a = li1 if li1 else li2
>>> 
>>> a
[1, 2, 3]
>>> Với Python, bạn chỉ cần sử dụng orcho các bài tập thay thế.
>>> a = li1 or li2
>>> 
>>> a
[1, 2, 3]
>>> Các công việc trên kể từ li1là Nonevà interp coi đó là Sai trong các biểu thức logic. Sau đó, interp di chuyển và đánh giá biểu thức thứ hai, đây không Nonephải là một danh sách trống - vì vậy nó được gán cho a.
Điều này cũng hoạt động với danh sách trống. Ví dụ, nếu bạn muốn chỉ định adanh sách nào có mục.
>>> li1 = []
>>> li2 = [1, 2, 3]
>>> 
>>> a = li1 or li2
>>> 
>>> a
[1, 2, 3]
>>> Biết điều này, bạn có thể chỉ cần các bài tập như vậy bất cứ khi nào bạn gặp chúng. Điều này cũng hoạt động với chuỗi và lặp khác. Bạn có thể gán abất kỳ chuỗi nào không trống.
>>> s1 = ''
>>> s2 = 'hello world'
>>> 
>>> a = s1 or s2
>>> 
>>> a
'hello world'
>>> Tôi luôn thích cú pháp ternary C, nhưng Python đưa nó tiến thêm một bước!
Tôi hiểu rằng một số người có thể nói rằng đây không phải là một lựa chọn phong cách tốt bởi vì nó phụ thuộc vào cơ học không rõ ràng ngay lập tức đối với tất cả các nhà phát triển. Cá nhân tôi không đồng ý với quan điểm đó. Python là một ngôn ngữ giàu cú pháp với nhiều thủ thuật thành ngữ không rõ ràng ngay lập tức đối với trình duyệt. Nhưng bạn càng tìm hiểu và hiểu các cơ chế của hệ thống cơ bản, bạn càng đánh giá cao nó.
Các câu trả lời khác nói chính xác về toán tử ternary Python. Tôi muốn bổ sung bằng cách đề cập đến một kịch bản mà toán tử ternary thường được sử dụng nhưng trong đó có một thành ngữ tốt hơn. Đây là kịch bản sử dụng một giá trị mặc định.
Giả sử chúng ta muốn sử dụng option_valuevới một giá trị mặc định nếu nó không được đặt:
run_algorithm(option_value if option_value is not None else 10)hoặc đơn giản
run_algorithm(option_value if option_value else 10)Tuy nhiên, một giải pháp tốt hơn bao giờ hết chỉ đơn giản là viết
run_algorithm(option_value or 10)nếu biến được định nghĩa và bạn muốn kiểm tra xem nó có giá trị không 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)sẽ xuất
no Input
no Input
no Input
hello
['Hello']
Truex if x else y, nhưng không x if z else y.
                    Một cách gọn gàng để xâu chuỗi nhiều toán tử:
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
Tôi thấy rườm rà cú pháp python mặc định val = a if cond else b, vì vậy đôi khi tôi làm điều này:
iif = lambda (cond, a, b): a if cond else b
# so I can then use it like:
val = iif(cond, a, b)Tất nhiên, nó có nhược điểm là luôn luôn đánh giá cả hai mặt (a và b), nhưng cú pháp rõ ràng hơn với tôi
val = a if cond else btuyên bố đơn giản hơn .