Нужно ли определение этих переменных? - PullRequest
1 голос
/ 10 января 2020

Я не писал этот код, он был предоставлен как часть курсовой работы.

Я заканчиваю работу по подготовке Flatiron и нахожу это интересным.

first_name = ""
last_name = ""
for key, value in example_dictionary.items():
    if key == "last_name":
        last_name = value.title()
    if key == "first_name":
        first_name = value
print(first_name, last_name)

Затем я решил попробовать это без первоначального first_name = "" last_name = ""

, такого, что

for key, value in example_dictionary.items():
    if key == "last_name":
        last_name = value.title()
    if key == "first_name":
        first_name = value
print(first_name, last_name) 

, и, похоже, все еще работает. Могу ли я получить объяснение, почему они определили first_name и last_name как таковые, если это, по-видимому, не нужно?

Ответы [ 3 ]

3 голосов
/ 10 января 2020

По умолчанию используются начальные значения, если в словаре нет соответствующих ключей. Это очень распространенная ошибка программирования - условно назначить переменную и забыть обработать ситуацию, когда условие никогда не возникает. Инициализация переменных в начале позволяет избежать этой ошибки.

Другой способ записать это будет без l oop.

first_name = example_dictionary.get("first_name", "")
last_name = example_dictionary.get("last_name", "")

Второй аргумент .get() является значением по умолчанию вернуть, если ключ не существует в словаре.

1 голос
/ 10 января 2020

Не зная контекста, мы не можем знать наверняка. Но в целом, если эти переменные не инициализируются до l oop, а также ничего в l oop не инициализирует их, то они, возможно, не будут существовать после l oop, и когда вы попытаетесь использовать их исключение будет повышено. Лучше инициализировать их до невозможных известных состояний до l oop, чтобы следующий код мог лучше интерпретировать значения, которые он находит в них.

Или, если они были инициализированы до этого, они могут содержит остатки от предыдущих операций, которые вам не нужны.

0 голосов
/ 10 января 2020

«Необходимое» здесь может быть неправильно определено, но если мы говорим в строгом смысле, нет, это не является необходимым, как указано, программа «все еще работает» без начальных строк.

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

Окончательное утверждение вашего кода приведено здесь print(first_name, last_name) пытается оценить имена, то есть идентификаторы, first_name и last_name. Python попытается разрешить эти имена в пределах локальной, а затем глобальной переменной. Если имя не может быть разрешено, выполнение оператора остановится, и будет увеличено значение NameError. Ошибка имени - это просто исключение, и она может обрабатываться обычным способом (хотя перехват NameError s немного необычен).

Так что следствие удаления этих начальных назначений переменных Исходя из вашего кода,

  1. first_name и last_name больше не имеют «значения по умолчанию», хотя ответ Бармара дает альтернативный способ сохранить это.
  2. В случае, если first_name и last_name не найдены в качестве ключей в example_dictionary, вместо изящного продолжения со значениями по умолчанию, ваш код повысит NameError. Это может на самом деле быть предпочтительным в некоторых случаях, в конце концов, исключения предназначены для того, чтобы сообщить нам, когда что-то исключительное произошло. Предположим, что вашему коду действительно нужно присвоить значимые значения last_name и first_name, прежде чем продолжить. Лучше всего вызвать исключение и остановить выполнение здесь, а не продолжать с бессмысленными данными.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...