map(f, L)
всегда вызывает f
с единственным аргументом, значения которого взяты из L
. Это всегда один аргумент, никогда не ноль. ()
в списке не являются списками аргументов, это пустые кортежи. Вне вызова функции вещи в скобках не являются аргументами функции, они являются объектами, называемыми «кортежами» (представьте их как неизменяемые списки). Проверка разницы между str()
и str(())
- str
без аргументов дает ''
и , а не '()'
.
Если у вас есть кортежи аргументов и вы хотите вызвать вызываемую функцию (функцию или метод) с этими аргументами, вы можете использовать itertools.starmap
. В частности, если вы передадите пустые кортежи, функции будут вызываться без аргументов. Он возвращает итератор, поэтому, если вам нужен список, вам нужно явно использовать list()
над результатом
>>> import itertools
>>> f = lambda: 42
>>> L = [(), (), ()]
>>> values = itertools.starmap(f, L)
>>> print list(values)
[42, 42, 42]
В общем случае работает с любым набором аргументов:
>>> f = lambda *x: sum(x)
>>> L = [(1,2), (4, ), (5,6)]
>>> values = itertools.starmap(f, L)
>>> print list(values)
[3, 4, 11]
Если вы хотите просто вызвать функцию несколько раз и получить результат, вы можете вместо этого использовать понимание списка или выражение генератора.
>>> f = lambda: 42
>>> [f() for _ in xrange(3)]
[42, 42, 42]
>>> values = (f() for _ in xrange(3))
>>> print list(values)
[42, 42, 42]
Если у вас есть список пустых кортежей, как в вашем примере, вы можете использовать xrange(len(L))
вместо xrange(3)
.