Почему ‘elif’ обходит ‘if’ в моей функции python

#python #if-statement

#python #if-statement

Вопрос:

Я пытаюсь получить дату истечения срока действия из строки с помощью функции следующим образом

 p = 'Chiet TS Officer ~ aenOriginal Registration Date: 1998-06-17 ective Date: 2018-06-20nnLatest Revision Date: 2018-05-24 Expiry Date: 2021-06-19nPage: 1 of 1nn nn.. making excellence a habit”nx0c'
def enddate(p):    
    for line in p.lower().split('n'):
        if "exp" in line:
            try:
                return(str(dparser.parse(line.split("exp")[-1],fuzzy=True))[0:10])
            except:
                try:
                    return(str(dparser.parse(line),fuzzy=True))[0:10]
                except:
                    return(str(dparser.parse(line.split("20")[-1],fuzzy=True))[0:10])
        elif "20" in line:
            try:
                return(str(dparser.parse(line.split("20")[-1],fuzzy=True))[0:10])
            except:
                return("error")
enddate(p)

'error'
 

вы видите, что elif это обойдено if , если бы я удалил elif часть, она работала бы хорошо

 p = 'Chiet TS Officer ~ aenOriginal Registration Date: 1998-06-17 ective Date: 2018-06-20nnLatest Revision Date: 2018-05-24 Expiry Date: 2021-06-19nPage: 1 of 1nn nn.. making excellence a habit”nx0c'
def enddate(p):    
    for line in p.lower().split('n'):
        if "exp" in line:
            try:
                return(str(dparser.parse(line.split("exp")[-1],fuzzy=True))[0:10])
            except:
                try:
                    return(str(dparser.parse(line),fuzzy=True))[0:10]
                except:
                    return(str(dparser.parse(line.split("20")[-1],fuzzy=True))[0:10])
enddate(p)

'2021-06-19'
 

так почему же это происходит? и как я могу заставить свою функцию искать "20" только в том случае, если все line s не содержат "exp" ?

Комментарии:

1. итак, в чем ваша ошибка??

2. Это elif приведет к тому, что ваша функция вернется из итерации цикла для первых «20» — line . Удаление elif приведет к тому, что ваш цикл достигнет более позднего line с "exp" в нем, и только тогда вернется.

3. @JayPeerachai Я упоминал, что он был?, @schwobaseggl Но что, если я хочу, чтобы моя функция искала "20" только в том случае, если все line s не содержат "exp" ?

Ответ №1:

Просто потому, что «2018» находится на второй строке, а «expiration» — на третьей. Итак, в вашем случае # 2, в первой строке ничего не происходит, во второй строке вы вводите условие elif, и оно возвращает ошибку. В случае # 1 ничего не происходит до третьей строки, а затем вы вводите первое условие if.

Комментарии:

1. Ох. Понял, но я хочу, чтобы моя функция искала "20" только в том случае, если все строки не содержат "exp" , как я могу это сделать?

2. Наивным решением было бы просто сначала выполнить итерацию по всем строкам, ища только «exp», и тогда и только тогда, когда вы не найдете «exp» ни в одной из строк, затем вы можете повторить по всем строкам, которые теперь ищут «20».

3. Вероятно, лучшим решением было бы просто выполнить поиск «exp» в исходной строке (без разделения) и начать цикл по строкам, если вы его не найдете.