for - else vs for elif

myślałem, że elif: to skrót od

else:
     if:

ale nie można go użyć

za - elif:

tylko

for - else: jeśli:

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ękuję za dotychczasową odpowiedź, teraz moje pytanie brzmi raczej: czy tak to zrobić? jeśli wiersz nie zawiera żadnych (ze znanych) zestawów danych, to chcę go wydrukować, jeśli jest to zestaw danych?


person Viktor Mellgren    schedule 11.06.2012    source źródło
comment
Programuję Pythona od około 7 lat i nigdy nie wiedziałem o klauzuli else w wyrażeniu for...   -  person Andrew Jaffe    schedule 11.06.2012
comment
@AndrewJaffe: To zrozumiałe. Nie jest to szczególnie przydatne. Myślę, że używałem go tylko kilka razy.   -  person Joel Cornett    schedule 11.06.2012
comment
@JoelCornett Używam go cały czas.   -  person becko    schedule 27.09.2017


Odpowiedzi (4)


elif: nie jest makrem, które rozwija się do else: if, jest to element składniowy, który jest prawidłowy tylko w kontekście if: oświadczenie. Zwykle else: if otworzy nowy blok if; jednak elif: tego nie robi.

person kindall    schedule 11.06.2012
comment
Co jest szczęściem, ponieważ w przeciwnym razie nie moglibyśmy mieć wielu klauzul elif w jednej instrukcji if, co byłoby okropne! (...przypuszczam, że chyba że kolejne rozszerzyły się do coraz bardziej wciętych else: if bloków, co byłoby po prostu dziwne... Wow, muszę teraz wybielić mój mózg.) - person weronika; 11.06.2012
comment
Ale sensowne byłoby umieszczenie elif po for, prawda? Dla mnie fakt, że możemy zrobić for ... else, ale nie for ... elif ... elif ........... else wydaje się niespójny. - person becko; 27.09.2017
comment
Jak miałoby sens mieć elif po for? else po pętli nie robi tego samego, co z if (i to jest mylące). - person kindall; 27.09.2017

for else to przypadek szczególny, a nie to samo co if elif. elif tak naprawdę nie ma sensu w kontekście for, ponieważ znaczenie for else to „jeśli zakończyliśmy pętlę bez przerywania, zrób to”. To logika binarna. elif nie ma sensu w kontekście tej binarnej decyzji.

person Silas Ray    schedule 11.06.2012
comment
Jest też while else, ale jest używany nawet rzadziej niż for else. - person MRAB; 11.06.2012
comment
@MRAB elif również nie ma sensu kontekstowego w while else. Lub też w try except else. Chodzi o to, że elif nie istnieje w tych kontekstach, ponieważ nie ma dla niego logicznego sensu. - person Silas Ray; 11.06.2012
comment
Dla mnie elif ma sens w kontekście for ... elif ... else. Pomyśl o tym jak o for ... else if ... 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. - person becko; 27.09.2017

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

person ecatmur    schedule 11.06.2012

„Inne”, do którego się odwołujesz, jest powiązane z poleceniem „for”, a nie z poleceniem „if”. „elif” ma sens tylko w połączeniu z poleceniem „if”.

W przypadku polecenia „for” blok „else” jest wykonywany tylko wtedy, gdy blok „for” nie został przedwcześnie zakończony poleceniem „break”, patrz paragraf 4.4.

person uselpa    schedule 11.06.2012