Чем возврат вывода функции отличается от его печати?
Вопрос
В моем предыдущем вопрос, Эндрю Джаффе пишет:
В дополнение ко всем остальным подсказкам и советам, я думаю, вы упускаете что-то важное:вашим функциям действительно нужно что-то возвращать.Когда вы создаете
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
что-то и print
занимаешься этим?
Решение
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».
Хороший урок см. погрузиться в питон.Это бесплатно и очень легко следовать.
Другие советы
Оператор печати выведет объект пользователю.Оператор 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)
Я думаю, вы запутались, потому что работаете из REPL, который автоматически распечатывает значение, возвращаемое при вызове функции.В этом случае вы получите одинаковый вывод независимо от того, есть ли у вас функция, которая создает значение, печатает его и выбрасывает, или у вас есть функция, которая создает значение и возвращает его, позволяя REPL распечатать его.
Однако это совсем не одно и то же, как вы поймете, когда вызовете autoparts с другой функцией, которая хочет что-то сделать со значением, создаваемым autoparts.
вы просто добавляете оператор возврата...
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()
Дополнительно еще это:
def f():
print("A")
a=f()
print(a.lower())
Выдаст ошибку, но:
def f():
return "A"
a=f()
print(a.lower())
дает желаемый результат.
Объяснить:
Если ты это сделаешь type(print())
возвращает Output, тогда это None, поэтому тип NoneType, поэтому NoneType не является атрибутом lower()
, ОТОХ return
здесь строка, поэтому ошибок нет, работает безупречно
def add(x, y):
return x+y
Таким образом, он может стать переменной.
sum = add(3, 5)
print(sum)
Но если функция «добавить» напечатает выходную «сумму», то она будет равна «Нет», поскольку действие уже произошло бы после ее назначения.