#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
сразу или по какой-либо другой причине вам нужны отдельныеfor
цикл, а неlist
на amap
, который накапливает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, поскольку
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))
, что также заставит генератор быть оцененным и вызвать функцию печати для каждого элемента вашего списка.