2012-06-11 5 views
8

myślałem, że Elif: była skrótemdla - inny vs dla Elif

else: 
    if: 

ale to nie jest możliwe użycie

dla - Elif:

tylko

za - else: if:

w tym kodzie:

for line in source: 
    change_next = False 
    for dataset,artnr,revision in datasets: 
     if dataset in line: 
      change_next = True 
      print " ** " + dataset + " found" 
      datasets.remove((dataset,artnr,revision)) 
      break 
    else: 
     if line.startswith("DstID:"): 
      print line.replace("DstID:","").rstrip() 

    if change_next and "Partno:" in line: 
     destination.write("Partno: " + artnr + "\n") 
     print "Partno: " + artnr 
    elif change_next and "Revno:" in line: 
     destination.write("Revno:" + revision + "\n") 
     print "Revno:" + revision 
    else: 
     destination.write(line) 

Dzięki za odpowiedź do tej pory, moje pytanie brzmi raczej: czy to jest sposób na zrobienie tego? jeśli linia nie zawiera żadnych (znanych) zestawów danych, to czy chcę ją wydrukować, jeśli jest to zbiór danych?

+3

Programowałem Pythona przez około 7 lat i nigdy nie wiedziałem o klauzuli "else" w oświadczeniu "for" ... –

+3

@AndrewJaffe: To zrozumiałe. To nie jest szczególnie przydatne. Myślę, że było ich tylko garść razy, kiedy go użyłem. –

+0

@JoelCornett Używam go przez cały czas. – becko

Odpowiedz

11

elif: nie jest makrem, który rozwija się do else: if, jest to element syntaktyczny, który jest ważny tylko w kontekście if: statement. Zazwyczaj, else: if otworzyłby nowy blok if; jednak, elif: tego nie robi.

+2

Co jest szczęściem, ponieważ w przeciwnym razie nie moglibyśmy mieć wielu klauzul 'elif' w jednym wyrażeniu' if', które byłoby okropne! (... Przypuszczam, że dopóki kolejne nie zostaną rozszerzone na * coraz bardziej wcięte * 'else: if 'bloki, co byłoby po prostu dziwne ... Wow, muszę teraz wybielid mój mózg.) – weronika

+1

Ale sensownym byłoby mieć' elif' po "for", prawda? Dla mnie fakt, że możemy zrobić "dla ... innego", ale nie dla "elf ... elif ........... else" wydaje się niekonsekwentny. – becko

+0

Jak ma sens mieć 'elif' po' for'? 'Else' po pętli nie robi tego samego, co robi z' if' (i to jest mylące). – kindall

8

Prawidłowo. To samo dotyczy else w try .. except .. else.

9

Urządzenie forelse jest szczególnym przypadkiem użycia, a nie takim samym, jak struktura ifelif. elif tak naprawdę nie ma sensu w kontekście for w każdym razie, ponieważ znaczenie forelse brzmi "jeśli zakończyliśmy pętlę bez zerwania, zróbcie to". To jest logika binarna. elif nie ma sensu w kontekście tej binarnej decyzji.

+0

Istnieje również 'while'' else', ale jest używany nawet rzadziej niż 'dla'' else'. – MRAB

+0

@MRAB 'elif' nie ma sensu kontekstowego również w' while' 'else'. Lub w 'try'' except' 'else' o to chodzi. Chodzi o to, że 'elif' nie istnieje w tych kontekstach, ponieważ nie ma dla niego logicznego sensu. –

+0

Dla mnie 'elif' ma sens w kontekście' for ... elif ... else'. Pomyśl o tym jako o odpowiedniku 'dla ... else, jeśli ... else'. Co nie ma w tym sensu? Wiem, że składnia Pythona na to nie pozwala. Mówię, że * semantycznie * to * może * mieć sens. – becko

4

"Inna", której dotyczy, jest powiązana z poleceniem "for", a nie z poleceniem "if". "elif" ma sens tylko wtedy, gdy jest używane z poleceniem "jeśli".

Za pomocą polecenia "for" blok "else" jest wykonywany tylko wtedy, gdy blok "for" nie został przedwcześnie zakończony komendą "break", patrz paragraph 4.4.