2013-02-13 27 views
5

Tôi thực sự sử dụng Python và Flask cho devblog của tôi. Tôi biết rằng tùy thuộc vào ngôn ngữ, nó được khuyến khích để sử dụng một rõ ràng else khi nó không phải là bắt buộc, nhưng tôi không biết làm thế nào nó hoạt động trong Python.Có thích hợp hơn khi sử dụng "else" trong Python khi không cần thiết?

Ví dụ: tôi có một hàm có số if trả về nội dung nào đó nếu câu lệnh là đúng. Vì vậy, các else là không cần thiết vì có hoặc không có nó, việc thực hiện tiếp tục bình thường.

def foo(bar): 
    if not isinstance(foo, list): 
     return "an error" 
    else: # not necessary 
     return "something" 

Vì vậy, tôi nên sử dụng nó như thế này, hay như:

def foo(bar): 
    if not isinstance(foo, list): 
     return "an error" 

    return "something" 
+1

tôi [gần] luôn luôn "nhân bản" các đường dẫn thực hiện - ngoại lệ là nhanh chóng ném một ngoại lệ: D (Khác với trả về một giá trị.) Đây chủ yếu là một sự lựa chọn kiểu dáng (ví dụ: * Not Co Nstructive *), nhưng tôi cho rằng nó làm cho "con đường thực tế" phân biệt hơn và có thể ngăn chặn một số sai lầm ngớ ngẩn. –

+1

Tôi không nghĩ đó là vấn đề ngôn ngữ mà là phong cách mã hóa. Vì vậy, câu trả lời có thể là: bất cứ điều gì bạn tìm thấy dễ đọc hơn. – madth3

+1

Cá nhân tôi thích cái đầu tiên cho tính đối xứng hoặc cách thứ ba để gán một giá trị trả về trong mỗi nhánh và sau đó có một 'trả về trả về' duy nhất ở cuối. Một lợi thế nhỏ của _not_ bằng cách sử dụng một 'else' hoặc' elif' bên cạnh nó là một dòng phụ để gõ, là khi bạn có nhiều hơn hai, nó dễ dàng hơn để xóa hoặc thêm vào bất cứ nơi nào bạn muốn trong chuỗi. Nói chung tôi không tin rằng có nhiều sự khác biệt về hiệu suất. – martineau

Trả lời

1

Nó thực sự làm cho không có sự khác biệt. Dù bằng cách nào cũng sẽ làm điều tương tự.

Tôi thích thứ hai, bởi vì đó là một dòng mã nhỏ hơn.

Je prefere cette dernière

+0

[Hướng dẫn kiểu PEP 8] (http://www.python.org/dev/peps/pep-0008/) cũng có các ví dụ dựa vào phương pháp đó. –

+0

@sharth Tuy nhiên, ví dụ "PEP 8" hiển thị ném một ngoại lệ, không trả lại. Ngoài ra, nó không được rút ra, và do đó tôi ghét phải xem xét nó là một phần của "canon" trong PEP 8. –

+1

Tôi cũng nghiêng về phía sau và cụm từ rất nhiều điều kiện của tôi như thế để cắt giảm thụt đầu dòng dư thừa. – Kiirani

2

này đã được thảo luận ở đây: If-Else-Return or just if-Return?

Về cơ bản, hai hình thức là tương đương về mặt hiệu quả vì máy có để thực hiện một bước nhảy anyway. Vì vậy, nó sôi xuống đến phong cách mã hóa và bạn sẽ phải quyết định rằng trên của riêng bạn (hoặc với nhóm của bạn).

Cá nhân tôi thích với câu lệnh else để dễ đọc hơn.

+0

Xin lỗi vì bản sao, tôi đã không nhìn thấy nó ngay cả khi tôi đã tìm kiếm trước khi đăng. – vildric

0

Tôi khá mới lập trình và trong ngữ cảnh của câu hỏi này, tôi được nhắc rằng thường có trường hợp tôi không chắc mình có nên sử dụng "else" hoặc "elif", ví dụ: trong trường hợp như thế.

1)

if numA < numB: 
    print('numA is smaller') 
elif numB < numA: 
    print('numB is smaller') 
else: 
    print('both numbers are equal') 

2)

if numA < numB: 
     print('numA is smaller') 
elif numB < numA: 
     print('numB is smaller') 
elif numA == numB: 
     print('both numbers are equal') 

Tôi nghĩ rằng nó sẽ không tạo sự khác biệt rất lớn, hay tôi sai? Trong các ví dụ khác, biến thể thứ hai có thể mạnh mẽ hơn nói chung, tôi nghĩ vậy.

+0

Tôi sẽ cho rằng ví dụ thứ 2 là "xấu" - nó là một dạng nhẹ của [Nhưng .. Bất cứ điều gì có thể xảy ra!] (Http://thedailywtf.com/Articles/ButAnything-Can-Happen!.aspx) Tôi có thấy các tình huống mà việc kiểm tra [thừa nhận] dư thừa gây ra kết quả không chính xác nếu một cập nhật được cập nhật trong khi một số khác thì không. –

+0

Cảm ơn, đó là một bài viết hay. Tuy nhiên, tôi chỉ tự hỏi sai lầm là gì, có lẽ tôi quá mệt mỏi, nhưng liệu nó có phải là 'else if (a> 10' sai hay không, và cái gì đó như' a> = 10' nên được sử dụng? nếu a == 10? –

+0

Với thứ tự sane: 'x y', là true * trừ * khi 'x == y'. Hãy xem xét trường hợp đơn giản của 'if a: .. elif! a: ..'; tại sao lại viết'! a' thay vì 'rõ ràng hơn 'nếu a: .. else: ..'? Trong trường hợp sau , với 'else' rất dễ thấy rằng * ít nhất một nhánh * sẽ thực hiện.Nếu không, chúng ta phải xem xét một cách thủ công một biểu thức bổ sung và sau đó * lý do * rằng nó sẽ luôn giữ nếu trước đó không. –

3

Trong trường hợp đầu tiên, Python sẽ thêm return None rõ ràng vào cuối hàm - mặc dù chúng ta có thể thấy nó không thực sự cần thiết. Trong trường hợp thứ hai nó không.

Tôi không thấy bất kỳ lợi thế để có else:

>>> import dis 
>>> def f(): 
... if 1>2: 
... return 2 
... return 3 
... 
>>> def g(): 
... if 1>2: 
... return 2 
... else: 
... return 3 
... 
>>> dis.dis(f) 
    2   0 LOAD_CONST    1 (1) 
       3 LOAD_CONST    2 (2) 
       6 COMPARE_OP    4 (>) 
       9 POP_JUMP_IF_FALSE  16 

    3   12 LOAD_CONST    2 (2) 
      15 RETURN_VALUE   

    4  >> 16 LOAD_CONST    3 (3) 
      19 RETURN_VALUE   
>>> dis.dis(g) 
    2   0 LOAD_CONST    1 (1) 
       3 LOAD_CONST    2 (2) 
       6 COMPARE_OP    4 (>) 
       9 POP_JUMP_IF_FALSE  16 

    3   12 LOAD_CONST    2 (2) 
      15 RETURN_VALUE   

    5  >> 16 LOAD_CONST    3 (3) 
      19 RETURN_VALUE   
      20 LOAD_CONST    0 (None) 
      23 RETURN_VALUE   
0

Từ Chromium's phong cách hướng dẫn:

Không sử dụng khác sau khi trở về:

# Bad 
if (foo) 
    return 1; 
else 
    return 2; 

# Good 
if (foo) 
    return 1; 
return 2; 

return foo ? 1 : 2; 
Các vấn đề liên quan