Cú pháp đúng cho 'other if' là gì?


284

Tôi là một lập trình viên Python mới đang thực hiện bước nhảy vọt từ 2.6.4 đến 3.1.1. Mọi thứ đều ổn cho đến khi tôi cố gắng sử dụng câu lệnh 'other if'. Trình thông dịch cung cấp cho tôi một lỗi cú pháp sau 'if' in 'if if' vì một lý do mà tôi dường như không thể tìm ra.

def function(a):
    if a == '1':
        print ('1a')
    else if a == '2'
        print ('2a')
    else print ('3a')

function(input('input:'))

Có lẽ tôi đang thiếu một cái gì đó rất đơn giản; tuy nhiên, tôi không thể tự mình tìm câu trả lời.


3
Tôi không nghĩ rằng điều này hoạt động trong 2.6.4.
wRAR

Thật vậy, yếu tố cú pháp và ngữ nghĩa Python này không thay đổi giữa các phiên bản này. Có thể không bao giờ cả.
Mike Graham

Bạn có thể bắt đầu với một hướng dẫn tốt về if / other
Triton Man

Câu trả lời:


444

Trong python "other if" được đánh vần là "elif".
Ngoài ra, bạn cần một dấu hai chấm sau elifelse.

Câu trả lời đơn giản cho một câu hỏi đơn giản. Tôi đã có cùng một vấn đề, khi tôi mới bắt đầu (trong vài tuần qua).

Vì vậy, mã của bạn nên đọc:

def function(a):
    if a == '1':
        print('1a')
    elif a == '2':
        print('2a')
    else:
        print('3a')

function(input('input:'))

11
không phải lo lắng, đôi khi chúng ta phải học. Tôi thấy thật kỳ lạ khi con trăn đặt một el elise như vậy vào khả năng đọc và sau đó đi và sử dụng elkif thay vì nó. Tôi khuyên bạn nên luôn luôn mở hướng dẫn sử dụng API python: docs.python.org/3.1 các liên kết quan trọng là Hướng dẫn: docs.python.org/3.1/tutorial/index.html Tham chiếu ngôn ngữ: docs.python.org/3.1/reference /index.html Thư viện giới thiệu: docs.python.org/3.1/l
Lyndon White

1
Perl sử dụng cùng một từ khóa, và lý do căn bản của nó là để ngăn ngừa tai nạn khi bạn quên hoàn thành việc viết một câu lệnh khác trước đó và bạn bắt đầu viết một câu lệnh if khác. Rõ ràng đó là một vấn đề phổ biến trong khi viết mã C.
Nate Glenn

1
@NateGlenn Perl thực sự sử dụng elsif, tôi đoán Python phải là một nhân vật hiệu quả hơn. "Elif" dường như có nguồn gốc từ bộ tiền xử lý C, được sử dụng #eliftừ lâu trước Python AFAICT. Rõ ràng, trong bối cảnh đó, có một lệnh một mã thông báo là có giá trị, vì phân tích cú pháp #else if <code>so với #else <code that could theoretically even be an if statement>sẽ làm phức tạp một cú pháp được dự định là đơn giản.
FeRD


13
def function(a):
    if a == '1':
        print ('1a')
    elif a == '2':
        print ('2a')
    else:
        print ('3a')

10

kể từ thời xa xưa, cú pháp chính xác cho if/else ifPython là elif. Nhân tiện, bạn có thể sử dụng từ điển nếu bạn có rất nhiều if/else.eg

d={"1":"1a","2":"2a"}
if not a in d: print("3a")
else: print (d[a])

Đối với msw, ví dụ về thực thi chức năng bằng từ điển.

def print_one(arg=None):
    print "one"

def print_two(num):
    print "two %s" % num

execfunctions = { 1 : (print_one, ['**arg'] ) , 2 : (print_two , ['**arg'] )}
try:
    execfunctions[1][0]()
except KeyError,e:
    print "Invalid option: ",e

try:
    execfunctions[2][0]("test")
except KeyError,e:
    print "Invalid option: ",e
else:
    sys.exit()

1
Bạn có thể, nhưng xin đừng làm điều này. Một từ điển không phải là một thay thế tốt cho một elif.
S.Lott

@ s.lott, trường hợp của OP rất đơn giản. Nếu anh ta phải kiểm tra nhiều giá trị của a, một từ điển gọn gàng hơn. bạn có thể tạo thói quen không sử dụng nó, nhưng tôi đã sử dụng nó và tôi thích cách tiếp cận này tốt hơn so với mã hóa nhiều nếu / khác. chết tiệt, tôi thậm chí sử dụng từ điển để thực hiện các chức năng.
ghostdog74

1
@ghostdog: Tôi biết rằng bạn có thể sử dụng từ điển để thực thi các chức năng nhưng ý tưởng làm tôi sợ như gotos tính toán hoặc dán các chuỗi Tcl với nhau và execing chúng. Đây có phải là thực hành tốt? Bạn có thể kể tên một ví dụ?
msw

@msw: Đó là một thực hành rất tốt. Ví dụ: bạn đang đọc một luồng XML không phải cho một số bài tập cạo đơn giản mà là một nơi bạn cần thực hiện xử lý khác nhau cho các thẻ phần tử khác nhau, ví dụ: tệp bảng tính Excel 2007 là một tệp zip của nhiều tài liệu XML, một số rất phức tạp. Bạn có một phương pháp riêng cho mỗi thẻ. Bạn gửi qua một từ điển. Không có gì để sợ hãi. Nếu phương thức xử lý <foo>do_foo, bạn thậm chí có thể xây dựng dict khi đang chạy ứng dụng.
John Machin

1
Lưu ý rằng từ điển có một .getphương thức cho phép bạn chỉ định một giá trị mặc định. Ví dụ đầu tiên của bạn có thể được viết dưới dạngprint d.get(a, "3a")
codeape

4

Đây là một chút tái cấu trúc chức năng của bạn (nó không sử dụng "other" hoặc "elif"):

def function(a):
    if a not in (1, 2):
        a = 3
    print(str(a) + "a")

@ ghostdog74: Python 3 yêu cầu dấu ngoặc đơn để "in".


python 3 đã thay thế câu lệnh in của python 2 bằng một hàm do đó là dấu ngoặc đơn bắt buộc và nếu bạn muốn sử dụng sys.stdout.write
Dan D.

2
nên là ('1', '2'), op đang sử dụng chuỗi
Priestc

2
def function(a):
    if a == '1':
        print ('1a')
    else if a == '2'
        print ('2a')
    else print ('3a')

Nên sửa thành:

def function(a):
    if a == '1':
        print('1a')
    elif a == '2':
        print('2a')
    else:
        print('3a')

Như bạn có thể thấy, nếu khác nên được đổi thành elif, thì nên có dấu hai chấm sau '2' và khác, nên có một dòng mới sau câu lệnh khác và đóng khoảng trắng giữa dấu in và dấu ngoặc đơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.