вызов карты BIF (min ()) - что происходит?

У меня есть два списка:

a,b=[1,2],[33,44]

Я хочу изучить их минимум. Но

>>> min(a,b)

возвращает [1, 2] как min()

С более чем одним аргументом верните наименьший из аргументов.

То же самое произойдет, если я использую map() как map(min,a,b)

в основном эквивалентно:

[f(x1, x2) for x1, x2 in zip(sequence1, sequence2)]

как уже было сказано в этом ответе.

>>> map(min,[a,b])
[1, 33]

дает мне то, что я хочу, но я действительно не понимаю, почему. Кто-нибудь может объяснить?


person LarsVegas    schedule 05.09.2012    source источник


Ответы (1)


Ответ находится в map документации Python:

Применить функцию к каждому элементу итерации и вернуть список результатов. Если передаются дополнительные итерируемые аргументы, функция должна принимать такое количество аргументов и применяться к элементам из всех итераций параллельно.

Когда вы звоните:

map(min, a, b)

Фактически вы передаете два итератора в map. Это последовательно вызывает min(1, 33) и min(2, 44), возвращая таким образом [1, 2].

Однако в:

map(min, [a, b])

Есть одна итерация, и map вызывает min для каждого элемента последовательности:

  • Первый вызов min([1, 2]), который дает 1
  • Затем вызов min([33, 44]), который дает 33

Результат, как и ожидалось, [1, 33].

person icecrime    schedule 05.09.2012
comment
В этом есть смысл, если вы прочтете ваш ответ. Спасибо за объяснение. Неужели map() действительно работает как генератор? - person LarsVegas; 05.09.2012
comment
@larsvegas map() возвращает список в python 2.x, а в python 3.x он возвращает map object, который является генератором. - person Ashwini Chaudhary; 05.09.2012