Может ли PyCharm ругаться просто так?
Надо было решить задачу с таким условием:
Напишите программу, которая находит общий доход, затем выводит фрукт с минимальным доходом и удаляет его из словаря. Выведите итоговый словарь на экран. Результат работы программы: Общий доход за год составил 35419.34 рублей Самый маленький доход у grapefruit. Он составляет 300.4 рублей Итоговый словарь: {'apple': 5600.2, 'orange': 3500.45, 'banana': 5000.0, 'bergamot': 3700.56, 'durian': 5987.23, 'peach': 10000.5, 'pear': 1020.0, 'persimmon': 310.0}
Получился такой код:
incomes = {
'apple': 5600.20,
'orange': 3500.45,
'banana': 5000.00,
'bergamot': 3700.56,
'durian': 5987.23,
'grapefruit': 300.40,
'peach': 10000.50,
'pear': 1020.00,
'persimmon': 310.00,
}
print('Общий доход за год составил', sum(incomes.values()), 'рублей')
for key in incomes:
if incomes[key] == min(incomes.values()):
worst_product = key
print('Самый маленький доход у {0}. '
'Он составляет {1} рублей'.format(worst_product, min(incomes.values())))
incomes.pop(worst_product)
print('Итоговый словарь:', incomes)
Но PyCharm почему-то подчеркивает worst_product в строке:
'Он составляет {1} рублей'.format(worst_product, min(incomes.values())))
Name 'worst_product' can be undefined
При этом, все работает
В чем причина?
Ответы (1 шт):
Суть ошибки в том, что если словарь incomes окажется пуст - в переменную worst_product не будет присвоено значение. Возможно, это и не ошибка вовсе, но PyCharm-то не знает что должно произойти в этом случае.
Это предупреждение можно подавить через явную инициализацию worst_product перед циклом (что является общим способом для любых языков программирования):
worst_product = None
for key in incomes:
if incomes[key] == min(incomes.values()):
worst_product = key
Или же можно воспользоваться else-блоком к циклу (так можно делать только в Питоне):
for key in incomes:
if incomes[key] == min(incomes.values()):
worst_product = key
break
else:
worst_product = None
В любом случае, случай пустого словаря надо в дальнейшем правильно обработать. Или не нужно, если он невозможен, а задача лишь в подавлении предупреждения.
PS у вас цикл квадратный на пустом месте, не надо так делать. Почитайте про алгоритм поиска минимального элемента.