for-else vs for elif

я думал, что elif: это сокращение от

else:
     if:

но невозможно использовать

для - элиф:

Только

для - иначе: если:

в этом коде:

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)

Спасибо за ответ до сих пор, мой вопрос сейчас скорее: это способ сделать это? если в строке нет (из известных) наборов данных, то я хочу напечатать ее, если это набор данных?


person Viktor Mellgren    schedule 11.06.2012    source источник
comment
Я программирую на Python около 7 лет и никогда не знал о предложении else в выражении for...   -  person Andrew Jaffe    schedule 11.06.2012
comment
@AndrewJaffe: Это понятно. Это не особенно полезно. Я думаю, что было всего несколько раз, когда я использовал его.   -  person Joel Cornett    schedule 11.06.2012
comment
@JoelCornett Я использую его все время.   -  person becko    schedule 27.09.2017


Ответы (4)


elif: — это не макрос, который расширяется до else: if, это синтаксический элемент, допустимый только в контексте if: заявление. Обычно else: if открывает новый блок if; однако elif: этого не делает.

person kindall    schedule 11.06.2012
comment
К счастью, иначе у нас не было бы нескольких предложений elif в одном выражении if, а это было бы ужасно! (... Я полагаю, если последующие не будут расширены до блоков с возрастающим отступом else: if, что было бы просто странно... Вау, теперь мне нужно отбелить свой мозг.) - person weronika; 11.06.2012
comment
Но было бы разумно поставить elif после for, верно? Мне кажется непоследовательным тот факт, что мы можем сделать for ... else, но не for ... elif ... elif ........... else. - person becko; 27.09.2017
comment
Какой смысл иметь elif после for? else после цикла не делает того же, что и if (и это сбивает с толку). - person kindall; 27.09.2017

for else используется в особом случае, не то же самое, что if elif. elif в любом случае не имеет смысла в контексте for, поскольку значение for else таково: «если мы завершили цикл без прерывания, сделайте это». Это бинарная логика. elif не имеет смысла в контексте этого бинарного решения.

person Silas Ray    schedule 11.06.2012
comment
Есть еще while else, но он используется еще реже, чем for else. - person MRAB; 11.06.2012
comment
@MRAB elif также не имеет контекстуального смысла в while else. Или в try except else если уж на то пошло. Дело в том, что elif не существует в этих контекстах, потому что это не имеет логического смысла. - person Silas Ray; 11.06.2012
comment
Для меня elif имеет смысл в контексте for ... elif ... else. Думайте об этом как об эквиваленте for ... else if ... else. Что в этом непонятного? Я знаю, что синтаксис Python не позволяет этого. Я говорю, что семантически это может иметь смысл. - person becko; 27.09.2017

Правильный. То же самое касается else в try .. except .. else.

person ecatmur    schedule 11.06.2012

«Еще», на которое вы ссылаетесь, привязано к команде «для», а не к команде «если». «elif» имеет смысл только при использовании с командой «if».

При использовании команды for блок else выполняется только в том случае, если блок for не был преждевременно завершен командой break, см. параграф 4.4.

person uselpa    schedule 11.06.2012