2015-12-16 16 views
5

Conosco in linguaggi come C, C++, Java e C#, (C# example) l'istruzione else if è zucchero sintattico, in quanto è davvero solo una dichiarazione else seguita da un'istruzione if.Il python "elif" è compilato in modo diverso da altro: if?

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

è uguale a

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

Tuttavia, in pitone, c'è uno speciale elif dichiarazione. Mi sono chiesto se questo è solo una scorciatoia per gli sviluppatori o se c'è qualche ottimizzazione nascosta che python può fare per questo, come essere interpretato più velocemente? Ma questo non avrebbe senso per me, come lo farebbero anche altre lingue (come JavaScript). Quindi, la mia domanda è, in python è la dichiarazione elif solo una scorciatoia per gli sviluppatori da utilizzare o c'è qualcosa di nascosto che guadagna attraverso farlo?

+4

'altro if' non è nemmeno zucchero sintattico (almeno in C++). È l'effettiva sintassi nuda, non rivestita di zucchero. È solo un po 'fuorviante per il modo in cui scegliamo di scriverlo. – chris

risposta

11

Quando si vuole veramente sapere cosa sta succedendo dietro le quinte nell'interprete, è possibile utilizzare il modulo dis. In questo caso:

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

Sembra che i nostri due funzioni utilizzano lo stesso bytecode - Quindi a quanto pare sono equivalenti.

Attenzione però, bytecode è un dettaglio di implementazione di CPython - Non si può dire che tutti i implementazioni pitone fare la stessa cosa dietro le quinte - Tutto ciò che conta è che hanno lo stesso comportamento. Lavorando attraverso la logica, è possibile convincersi che f1 e f2 dovrebbero fare la stessa cosa indipendentemente dal fatto che l'implementazione sottostante lo tratti come "zucchero sintetico" o se c'è qualcosa di più sofisticato in corso.

+0

Non ho ancora incontrato il modulo 'dis', grazie per averlo indicato, ne leggerò di più. Potrebbe essere utile se scriverò mai uno script che ha bisogno di ogni incremento di prestazioni che può ottenere o sono curioso di qualcosa del genere. – hargasinski

+0

@Zequ - Sì, è davvero buono per capire cosa sta facendo l'interprete. Non l'ho mai usato in una sceneggiatura - Solo per problemi di giocattoli per capire come funziona Python.Un altro utile modulo per le prestazioni è "timeit": niente è lento fino a quando non lo si misura effettivamente ;-). – mgilson

+0

Sì, è successo così, dove il collo di bottiglia del programma risulta essere completamente diverso da quello che stavi ottimizzando. 'timeit' sarà utile: D – hargasinski

1

elif in Python è zucchero sintattico per else if visto in molte altre lingue. È tutto.

+0

Grazie, volevo solo confermare che la mia ipotesi era giusta – hargasinski

3

La parola chiave "elif" è l'abbreviazione di "else if" ed è utile per evitare l'indentazione eccessiva. Source

+0

Ho sfogliato quella pagina, non ho notato la frase sull'elif. Grazie sottolineando! – hargasinski

1

I tre frammenti di codice seguenti verrebbero tutti eseguiti utilizzando la stessa logica, tuttavia tutti utilizzano una sintassi diversa.

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

di Python elif è solo zucchero sintattico per il comune else if dichiarazione