2015-12-16 12 views
5

Tôi biết bằng các ngôn ngữ như C, C++, Java và C#, (C# example) tuyên bố else if là cú pháp đường, trong đó nó thực sự chỉ là một tuyên bố else theo sau là tuyên bố if.Con trăn "elif" được biên dịch khác với người khác: nếu?

else if (conition(s)) { ... 

bằng

else { 
    if (condition(s)) { ... 
} 

Tuy nhiên, trong python, có một elif tuyên bố đặc biệt. Tôi đã tự hỏi nếu điều này chỉ là viết tắt cho các nhà phát triển hoặc nếu có một số python tối ưu hóa ẩn có thể làm vì điều này, chẳng hạn như được giải thích nhanh hơn? Nhưng điều này sẽ không có ý nghĩa với tôi, vì các ngôn ngữ khác cũng sẽ làm như vậy (chẳng hạn như JavaScript). Vì vậy, câu hỏi của tôi là, trong python là tuyên bố elif chỉ viết tắt cho các nhà phát triển để sử dụng hoặc là có cái gì đó ẩn mà nó đạt được thông qua làm như vậy?

+4

'khác if' không còn đường cú pháp (ít nhất là trong C++). Đó là cú pháp trần thực sự, không phải đường tráng. Nó chỉ là một chút sai lầm vì cách chúng ta chọn để viết nó. – chris

Trả lời

11

Khi bạn thực sự muốn biết những gì đang xảy ra đằng sau hậu trường trong trình thông dịch, bạn có thể sử dụng mô-đun dis. Trong trường hợp này:

>>> def f1(): 
... if a: 
...  b = 1 
... elif aa: 
...  b = 2 
... 
>>> def f2(): 
... if a: 
...  b = 1 
... else: 
...  if aa: 
...  b = 2 
... 
>>> dis.dis(f1) 
    2   0 LOAD_GLOBAL    0 (a) 
       3 POP_JUMP_IF_FALSE  15 

    3   6 LOAD_CONST    1 (1) 
       9 STORE_FAST    0 (b) 
      12 JUMP_FORWARD   15 (to 30) 

    4  >> 15 LOAD_GLOBAL    1 (aa) 
      18 POP_JUMP_IF_FALSE  30 

    5   21 LOAD_CONST    2 (2) 
      24 STORE_FAST    0 (b) 
      27 JUMP_FORWARD    0 (to 30) 
     >> 30 LOAD_CONST    0 (None) 
      33 RETURN_VALUE   
>>> dis.dis(f2) 
    2   0 LOAD_GLOBAL    0 (a) 
       3 POP_JUMP_IF_FALSE  15 

    3   6 LOAD_CONST    1 (1) 
       9 STORE_FAST    0 (b) 
      12 JUMP_FORWARD   15 (to 30) 

    5  >> 15 LOAD_GLOBAL    1 (aa) 
      18 POP_JUMP_IF_FALSE  30 

    6   21 LOAD_CONST    2 (2) 
      24 STORE_FAST    0 (b) 
      27 JUMP_FORWARD    0 (to 30) 
     >> 30 LOAD_CONST    0 (None) 
      33 RETURN_VALUE   

Có vẻ như hai hàm của chúng tôi đang sử dụng cùng một mã byte - Vì vậy, dường như chúng tương đương nhau.

Cẩn thận, bytecode là một chi tiết thực hiện của CPython - Không nói rằng tất cả triển khai python làm điều tương tự đằng sau hậu trường - Tất cả những vấn đề là chúng có cùng hành vi. Làm việc thông qua logic, bạn có thể thuyết phục bản thân rằng f1f2 nên làm điều tương tự bất kể việc triển khai cơ bản coi đó là "đường cú pháp" hay nếu có điều gì đó phức tạp hơn xảy ra.

+0

Tôi chưa từng gặp mô-đun 'dis' trước đây, cảm ơn vì đã chỉ ra nó, tôi sẽ đọc thêm về nó. Nó có thể hữu ích nếu tôi từng viết một kịch bản cần mọi hiệu suất mà nó có thể nhận được hoặc tôi tò mò về một cái gì đó như thế này một lần nữa. – hargasinski

+0

@Zequ - Vâng, nó thực sự tốt cho sự hiểu biết những gì các thông dịch viên đang làm. Tôi đã không bao giờ sử dụng nó trong một kịch bản - Chỉ cho các vấn đề đồ chơi để tìm ra cách Python hoạt động.Một mô-đun hữu ích khác cho hiệu suất là 'timeit' - Không có gì chậm cho đến khi bạn thực sự đo nó ;-). – mgilson

+0

Vâng, tôi đã có điều đó xảy ra, nơi nút cổ chai của chương trình hóa ra là một phần hoàn toàn khác với phần bạn đang tối ưu hóa. 'timeit' sẽ hữu ích: D – hargasinski

1

elif bằng Python là đường cú pháp cho else if được hiển thị bằng nhiều ngôn ngữ khác. Đó là tất cả.

+0

Cảm ơn bạn, tôi chỉ muốn xác nhận rằng dự đoán của tôi là đúng – hargasinski

3

Từ khóa 'elif' viết tắt là ‘else if’ và hữu ích để tránh thụt lề quá mức. Source

+0

Tôi lướt qua trang đó, không nhận thấy thông báo về 'elif'. Cảm ơn bạn đã chỉ ra! – hargasinski

1

Ba đoạn mã sau đây sẽ thực thi bằng cùng một logic nhưng tất cả đều sử dụng cú pháp khác nhau.

elif condition: ... 
else if conition { ... 
else { 
    if conition { ... 
} 

Python của elif chỉ là cú pháp đường cho phổ biến else if tuyên bố

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