Чем возврат вывода функции отличается от ее печати? - PullRequest
30 голосов
/ 15 апреля 2009

В моем предыдущем вопросе Эндрю Джаффе пишет:

В дополнение ко всем другим советам и подсказкам, я думаю, что вы упускаете что-то решающее: ваши функции действительно должны что-то возвращать. Когда вы создаете 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 этим?

Ответы [ 6 ]

61 голосов
/ 15 апреля 2009

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 . Это бесплатно и очень легко следовать.

8 голосов
/ 15 апреля 2009

Оператор print выведет объект пользователю. Оператор 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)

4 голосов
/ 15 апреля 2009

Я думаю, что вы запутались, потому что вы бежите из REPL, который автоматически выводит значение, возвращаемое при вызове функции. В этом случае вы получите идентичный вывод независимо от того, есть ли у вас функция, которая создает значение, печатает его и выбрасывает, или у вас есть функция, которая создает значение и возвращает его, позволяя REPL напечатать его.

Однако это не одно и то же, что вы поймете, когда вызовете autoparts с другой функцией, которая хочет что-то сделать со значением, которое создает autoparts.

3 голосов
/ 15 апреля 2009

вы просто добавляете оператор возврата ...

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()
0 голосов
/ 05 января 2019
def add(x, y):
    return x+y

Таким образом, он может стать переменной.

sum = add(3, 5)

print(sum)

Но если функция add добавляет print, сумма sum будет None, поскольку действие уже будет выполнено после его назначения.

0 голосов
/ 08 октября 2018

Дополнительно, также это:

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 здесь строка, поэтому без ошибок, работает без сбоев

...