Какова наилучшая практика создания экземпляра переменной для использования вне цикла, если вы назначаете ее только внутри цикла?

#python #loops #scope

Вопрос:

Я часто оказываюсь в ситуациях, когда я хочу назначить переменную на основе результата некоторого сравнения или другой логики. Я немного погуглил и знаю, что МОГУ назначить None переменную, а затем назначить ее позже, но я просто хочу знать, действительно ли это лучший способ.

Вот пример того, что я имею в виду:

 def function(v1, v2):
    least = None
    if v2 < v1:
        least = v2
    else:
        least = v1
 

Что-то в моем уме подсказывает мне, что должен быть лучший способ, но я определенно не назвал бы себя экспертом по питону.

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

1. Вам не нужно этого делать, если вы назначаете переменную в обоих if и else . Но если есть некоторые ветви, которые могут не назначить его, самое простое решение-сначала назначить значение по умолчанию.

Ответ №1:

Я бы не стал писать первое задание, так как оно немедленно перезаписывается, и код гарантированно займет одну из двух ветвей.

 def function(v1, v2):
    if v2 < v1:
        least = v2
    else:
        least = v1
 

Вы можете сократить его до одной строчки, если хотите.

 def function(v1, v2):
    least = v2 if v2 < v1 else v1
 

Это дело вкуса, лучше это или хуже предыдущей версии. Мне это нравится, но по мере усложнения логики оно быстро становится нечитаемым.

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

1. Спасибо, я был очень плотным и по какой-то причине объединял If/Else с реальным циклом, поэтому я подумал, что у меня возникнет проблема с областью действия, если я объявлю внутри If/Else!

Ответ №2:

В вашем примере нет необходимости назначать его первым, потому что все ветви условия назначают его.

Сначала необходимо назначить значение по умолчанию, если могут существовать пути кода, которые не назначают переменную. Обычная ситуация, когда вы назначаете переменную в цикле; если цикл выполняется ноль раз, вы не будете устанавливать переменную.

 def function(lst):
    result = None
    for item in lst:
        if somefunc(item):
            result = item
    return result
 

Если вы не инициализируете result перед циклом, вы получите сообщение об ошибке, если список пуст или ни один из элементов не удовлетворяет somefunc() условию.

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

1. И поэтому в этом примере я ДОЛЖЕН сказать result = None или какое-то другое значение по умолчанию, верно?

2. Верно. Я показывал ошибочный код, к которому требуется добавить инициализацию.