#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. Верно. Я показывал ошибочный код, к которому требуется добавить инициализацию.