Python заполняет входные аргументы для функции с помощью *args

Если у меня есть функция, которая поддерживает переменный номер аргумента, т.е. использует *args, как я могу заполнить аргументы из понимания цикла/списка? Скажем, функция ожидает несколько списков в качестве аргументов, и у меня есть таблица/фрейм данных, и я хочу использовать каждый столбец в качестве входного аргумента, почему это не работает?

funName([df[iCol].values for iCol in df.columns])

Скажем, мой фрейм данных имеет 5 столбцов, мне нужно будет вызвать функцию следующим образом:

funName(col1, col2, col3, col4, col5)

Но я не хочу вручную создавать переменные для каждого столбца, а динамически заполнять список аргументов. Спасибо.


person dter    schedule 26.04.2016    source источник


Ответы (1)


Распакуйте свой список при его передаче:

funName(*[df[iCol].values for iCol in df.columns])

Распаковка списка необходима, потому что, если вы этого не сделаете, fn получит один аргумент, то есть список, скажем, [1, 2, 3], а вам нужна последовательность аргументов 1, 2, 3.

Например:

>>> def fn(*args):
...     print args
...     
>>> fn([1, 2, 3])
([1, 2, 3],)
>>> fn(*[1, 2, 3])
(1, 2, 3)
>>> 
person Bahrom    schedule 26.04.2016
comment
Работает отлично. Спасибо! Зачем нужна распаковка списка? (примет ответ через 11 минут). - person dter; 26.04.2016
comment
@dter Это синтаксис - person Amit Gold; 26.04.2016
comment
Имеет смысл. В основном определяется, является ли 1,2,3 3 различными аргументами или 1 списком аргументов, содержащим [1,2,3] в качестве элементов. - person dter; 26.04.2016