Как я уже упоминал в своем комментарии, вы не понимаете, как на самом деле работает map
(а теперь starmap
).
Я верю, что вы пытаетесь достичь sh вызывает func
с вашими четырьмя переменными, определенными в numbers = (1, 2, 3, 4)
. Предполагая, что это так, вы можете просто сделать
>>> func(*numbers)
, чтобы "распаковать" кортеж numbers
в четыре обязательных аргумента для func
.
Теперь, надеюсь, проясните путаницу на map
. Функция map
принимает два параметра: вызываемую функцию и итерируемую. Затем для каждого элемента в итерируемом вызове функции.
Итак, map(func, numbers)
эквивалентно:
>>> func(1)
>>> func(2)
>>> func(3)
>>> func(4)
, что явно неверно, поскольку вашей функции требуется 4 параметра, а не 1.
При starmap
, состояние документа:
Используется ... когда параметры аргумента уже сгруппированы в кортежи из одной итерируемой
, что заставляет его работать где-то между map
и ответом, который я предложил выше.
Когда вы делаете starmap(func, numbers)
, вы фактически делаете:
>>> func(*1)
>>> func(*2)
>>> func(*3)
>>> func(*4)
, который затем вызывает TypeError: 'int' object is not iterable
. Примечание: это происходит при вызове list(...)
, потому что starmap
является ленивым и фактически ничего не делает, пока в этом нет крайней необходимости, что находится внутри преобразования в list
.
Чтобы starmap
работал, вам нужно поместить numbers
внутри итерируемого, такого как itertools.starmap(func, [numbers])
. Это даст вам эффективный вызов func(*numbers)
, который идентичен моему первоначальному предложению.
Я настоятельно рекомендую вам прочитать iterables , обращая пристальное внимание на iterators
, а также распаковка списков аргументов .