2012-02-14 35 views
37

Trong python, có sự khác biệt giữa tiếng nói:Sự khác biệt giữa Nhiều Nếu và Elif của Python

if text == 'sometext': 
    print(text) 
if text == 'nottext': 
    print("notanytext") 

if text == 'sometext': 
     print(text) 
elif text == 'nottext': 
     print("notanytext") 

Chỉ cần tự hỏi nếu nhiều IFS có thể gây ra bất kỳ vấn đề không mong muốn và nếu nó là tốt hơn thực hành sử dụng elifs

Trả lời

56

Nhiều nếu có nghĩa là mã của bạn sẽ đi và rà soát tất cả nếu điều kiện, nơi như trong trường hợp của elif, nếu một người nếu điều kiện thỏa mãn nó sẽ không kiểm tra các điều kiện khác ..

2

Trong ví dụ trên có sự khác biệt, bởi vì mã thứ hai của bạn đã thụt vào elif, nó sẽ thay đổi d thực sự nằm trong khối nếu khối và là cú pháp không chính xác về cú pháp và cú pháp trong ví dụ này.

Python sử dụng thụt lề dòng để xác định khối mã (hầu hết các ngôn ngữ C sử dụng {} để kèm theo một khối mã, nhưng python sử dụng thụt lề dòng), vì vậy khi bạn đang mã hóa, bạn nên xem xét sự chú ý một cách nghiêm túc.

mẫu của bạn 1:

if text == 'sometext': 
    print(text) 
elif text == 'nottext': 
    print("notanytext") 

cả nếuelif được thụt vào như nhau, vì vậy họ có liên quan đến cùng một logic. ví dụ thứ hai của bạn:

if text == 'sometext': 
    print(text) 
    elif text == 'nottext': 
     print("notanytext") 

elif được thụt hơn nếu, trước khi một khối bao quanh nó, vì vậy nó được coi bên trong nếu khối. và kể từ bên trong số nếu không có lồng nhau khác nếu, thì elif đang được coi là lỗi cú pháp của trình thông dịch Python.

+0

xin lỗi, tôi đã sửa chúng – Billjk

5
def multipleif(text): 
    if text == 'sometext': 
     print(text) 
    if text == 'nottext': 
     print("notanytext") 

def eliftest(text): 
    if text == 'sometext': 
     print(text) 
    elif text == 'nottext': 
     print("notanytext") 

text = "sometext" 

timeit multipleif(text) 
100000 loops, best of 3: 5.22 us per loop 

timeit elif(text) 
100000 loops, best of 3: 5.13 us per loop 

Bạn có thể thấy elif rằng là hơi nhanh hơn. Điều này có lẽ sẽ rõ ràng hơn nếu có nhiều ifif và nhiều elif hơn.

25

Một cách dễ dàng khác để thấy sự khác biệt giữa việc sử dụng nếu và elif là ví dụ này ở đây:

def analyzeAge(age): 
    if age < 21: 
     print "You are a child" 
    if age > 21: 
     print "You are an adult" 
    else: #Handle all cases were 'age' is negative 
     print "The age must be a positive integer!" 

analyzeAge(18) #Calling the function 
>You are a child 
>The age must be a positive integer! 

Ở đây bạn có thể thấy rằng khi 18 được sử dụng như là đầu vào câu trả lời là (ngạc nhiên) 2 câu . Điều đó là sai. Nó chỉ nên là câu đầu tiên.

Đó là vì CẢ nếu các câu lệnh đang được đánh giá. Máy tính xem chúng dưới dạng hai tuyên bố riêng biệt:

  • Điều đầu tiên là đúng cho 18 và do đó "Bạn là con" được in.
  • Câu lệnh if thứ hai là sai và do đó phần còn lại là in được thực thi "Độ tuổi phải là số nguyên dương".

Các elif bản sửa lỗi này và làm cho hai câu lệnh if 'dính vào nhau' như một:

def analyzeAge(age): 
    if age < 21: 
     print "You are a child" 
    elif age > 21: 
     print "You are an adult" 
    else: #Handle all cases were 'age' is negative 
     print "The age must be a positive integer!" 

analyzeAge(18) #Calling the function 
>You are a child 
1

Dưới đây là một cách khác để suy nghĩ về điều này:

Hãy nói rằng bạn có hai cụ điều kiện if/cấu trúc catchall khác sẽ không đủ:

Ví dụ:

Tôi có bảng 3 x 3 tic-tac-toe và tôi muốn in tọa độ của cả hai đường chéo chứ không phải phần còn lại của hình vuông.

Tic-Tac-Toe Coordinate System

tôi quyết định sử dụng và nếu cấu trúc/elif thay vì ...

for row in range(3): 
    for col in range(3): 
     if row == col: 
      print('diagonal1', '(%s, %s)' % (i, j)) 
     elif col == 2 - row: 
      print('\t' * 6 + 'diagonal2', '(%s, %s)' % (i, j)) 

Đầu ra là:

diagonal1 (0, 0) 
         diagonal2 (0, 2) 
diagonal1 (1, 1) 
         diagonal2 (2, 0) 
diagonal1 (2, 2) 

Nhưng chờ đợi! Tôi muốn bao gồm cả ba tọa độ của diagonal2 vì (1, 1) cũng là một phần của đường chéo 2.

'elif' gây ra sự phụ thuộc với 'if' sao cho nếu 'if' ban đầu được thỏa mãn thì 'elif' sẽ không bắt đầu ngay cả khi logic 'elif' thỏa mãn điều kiện.

Thay đổi 'elif' thứ hai thành 'if' thay thế.

for row in range(3): 
    for col in range(3): 
     if row == col: 
      print('diagonal1', '(%s, %s)' % (i, j)) 
     if col == 2 - row: 
      print('\t' * 6 + 'diagonal2', '(%s, %s)' % (i, j)) 

Bây giờ tôi nhận được kết quả mà tôi muốn vì hai câu lệnh 'if' loại trừ lẫn nhau.

diagonal1 (0, 0) 
         diagonal2 (0, 2) 
diagonal1 (1, 1) 
         diagonal2 (1, 1) 
         diagonal2 (2, 0) 
diagonal1 (2, 2) 

Cuối cùng biết loại hoặc kết quả bạn muốn đạt được sẽ xác định loại mối quan hệ/cấu trúc có điều kiện nào.

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