Почему map (print, a_list) не работает?
Для нормальной функции map
работает хорошо:
def increment(n):
return n+1
l = [1, 2, 3, 4, 5]
l = map(increment, l)
print l
>>> [2, 3, 4, 5, 6]
Однако, если он print
помещается внутри функции map
:
l = [1, 2, 3, 4, 5]
l = map(print, l)
print l
python будет жаловаться:
l = map(print, l)
^
SyntaxError: invalid syntax
Что делает print
особенным? Не выполняет ли print(x)
действительный вызов функции? Вышеупомянутый код тестируется под python 2.7.
Ответы
Ответ 1
В Python 2.x, print
- это оператор, а не функция. Если вы попробуете это в Python 3.x, он будет работать.
В Python 2.x вы можете сказать print(x)
и это не синтаксическая ошибка, но на самом деле это не вызов функции. Точно так же, как 1 + (3)
совпадает с 1 + 3
, print(x)
совпадает с print x
в Python 2.x.
В Python 2.x вы можете сделать это:
def prn(x):
print x
Затем вы можете сделать:
map(prn, lst)
и он будет работать. Обратите внимание, что вы, вероятно, не хотите делать lst = map(prn, lst)
, потому что prn()
возвращает None
, поэтому вы замените свой список значений одним и тем же списком только значения None
.
EDIT: два других решения для Python 2.x.
Если вы хотите полностью изменить поведение print
, вы можете сделать это:
from __future__ import print_function
map(print, lst)
Это делает print
в функции так же, как и в Python 3.x, поэтому она работает с map()
.
Или вы можете сделать это:
from pprint import pprint
map(pprint, lst)
pprint()
- это функция, которая печатает вещи и доступна как встроенная. Я не совсем уверен, как он отличается от стандартного print
(он говорит, что это функция "довольно-печатная", но я не уверен, как именно это делает его другим).
Кроме того, согласно стандарту PEP 8, не рекомендуется использовать l
в качестве имени переменной, поэтому вместо этого я использую lst
в моих примерах.
http://www.python.org/dev/peps/pep-0008/
Ответ 2
Лучший способ распечатать печать в 2.x - это сделать
from __future__ import print_function
Ответ 3
Как говорили другие, в Python 2.x print
есть инструкция. Если вы действительно хотите это сделать в Python 2.x, вы можете использовать pprint
:
from pprint import pprint
l = [1, 2, 3, 4, 5]
p = map(pprint, l)
Ответ 4
Из вашей строки print l
я предполагаю, что это python2, где print
есть не функция, это оператор.
Ответ 5
Потому что print
не является функцией.
Но вы можете сделать печать-обертку, конечно:
>>> def p(x):
... print x
...
>>> l = [1, 2, 3, 4, 5]
>>> l = map(p, l)
1
2
3
4
5
Ответ 6
Вышеупомянутые ответы работают на Python 2, но не на Python 3 с изменениями как на карте, так и на функции печати.
Решение, к которому я пришел, чтобы достичь того, что я хотел сделать map(print, lst)
для Python 3, - это распаковать список внутри вызова печати.
lst = [1, 2, 3]
print(*lst, sep='\n')
Вывод:
1
2
3
Об этом можно узнать более подробно в своем ответе на Использовать печать внутри лямбда.