2015-12-16 10 views
5

Wiem, że w językach takich jak C, C++, Java i C#, (C# example) instrukcja else if jest syntaktycznym cukrem, ponieważ jest to naprawdę tylko jedna instrukcja else, po której następuje instrukcja if.Czy python "elif" jest inaczej kompilowany z innego: if?

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

jest równa

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

Jednak w python, istnieje specjalna elif stwierdzenie. Zastanawiam się, czy jest to skrótowa informacja dla programistów, czy też istnieje jakiś ukryty optymalizator, który może z tego powodu robić python, na przykład interpretowany szybciej? Ale nie miałoby to dla mnie sensu, ponieważ inne języki też by to robiły (np. JavaScript). Tak, moje pytanie brzmi, czy w pythonie jest tylko skrót oświadczenia dla programistów do wykorzystania, czy jest coś ukrytego, co zyskuje w ten sposób?

+4

'inny if' nie jest jeszcze cukier syntaktyczny (przynajmniej w C++). Jest to rzeczywista składnia, nie pokryta cukrem. To po prostu trochę mylące ze względu na sposób, w jaki zdecydowaliśmy się go napisać. – chris

Odpowiedz

11

Jeśli naprawdę chcesz wiedzieć, co dzieje się za kulisami w tłumaczu, możesz użyć modułu dis. W tym przypadku:

>>> 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   

Wygląda na to, że nasze dwie funkcje używają tego samego kodu bajtowego - więc podobno są one równoważne.

Ostrożnie, kod bajtowy jest szczegółem implementacji CPython - nie ma żadnej wiedzy, że implementacje Pythona robią to samo za kulisami - Ważne jest tylko to, że mają to samo zachowanie. Działając zgodnie z logiką, możesz przekonać się, że f1 i f2 powinny robić to samo, niezależnie od tego, czy podstawowa implementacja traktuje je jako "cukier syntetyczny", czy też dzieje się coś bardziej wyrafinowanego.

+0

Nie spotkałem się wcześniej z modułem 'dis', dziękuję, że go wskazałem, przeczytam o nim więcej. Może to być przydatne, jeśli kiedykolwiek piszę scenariusz, który potrzebuje każdego zwiększenia wydajności, które może uzyskać lub jestem ciekawy czegoś takiego jak to. – hargasinski

+0

@Zequ - Tak, naprawdę dobrze jest zrozumieć, co robi tłumacz. Nigdy go nie użyłem w scenariuszu - tylko w przypadku problemów z zabawkami, aby dowiedzieć się, jak działa Python.Kolejnym przydatnym modułem dla wydajności jest 'timeit' - nic nie jest wolne dopóki nie zmierzysz ;-). – mgilson

+0

Tak, miałem to już miejsce, gdzie wąskie gardło programu okazało się zupełnie inną częścią niż ta, którą optymalizowaliście. 'timeit' będzie użyteczny: D – hargasinski

1

elif w języku Python to cukier syntaktyczny dla else if widoczny w wielu innych językach. To wszystko.

+0

Dziękuję, chciałem tylko potwierdzić, że moje przypuszczenie było słuszne – hargasinski

3

Słowo kluczowe "elif" jest skrótem od "else if" i jest użyteczne, aby uniknąć nadmiernego wcięcia. Source

+0

Przeszedłem przez tę stronę, nie zauważyłem oświadczenia o "elif". Dziękuję, wskazując to! – hargasinski

1

Trzy następujące fragmenty kodu byłyby wykonane przy użyciu tej samej logiki, ale wszystkie używają innej składni.

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

Pythona elif jest po prostu cukier syntaktyczny dla wspólnego else if rachunku

Powiązane problemy