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

StackOverflow https://stackoverflow.com/questions/750136

  •  09-09-2019
  •  | 
  •  

Вопрос

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

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

Но если функция «добавить» напечатает выходную «сумму», то она будет равна «Нет», поскольку действие уже произошло бы после ее назначения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top