я вижу такие вопросы так часто, должен быть какой-то окончательный ответ на них все, что автоматически вызывает каждый раз, когда print
и None
оба присутствуют в одном вопросе ...
Хотя ответ на этот вопрос сама по себе тривиальна, что, я думаю, вам действительно нужно понять разницу между side effect и возвращаемым значением . Например:
a = 10
def three(x):
global a
a += x #side effect
print x #side effect
return 3 #returning
Значение наши three()
функция возвращает это 3. Она также имеет две побочные эффекты: изменение глобальной переменной a
и печати. Они называются побочными эффектами, потому что они изменяют что-то вне функции: переменную a
и состояние экрана соответственно.
В вашем примере:
def print0(s):
print s
нет явного возвращаемого значения, только побочный эффект (печать). Другими словами, он печатает что-то на экране, а затем ничего не возвращает. Это ничего называется None
в Python. Если вы так назвали:
a = print0(3)
он печатает 3 в консоли. Но какова ценность a
?
>>> print a
None
Теперь, чтобы узнать о понятии. Это концепция, заимствованная из функционального программирования (Lisp и т. Д.), Где она называется map
. Там еще map
функция в Python, поэтому следующие две строки эквивалентны:
[print0(s) for s in seqs]
map(print0, seqs)
То, что они оба делают принимает элементы списка ввода (seqs
), один за другим, применяя функцию (print0
) для каждого из них и помещать результаты (возвращаемые значения) один за другим в выходной список, который они возвращают. Каждый раз, когда они вызывают функцию print0
, она выводит на экран свой аргумент s
(побочный эффект), а затем ничего не возвращает (None
), который помещается в выходной список по усмотрению списка или map
. Если вы сделаете это в интерактивной консоли Python, этот результат появится на выходе ([None, None]
), если нет - он все еще создается интерпретатором и сразу же отбрасывается, если вы не передадите его в качестве аргумента другому оператору. Это приводит нас к вашей последней строке кода и сообщению TypeError
. Вы передаете свою функцию другой функции, которая ожидает строку, она не заботится о побочных эффектах, которые может вызвать ваша функция.Контекст не совсем ясно для меня, но вы, вероятно, должны определить свою функцию, как это:
def print0(s):
return str(s)
Теперь, вместо того, чтобы печатать s
на экране, он преобразует его в string
, а затем возвращается его. Обратите внимание, что если вы вызовете их внутри интерактивного интерпретатора так же, как print0(s)
, похоже, они создают тот же эффект, что может быть запутанным. Однако, если вы делаете a = print0(s)
, вы увидите, что a
отличается. В некоторых языках последнее вычисленное значение автоматически становится возвращаемым значением, но с Python, что это не так для обычных функций:
def times_three(x):
x*3
возвращается None
. Однако, есть также лямбда-функция, для которых что является случаем:
times_three = lambda x: x*3
times_three(5) #returns 15
. .. Потому что вы ничего не возвращаете ... –
оба фрагмента семантически разные: один из них только для цикла с инструкцией печати, а другой - для создания списка со списком, используя функцию, которая ничего не возвращает (ни один) –
В дополнение к тому, что было предложено в ответах, если вы не хотите см. «Нет», отбросьте значение выражения: '_ = [print0 (s) для s в seqs]'. – DyZ