Как возвращать выходные данные функции, отличной от ее печати?
В предыдущем question Эндрю Яффе пишет:
В дополнение ко всем другим советам и подсказкам, я думаю, что вам не хватает чего-то важного: ваши функции действительно должны что-то вернуть. Когда вы создаете autoparts()
или splittext()
, идея состоит в том, что это будет функция, которую вы можете вызвать, и она может (и должна) дать что-то обратно. После того, как вы выберете вывод, который требуется для вашей функции, вам нужно поместить его в оператор return
.
def autoparts():
parts_dict = {}
list_of_parts = open('list_of_parts.txt', 'r')
for line in list_of_parts:
k, v = line.split()
parts_dict[k] = v
print(parts_dict)
>>> autoparts()
{'part A': 1, 'part B': 2, ...}
Эта функция создает словарь, но ничего не возвращает. Однако, поскольку я добавил print
, вывод функции отображается при запуске функции. В чем разница между return
ing и print
его использованием?
Ответы
Ответ 1
Print просто распечатывает структуру на ваше устройство вывода (обычно консоль). Ничего больше. Чтобы вернуть его из вашей функции, вы должны сделать:
def autoparts():
parts_dict = {}
list_of_parts = open('list_of_parts.txt', 'r')
for line in list_of_parts:
k, v = line.split()
parts_dict[k] = v
return parts_dict
Зачем возвращаться? Хорошо, если вы этого не сделаете, этот словарь умирает (получает мусор) и больше не доступен, как только этот вызов функции заканчивается. Если вы вернете значение, вы можете делать с ним другие вещи. Например:
my_auto_parts = autoparts()
print(my_auto_parts['engine'])
Видишь, что случилось? Вызван autoparts(), он вернул parts_dict, и мы сохранили его в переменной my_auto_parts. Теперь мы можем использовать эту переменную для доступа к объекту словаря, и он продолжает жить, даже если вызов функции завершен. Затем мы распечатали объект в словаре с ключом "engine".
Для хорошего урока, посмотрите погружение в python. Это бесплатно и очень легко следовать.
Ответ 2
Оператор печати выведет объект пользователю. Оператор return позволяет присваивать словарь переменной после завершения функции.
>>> def foo():
... print "Hello, world!"
...
>>> a = foo()
Hello, world!
>>> a
>>> def foo():
... return "Hello, world!"
...
>>> a = foo()
>>> a
'Hello, world!'
Или в контексте возврата словаря:
>>> def foo():
... print {'a' : 1, 'b' : 2}
...
>>> a = foo()
{'a': 1, 'b': 2}
>>> a
>>> def foo():
... return {'a' : 1, 'b' : 2}
...
>>> a = foo()
>>> a
{'a': 1, 'b': 2}
(Операторы, в которых ничего не распечатывается после выполнения строки, означает, что последний оператор вернул None)
Ответ 3
Я думаю, вы сбиты с толку, потому что вы работаете с REPL, который автоматически выводит значение, возвращаемое при вызове функции. В этом случае вы получаете идентичный результат, есть ли у вас функция, которая создает значение, печатает его и отбрасывает, или у вас есть функция, которая создает значение и возвращает его, позволяя REPL распечатать его.
Однако это очень не то же самое, что вы поймете, когда вы вызываете autoparts с другой функцией, которая хочет что-то сделать со значением, которое создает автозапуск.
Ответ 4
вы просто добавляете оператор возврата...
def autoparts():
parts_dict={}
list_of_parts = open('list_of_parts.txt', 'r')
for line in list_of_parts:
k, v = line.split()
parts_dict[k] = v
return parts_dict
распечатка выводится только на стандартный вывод (экран) приложения. Вы также можете вернуть несколько вещей, разделив их запятыми:
return parts_dict, list_of_parts
чтобы использовать его:
test_dict = {}
test_dict = autoparts()
Ответ 5
Кроме того, также это:
def f():
print("A")
a=f()
print(a.lower())
выдает ошибку, но:
def f():
return "A"
a=f()
print(a.lower())
дает желаемый результат.
Чтобы объяснить:
Если вы делаете type(print())
, возвращает Output, то это None, поэтому type это NoneType, поэтому NoneType не имеет атрибута lower()
, OTOH return
здесь строка, поэтому без ошибок, работает без сбоев
Ответ 6
def add(x, y):
return x+y
Таким образом, он может стать переменной.
sum = add(3, 5)
print(sum)
Но если функция add добавляет print, сумма вывода будет равна None, поскольку действие уже будет выполнено после его назначения.