Я новичок в программировании, и с самого начала этого семестра только что наткнулся на свою первую скорость. Мы работаем в python, и наше последнее задание позволяет нам изменить предыдущую программу на использование функций. Я понимаю, как их использовать, а что нет, но некоторые мелкие вещи с локальными переменными, я думаю, что мне не хватает концептуального понимания.
Я использую pycharm для записи своих назначений, и вижу, что одна из моих переменных не используется, и я не понимаю, почему и как ее исправить. Я тренировался пару часов и потерялся.
# Function "checkName" takes in 2 parameters
# The first is name, which will be given by user input
# The second is nameList, which comes from the function getNamesList
def checkName(name, nameList):
for i in range(0, len(nameList)):
if name == nameList[i]:
rank = i + 1
break
else:
rank = 0 ## This rank is undefined ##
return rank
Любые указания на то, что я делаю неправильно? Также будет оценено объяснение различий между определением локальных и глобальных переменных!
Вы получаете сообщение об ошибке "Локальная переменная" значение ранга не используется "в строке rank = я + 1
потому что оператор break
на следующей строке приводит к завершению функции, не считывая значения из rank
. Это относится только к случаю, потому что ваш оператор return
слишком удален. Переместите его на один уровень отступов, чтобы он не возвращался до тех пор, пока цикл не будет выполнен, и предупреждение не исчезнет.
def checkName(name, nameList):
for i in range(0, len(nameList)):
if name == nameList[i]:
rank = i + 1
break
else:
rank = 0 ## This rank is undefined ##
return rank
С точки зрения написанного кода ранг определяется, но не используется - вы устанавливаете его и ломаете, поэтому похоже, что с ним ничего не делается. Еще раз, это то, что другие другие упомянули.
Большое вам спасибо за быстрые и полезные ответы! Мой отступ был упущен, глупая ошибка. Честно говоря, я не знаю, как я это забыл много раз.
Я также ценю различие локальных переменных. Я думаю, что мое предыдущее понимание было в порядке, но пикарм-нота, которую я получал, бросила меня за цикл.
Вероятно, самым коротким может быть:
nameList = ["a", "b", "c"]
def checkName(name, nameList):
return(nameList.index(name) + 1 if name in nameList else 0)
for i in ["a", "b", "c", "d"]:
print(checkName(i, nameList))
Результат:
1
2
3
0
Читая свой код, я понимаю, что эти функции возвращают ранг или индекс name
в данном list
names
. У вас есть неправильный отступ в инструкции return
.
Поэтому, чтобы улучшить код, проверьте следующее:
def checkName(name, nameList):
for i in range(nameList):
if name == nameList[i]:
return i + 1
# you don't need an else here, just return -1 or 0 or None ( by default )
# whenever 'name' doesn't exists on the nameList
# not very pythonic
return 0
Ваш код не всегда использовал rank
локальной переменной из-за неправильного отступа.
Я могу сказать вам, что если вы нажмете на свой "разрыв", вы ничего не будете возвращать, потому что у вас неправильный отпечаток. Вам нужно взять один отступ из вашего возвращения.
Я также могу рассказать вам немного о глобальных и локальных переменных в простых терминах: Любая переменная, которую вы определяете внутри своей функции, например "ранг", не будет сохраняться вне функции. Если вы запустите выше, а затем попробуйте вызвать "ранг" вне вашей функции, вы будете вызывать пустую переменную (если только вы не указали другую "ранг"). Это позволяет использовать ранг внутри функции, не опасаясь конфликта с переменными вне функции. В общем, вы хотите избежать каких-либо действительно "глобальных" переменных, но переменная, названная вне функции, более глобальна, чем одна из них внутри.
Что касается того, что указывает pyCharm, я не уверен, потому что я не использую программу. Вы называете свою функцию в любом месте? Это может дать вам понять, что вы определяете свою функцию, а затем не называете ее.
return
, так как он всегда будет вызываться на первой итерации цикла for, за исключением того факта, что первое условие в операторе if
сработало. Затем вы инициируете оператор break
, который полностью отделится от цикла for, а оператор return
никогда не будет достигнут.
return
зарезано слишком далеко. Поддержите это на один уровень.