Есть ли способ использовать * args, чтобы динамически принимать столько входных данных, сколько я хочу в функции? - PullRequest
0 голосов
/ 29 января 2020

def f(a, b,c,d):
    x = open('data.txt', 'r')
    for line in x:
        line = line[a:b] + ':' + line[c:d] + ':'
        x2 = open('data2.txt', 'a+')
        x2.writelines(line)
f(0,2,2,6)

У меня есть необработанные данные, например,

1231231231231233453453223768729318974389124387\n
1234534534534543242145791208937867328918373892\n
8765432456765434568987692839471281027128012398\n
5787624567456787432343512487320190928390129383\n

Я хочу разделить данные на основе их местоположения, например: [0:2] может быть столбцом 1 и [2:6] - это столбец 2 и т. Д. когда я вызываю функцию f(), есть ли способ в python, где мы можем перегрузить или динамически ввести такие параметры, как f(0,2,2,6,6,10,10,14.......)

output:

57:8762:4567:8743.....

1 Ответ

0 голосов
/ 29 января 2020

Да. Python поддерживает специальные модификаторы входных аргументов. * говорит, что обрабатывает аргумент как список и присваивает любые оставшиеся входные аргументы этому списку. (** говорит, что обрабатывайте arg как dict и присваивайте ему все пары ключевых слов.) Таким образом, вы можете получить удовольствие c вроде:

def (a, b, *cd):
    "do something for 'a' and 'b'"
    for e in cd:
        "do something for each arg 'e' in 'cd'"

Arg 'cd' может быть пустым или это может быть долго, в зависимости от того, какие параметры вы используете для вызова веселья c. Если вы ожидаете, что cd всегда будет приходить парами, вы можете изменить for l oop на:

    for c, d in zip(cd[::2], cd[1::2]):
        "do something for 'c' and 'd'"

Функция zip принимает два списка и создает список кортежей. Итак, вышеприведенный for l oop берет один список и разбивает его на пары, четные и нечетные. Таким образом, если 'cd' равно (x0, y0, x1, y1), вызов zip приведет к ((x0, y0), (x1, y1)).

...