Print не печатается, когда он находится в map, Python

#python-3.x #dictionary

#python-3.x #словарь

Вопрос:

 primes = [2,3,5,7..] (prime numbers)
map(lambda x:print(x),primes)
  

Он ничего не печатает.
Почему это так?
Я пробовал

 sys.stdout.write(x)
  

тоже, но тоже не работает.

Комментарии:

1. Это синтаксическая ошибка в Python 2, поэтому я бы предположил, что Python 3.

Ответ №1:

Поскольку lambda x: print(x) синтаксическая ошибка в Python < 3, я предполагаю, что Python 3 . Это означает map , что возвращает генератор, то есть, чтобы заставить map фактически вызывать функцию для каждого элемента списка, вам нужно выполнить итерацию по результирующему генератору.

К счастью, это можно сделать легко:

 list(map(lambda x:print(x),primes))
  

О, и вы тоже можете избавиться от лямбды, если хотите:

 list(map(print,primes))
  

Но в этот момент вам лучше позволить print справиться с этим:

 print(*primes, sep='n')
  

ПРИМЕЧАНИЕ: я сказал ранее, что 'n'.join это было бы хорошей идеей. Это верно только для списка str.

Комментарии:

1. Тем не менее, это все еще очень плохая идея (неидиоматичная, не очевидная — понимание карты, фильтра, списка и т. Д. Предназначено для вычислений, а не для побочных эффектов). Вы должны просто использовать цикл for , или print(*primes, sep='n') , или print('n'.join(str(x) for x in primes)) .

2. print(x) это не синтаксическая ошибка в Python < 3. Редактировать: Извините, это синтаксическая ошибка в этом вопросе.

3. @utdemir: встречается в a lambda или любом другом выражении, это (с или без скобок). Я предполагаю, что OP имел в виду это, и вы просто хотите придраться к формулировке 😉

4. список(map(лямбда x:print(x), если x>=a и isIntPalindrome(x), простые числа)) Хорошо, но почему это не работает (синтаксис)

5. Если вы не хотите перебирать все primes сразу или по какой-либо другой причине вам нужны отдельные print операторы, Pythonic way — это обычный for цикл, а не list на a map , который накапливает None s . Если вам нужно использовать map по какой-либо причине, вы можете избежать None накопления с next((x for x in map(print, primes) if x != None), None) помощью , но для этого нет причин.

Ответ №2:

Это работает для меня:

 >>> from __future__ import print_function
>>> map(lambda x: print(x), primes)
2
3
5
7
17: [None, None, None, None]
  

Используете ли вы Python 2.x, где print — это оператор, а не функция?

Комментарии:

1. Это работает специально, потому что вы используете Python 2. В Python 3 этого не происходит. И OP, скорее всего, использует 3.x, поскольку print используется как функция и поскольку sys.stdout.write «тоже не работает».

2. на самом деле вы можете сделать map(print, primes) это напрямую, без определения лямбда-функции.

Ответ №3:

Кроме того, вы можете распаковать его, поместив * перед map(...) следующим образом

 [*map(...)]
  

или

 {*map(...)}
  

Выберите желаемый результат, список или словарь.

Комментарии:

1. Спасибо, я давно ушел из python, но это элегантный способ, имхо.

Ответ №4:

Еще одна причина, по которой вы можете видеть это, заключается в том, что вы не оцениваете результаты функции map . Он возвращает генератор (итерируемый), который лениво оценивает вашу функцию, а не фактический список.

 primes = [2,3,5,7]
map(print, primes) # no output, because it returns a generator
  
 primes = [2,3,5,7]
for i in map(print, primes):
    pass # prints 2,3,5,7
  

В качестве альтернативы, вы можете сделать list(map(print, primes)) , что также заставит генератор быть оцененным и вызвать функцию печати для каждого элемента вашего списка.