2011-07-15 17 views
15

tôi có xu hướng sử dụng này rất nhiều, nhưng nó xấu xí:Cách tốt nhất để làm nhiệm vụ có điều kiện trong python

a = (lambda x: x if x else y)(get_something()) 

Vì vậy, tôi đã viết chức năng này:

def either(val, alt): 
    if val: 
     return val 
    else: 
     return alt 

Vì vậy, bạn có thể làm:

a = either(get_something(), y) 

Có chức năng tích hợp cho điều này (tương tự ISNULL trong T-SQL) không?

Trả lời

34

Nhà điều hành or làm những gì bạn muốn:

get_something() or y 

Trong thực tế, nó thể kết nối, như COALESCE (và không giống như ISNULL). Biểu thức sau đây đánh giá đối số bên trái nhiều nhất chuyển thành True.

A or B or C 
+0

Cảm ơn. Ha, tôi đã thực sự cố gắng nhưng bỏ qua nó khi cố gắng 'a = 0 hoặc None' và giao diện điều khiển in không có gì. Nhưng thử 'a is is None' sau đó cho 'True', cộng với tôi muốn 'None hoặc 0' chức năng anyway (nhận muộn) :) Bằng cách này, cảm ơn cho câu trả lời nhanh chóng. – crizCraig

+3

Chỉ cần cho bản ghi, nếu bạn đang sử dụng toán tử 'và', nó sẽ đánh giá đối số đúng nhất chuyển đổi thành True nếu tất cả đối số hoặc đối số bên trái nhiều nhất chuyển thành False nếu có chuyển đổi thành False. –

+1

"a = 0 hoặc None" Tất nhiên giao diện điều khiển sẽ không in bất cứ thứ gì, bạn chỉ định kết quả của '0 hoặc None' thành' a' và các biến với 'None' được gán cho chúng sẽ không tự động hiển thị 'None' khi được hiển thị trong bảng điều khiển. Bạn phải sử dụng cụ thể 'repr',' str' hoặc 'print'. Hay đại loại thế. – JAB

3

Bạn có thể sử dụng một đơn giản or, như vậy:

>>> a = None 
>>> b = 1 
>>> c = (a or b) # parentheses are optional 
>>> c 
1 
5

Bạn có thể sử dụng:

a = get_something() or y 

Nếu get_somethingTrue trong bối cảnh boolean, giá trị của nó sẽ được gán cho a . Nếu không - y sẽ được gán cho a.

2

Dễ dàng!

Đối với mã có điều kiện hơn:

a = b if b else val 

Đối với mã của bạn:

a = get_something() if get_something() else val 

Với nó, bạn có thể làm điều kiện phức tạp như thế này:

a = get_something() if get_something()/2!=0 else val 
+4

Trừ trường hợp này gọi 'get_something' hai lần. –

+1

có thể đặt get_somthing thành một biến. Chỉ với OR bạn không thể đặt điều kiện để làm việc. –

+1

Thật sao? tại sao xứng đáng là -1? –

1

Tôi cũng đang sử dụng (a,b)[condition based on the value of a] biểu mẫu, lưu kết quả cuộc gọi get_something() vào a, trong các trường hợp hiếm hoi được trình bày tốt nhất ở đây: http://mail.python.org/pipermail/python-list/2002-September/785515.html

... 
a=0  b=None  a or b => None  (a,b)[a is None] => 0 
a=() b=None  a or b => None  (a,b)[a is None] =>() 
... 
+0

Tôi hiểu. Điều này sẽ là nếu bạn muốn kiểm tra 'a' cho một điều kiện cụ thể hơn. Nhưng bạn cần hai dòng vì vậy tôi sẽ đi với 'a = x nếu điều kiện khác y' đó là dễ đọc hơn. Cú pháp thú vị mặc dù. Không bao giờ thấy bất cứ điều gì như nó :) – crizCraig

+0

@crizCraig: thêm một ví dụ ngắn – alexandrul

3

tôi đã cung cấp một câu trả lời cho câu hỏi này để người dùng khác. Kiểm tra nó ra ở đây:

Answer to similar question

Để đáp ứng một cách nhanh chóng ở đây, làm:

x = true_value nếu điều kiện khác false_value

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