19

Я читаю документацию Python, чтобы действительно углубленно изучать язык Python и сталкивался с функциями фильтра и карты. Я использовал фильтр раньше, но никогда не отображал карту, хотя я видел как в различных вопросах Python здесь, на SO.Python: Разница между фильтром (функция, последовательность) и карта (функция, последовательность)

Прочитав о них в учебнике Python, я смущен различием между ними. Например, из 5.1.3. Functional Programming Tools:

>>> def f(x): return x % 2 != 0 and x % 3 != 0 
... 
>>> filter(f, range(2, 25)) 
[5, 7, 11, 13, 17, 19, 23] 

и

>>> def cube(x): return x*x*x 
... 
>>> map(cube, range(1, 11)) 
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000] 

Они выглядели почти точно те же функции для меня, поэтому я пошел в терминал запустить Python в интерактивном режиме и испытываются мой собственный случай. Я использовал map как для первого, так и для второго экземпляра выше, а для первого (return x % 2 != 0 and x % 3 != 0) он вернул список булевых чисел, а не цифр.

Почему map иногда возвращает логическое и другое фактическое возвращаемое значение?

Может ли кто-нибудь объяснить мне именно разницу между map и filter?

ответ

24
map(cube, range(1, 11)) 

эквивалентно

[cube(1), cube(2), ..., cube(10)] 

Хотя список возвращаемый

filter(f, range(2, 25)) 

эквивалентно result после запуска

result = [] 
for i in range(2, 25): 
    if f(i): 
     result.append(i) 

Обратите внимание, что при использовании map, элементами в результате являются значения, возвращаемые функцией cube.

Наоборот, значения, возвращаемые f в filter(f, ...), не являются товарами в result. f(i) используется только для определения , если значение i должно храниться в result.

12

filter(), как следует из его названия, фильтрует исходную итерацию и сохраняет элементы, которые возвращают True для функции, предоставляемой filter().

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

Следит пример, который вы дали, давайте сравним их:

>>> def f(x): return x % 2 != 0 and x % 3 != 0 
>>> range(11) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> map(f, range(11)) #the ones that returns TRUE are 1, 5 and 7 
[False, True, False, False, False, True, False, True, False, False, False] 
>>> filter(f, range(11)) #So, filter returns 1, 5 and 7 
[1, 5, 7] 
+0

, что имеет смысл сейчас, я вижу, как этот термин фильтра предполагает, что функция делает против карты. – samrap

+1

На самом деле имя 'map()' имеет смысл, а в каком-то поле, когда карта используется в качестве глагола, это означает найти от 1 до 1 соответствующую связь. Например, в математике: «map x to y» или в генетике: «сопоставьте диабет с геном». Одна вещь, приятная в отношении «Python», такова: имена часто имеют смысл. –

+0

это хороший момент. Забавно, насколько похожи некоторые аспекты программирования на повседневные примеры.Как и я в алгебре 2, и мы изучаем функции f (x), а половина класса тупика, но идея на 100% аналогична функциям программирования. – samrap