2016-02-10 8 views
2

Мне нужна функция, которая принимала бы variadic arguments. Количество аргументов может варьироваться от 1 до N.Путаница в понимании кортежа и * args в Python

def abc(*args): 
    print "ABC" 
    print args 
    print len(args) 

def abc1(*args): 
    print "ABC1" 
    print args 
    print len(args) 
    print "------------" 


tup = ("Hello123") 
abc(*tup) 
abc1(tup) 
tup = ("Hello123", "Hello1234") 
abc(*tup) 
abc1(tup) 

Вывод вышеуказанной программы;

ABC 
('H', 'e', 'l', 'l', 'o', '1', '2', '3') 
8 
ABC1 
('Hello123',) 
1 
------------ 
ABC 
('Hello123', 'Hello1234') 
2 
ABC1 
(('Hello123', 'Hello1234'),) 
1 
------------ 

Если я смотрю на этот вывод, когда я передаю только один аргумент в abc1(), длина кортежа становится 8 (сохраняя *tup), где, как и в abc1() он показывает длина 1. why and how? Но то же самое не работает по-разному, когда я передаю 2 аргумента в коде выше. Выход поступает как tuple и tuple of tuple. Как решить эту проблему, потому что я должен написать код, который будет работать для всех N

+2

'tup = (" Hello123 ")' не создает кортеж. Это только строка «Hello123» с круглыми скобками вокруг нее. Если вы хотите кортеж с одним элементом, вам нужно поставить конечную запятую, например: 'tup = (" Hello123 ",)'. Этот синтаксис может выглядеть немного странным, но он необходим, чтобы выражения типа 'x = (y/2)' не интерпретировались как кортежи. –

ответ

3

скобок не делают кортежи, запятые сделать. Для создания одного элемента кортежа, правильный синтаксис

tup = ("Hello123",) # parentheses are optional but help readability 

что эквивалентно

tup = "Hello123", 

Помните, что вы можете написать

x, y = y, x # swaps x and y using tuple packing/unpacking 

точно так же, как

(x, y) = (y, x) 

Единственный исключающий где круглые скобки обязательный - пустой кортеж ().

+2

Чтобы добавить к вашему последнему предложению, вам также нужны скобки, если запятые иначе означали бы что-то другое. Например, аргументы функции и элементы списка разделяются запятыми, поэтому для создания кортежа в этих средах вам нужны скобки (например, 'foo ((x, y))' и '[(x, y)]'). – Blckknght