2012-04-03 5 views

ответ

13

Внутри скобок, которые формируют оператор вызова функции, запятая не для построения кортежей, но для разделения аргументов. Таким образом, type(3,) эквивалентен type(3). Дополнительная запятая в конце списка аргументов допускается грамматикой. Вам нужна дополнительная пара скобок построить кортеж:

>>> def f(x): 
...  print x 
... 
>>> f(3) 
3 
>>> f(3,) 
3 
>>> f((3,)) 
(3,) 
6

Встроенная функция type() является функцией, поэтому запятая анализируется как разделитель аргументов, а не конструктор кортежей.

>>> type(3,) 
<type 'int'> 

>>> type((3,)) 
<type 'tuple'> 
+1

Независимо от количества аргументов 'f', запятая будет анализироваться как разделитель аргументов. –

+0

Вы правы - я просто подтвердил это на моем конце. Будет редактировать. –

2

Я подозреваю, Python игнорирует Запятая в аргументы функции:

def f (a): 
    print a 
    print type(a) 

>>> f(3,) 
3 
<type 'int'> 

Используя значения, разделенные запятыми без скобок, чтобы создать кортеж является трюк, который не работает повсюду. Список постижений является хорошим примером:

>>> [a,a*2 for a in range(4)] 
    File "<stdin>", line 1 
    [a,a*2 for a in range(4)] 
      ^

Вы должны сделать это:

>>> [(a,a*2) for a in range(4)] 
[(0, 0), (1, 2), (2, 4), (3, 6)] 

Список распаковка работает отлично, хотя, так что это немного переменная, где неограниченная, разделенные запятыми значения разрешены:

>>> [(a,b) for a, b in zip(range(4),range(4))] 
[(0, 0), (1, 1), (2, 2), (3, 3)] 
0

в func(bunch_of_args) вам разрешено следовать за последним ARG с запятой, так же, как в

alist = [1, 2, 3, ]