2010-05-10 25 views
461

thể trùng lặp:
Python Ternary OperatorĐưa một if-then-else đơn giản trên một dòng

Tôi chỉ đi vào Python và tôi thực sự thích terseness của cú pháp. Tuy nhiên, có cách nào dễ dàng hơn để viết một câu lệnh if - then - else sao cho nó vừa với một dòng?

Ví dụ:

if count == N: 
    count = 0 
else: 
    count = N + 1 

Có cách nào đơn giản hơn của văn bản này? Ý tôi là, trong Mục tiêu-C, tôi sẽ viết điều này là:

count = count == N ? 0 : count + 1; 

Có điều gì tương tự với Python không?

Cập nhật

Tôi biết rằng trong trường hợp này tôi có thể sử dụng count == (count + 1) % N.

Tôi hỏi về cú pháp chung.

+0

nên không phải là được 'count = count == N? 0: N + 1, 'thay vì' count = count == N? 0: đếm + 1; '? –

+1

Đối với trường hợp cụ thể này: count = (count + 1)% (N + 1) sẽ hoạt động. –

+0

Bạn có thể thực hiện một lần nếu trên một dòng. '' 'nếu 1 == 1: in (' hi ')' '' – Chogg

Trả lời

902

Đó là cụ thể hơn một biểu ternary operator hơn một if-then, đây là cú pháp python

value_when_true if condition else value_when_false 

Better Ví dụ: (nhờ Mr. Burns)

'Yes' if fruit == 'Apple' else 'No'

Bây giờ với nhiệm vụ và tương phản với nếu cú ​​pháp

fruit = 'Apple' 
isApple = True if fruit == 'Apple' else False 

vs

fruit = 'Apple' 
isApple = False 
if fruit == 'Apple' : isApple = True 
+1

Nó rất giống với sự hiểu thấu. Bạn có thể làm điều này: 'print ('matched!' Nếu re.match (r '\ d {4,}', '0aa9') khác" nopes ")' (giả sử bạn nhập lại) – uchuugaka

+5

Lưu ý rằng cú pháp viết tắt là chỉ hợp lệ cho các giá trị thực. Bạn có thể sử dụng nó với hằng số và chức năng ('Có 'nếu trái cây ==' Apple 'khác in (' Không có Apple ')'), nhưng không phải với từ khoá (' 'Có' nếu trái cây == 'Apple' khác nâng cao Ngoại lệ ('No Apple') ') – Torben

+0

Không rõ ràng nếu tôi có thể bỏ qua, tôi có thể 'Có' nếu trái cây == 'Apple' không? – Miro

96
count = 0 if count == N else N+1 

- các nhà điều hành ternary. Mặc dù tôi muốn nói rằng giải pháp của bạn dễ đọc hơn thế này.

+5

@ THC4k: Tại sao dấu ngoặc đơn? Chúng dường như không cần thiết và không được đề cập trong PEP-308 hoặc các tài liệu (http://docs.python.org/reference/expressions.html#conditional-expressions) –

+0

Vâng, chúng không cần thiết. Không chắc chắn nơi tôi đã chọn thói quen - tôi nghĩ rằng nó đã được đề xuất trong PEP8, nhưng tôi không thể tìm thấy nó. –

+0

OK, sau đó tôi sẽ xóa chúng một lần nữa :) –

69

chung cú pháp ternary:

value_true if <test> else value_false 

Một cách khác có thể là:

[value_false, value_true][<test>] 

ví dụ:

count = [0,N+1][count==N] 

này đánh giá cả hai chi nhánh trước khi chọn một. Để chỉ đánh giá chi nhánh đã chọn:

[lambda: value_false, lambda: value_true][<test>]() 

ví dụ::

count = [lambda:0, lambda:N+1][count==N]() 
+2

Điều này dựa trên một chi tiết thực hiện mà '(Sai, True) == (0, 1)' mà tôi không biết được đảm bảo (nhưng không kiểm tra). Và mặc dù terse, nó sẽ không giành được bất kỳ giải thưởng dễ đọc nào. Bạn cũng có thể làm '" abcdefg "[i]' trong C, nhưng nó không có nghĩa là bạn nên. – msw

+6

@msw: Đảm bảo rằng 'False == 0' và' True == 1': không có chi tiết triển khai tại đây. :) Xem tiêu đề 'Booleans' dưới http://docs.python.org/reference/datamodel.html#the-standard-type-hierarchy –

+10

Nhưng không phải cả hai giá trị được tính, cho dù [] là gì? – tstenner

15
<execute-test-successful-condition> if <test> else <execute-test-fail-condition> 

với bạn mã đoạn mã nó sẽ trở thành,

count = 0 if count == N else N + 1 
87

Hơn nữa, bạn vẫn có thể sử dụng "bình thường" nếu cú ​​pháp và conflate nó thành một dòng với đại tràng.

if i > 3: print("We are done.") 

hoặc

field_plural = None 
if field_plural is not None: print("insert into testtable(plural) '{0}'".format(field_plural)) 
+5

Ai đó có thể giải thích tại sao đây không phải là câu trả lời hay nhất? Nó chắc chắn là dễ nhất để đọc IMHO. – keithhackbarth

+14

câu hỏi bao gồm điều kiện "khác" –

+2

@ johannes-braunias Phương pháp của bạn chống lại các tiêu chuẩn PEP8. –

Các vấn đề liên quan