print или return?
Начинающие часто путают return и print(), потому что оба, кажется, выдают значение. Но они делают совершенно разное:
print()только показывает значение вам, в выводе. Программа не может работать с тем, что было выведено.returnотдаёт значение программе, которая может сохранить его, вычислять с ним или вывести.
Посмотрите, что происходит, когда функция выводит результат, а не возвращает его:
def print_sum(a, b):
print(a + b)
result = print_sum(2, 3)
print(result)Выведется:
5
None5 вывел print() внутри функции. Но функция ничего не вернула, а функция без return возвращает None — особое значение в Python, которое означает «ничего». Поэтому result равно None, и второй print() выводит None.
Когда вы пытаетесь вычислять с None, программа завершается ошибкой:
def print_sum(a, b):
print(a + b)
total = print_sum(2, 3) * 2Выведется:
5
Traceback (most recent call last):
File "<exec>", line 4, in <module>
TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'Сообщение об ошибке говорит, что * не может работать с None (его тип — NoneType) и целым числом (int). Если вы видите None или NoneType там, где ждали значение, проверьте, есть ли в вашей функции return.
Бывает и наоборот: функция возвращает значение, но никто его не использует:
def add(a, b):
return a + b
add(2, 3)Эта программа ничего не выводит. Функция вернула 5, но программа не сохранила и не вывела его, поэтому значение пропало. Если хотите его увидеть, выведите: print(add(2, 3)).
Так когда функции выводить, а когда возвращать? Функция, которая что-то вычисляет, должна возвращать результат. Код, который её вызывает, сам решает, что с ним делать: вывести, сохранить или продолжить вычисления. Выводите внутри функции только тогда, когда показать что-то — это и есть вся её работа, как в say_hello() или print_area().
Задание
- 1
Пицца стоит 9, напиток — 3. Функция
order_priceдолжна вычислять цену заказа, но программа выводит две цены, а затем завершается ошибкойTypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'. Исправьте функцию: пусть возвращает цену, а не выводит её. Тогда программа выведетВместе: 63. - 2
В конце программы сравните два заказа: если семья платит меньше, чем друзья (
family < friends), выведитеСемья платит меньше.