2013-11-11 4 views
0

Я пытаюсь научиться использовать * args и придумал это.Python convert * args to list

alist =[5,2,6,1,2] 
blist =[1,5,2,4,1] 

def argstest(var1, var2, *args): 
    print "var1", var1 
    print "var2", var2 

    temp = list(args)[0] 

    for i in temp: 
     if i > 3: 
      print i 

argstest(5, 8, alist, blist) 
>>>>> var1 5 
>>>>> var2 8 
>>>>> 5 
>>>>>>6 
>>>>>>5 
>>>>>>4 

Хотя я вижу, как это может быть очень полезно моя первая проблема заключалась в том

temp = list(args)[0] 

очень странный способ, чтобы преобразовать *args в список, а второй в том, что это не является стандартной способ использования *args.

Мой вопрос, что будет стандартным способом преобразования *args в список?

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

+4

'* args' является кортежем, зачем вам его преобразовывать в список? Вы также передаете * in * список как один аргумент, поэтому 'args [0]' - это список. –

+0

Martijn. В случае этой функции он должен быть списком для итерации в цикле for. femtoRgon, эти вопросы могут быть похожими, но они совсем не то же самое. –

+2

@NickSimas: Нет, нет. Вы можете перебирать кортеж, или фактически _any_ вид итерации, точно так же, как вы можете перебирать список. – abarnert

ответ

1

Перебирает каждого аргумента после первых двух:

alist =[5,2,6,1,2] 
blist =[1,5,2,4,1] 

def argstest(*args): 
    for i in args[2:] 
     for j in i: 
      if j > 3: 
       print j 

argstest(5, 8, alist, blist) 

вы увидите, что * арг позволяет передавать в произвольное число аргументов. Теперь он выравнивает несколько списков в один.

+0

Просьба уточнить, этот код не работает, если вы все еще используете alist, blist. –

+0

Ясно, что вопрос был обновлен, так как я написал ответ, но поскольку оба списка длиннее 3, они оба печатаются по циклу. –

+0

@NickSimas вы хотели преобразовать оба списка в один список? –

0

Вы не конвертируете args в список ... args - это tupl, а первый элемент - ваш список. Args уже является tupl. Просто дайте список функции. Вам не нужно использовать *.

+0

кортеж, а не список – alko

+0

oh спасибо, я отредактировал –

+0

Я имел в виду, что в этом случае может быть несколько списков или даже список списков. Но ты прав, я отредактирую. –

0

'*' объединяет все неназванные параметры в кортеж, и это * args. Вы также должны изучить ** args (писать args - это просто соглашение), которое преобразует все именованные параметры в словари. Это шаг к переходу между новичками и промежуточными программистами. Эти две вещи будут широко использоваться, когда вы будете использовать ООП и использовать наследование.

0

Вам не нужно использовать переменную temp, просто перебирайте аргументы и распечатывайте каждый список.

alist =[5,2,6,1,2] 
blist =[1,5,2,4,1] 

def argstest(var1, var2, *args): 
    print "var1", var1 
    print "var2", var2 

    for i in args: 
     if i > 3: 
      print i 

argstest(5, 8, alist, blist) 
+1

Это не работает, вы не можете перебирать через кортежи, так как для i в –

+0

ваш код печатает как var1 5 var2 8 [5, 2, 6, 1, 2] [1, 5, 2, 4, 1] –

+0

@NickSimas ерунда. Как уже указывал Martijn, 'for' принимает * any * iterable: list, tuple, generator ... –