Возможно, это потому, что вы смешиваете разные способы добавления ячеек? Вы пытались явно создать объект ячейки, массируя его, но вы хотите добавить его для каждой ячейки?
Еще одна вещь, которую вы могли бы попробовать, - установить вертикальное выравнивание, а также горизонтальное.
*args
и **kwargs
общая идиома должна позволить произвольное число аргументов функциям, как описано в разделе больше по определению функций в документации Python.
*args
даст Вам всем параметры функции как кортеж:
In [1]: def foo(*args):
...: for a in args:
...: print a
...:
...:
In [2]: foo(1)
1
In [4]: foo(1,2,3)
1
2
3
**kwargs
даст Вам всем аргументы ключевого слова за исключением тех, которые соответствуют формальному параметру как словарь.
In [5]: def bar(**kwargs):
...: for a in kwargs:
...: print a, kwargs[a]
...:
...:
In [6]: bar(name='one', age=27)
age 27
name one
Обе идиомы могут быть смешаны с нормальными аргументами для разрешения фиксированного ряда и некоторые аргументы переменной:
def foo(kind, *args, **kwargs):
pass
Другое использование *l
идиома должна распаковать списки аргументов при вызывании функции.
In [9]: def foo(bar, lee):
...: print bar, lee
...:
...:
In [10]: l = [1,2]
In [11]: foo(*l)
1 2
В Python 3 возможно использовать *l
на левой стороне присвоения (Расширенная Повторяемая Распаковка), хотя это дает список вместо кортежа в этом контексте:
first, *rest = [1,2,3,4]
first, *l, last = [1,2,3,4]
Также Python 3 добавляет новый семантический (отошлите PEP 3102):
def func(arg1, arg2, arg3, *, kwarg1, kwarg2):
pass
Такая функция принимает только 3 позиционных параметра и все после *
может только быть передан как аргументы ключевого слова.
Из документации Python:
, Если существует больше позиционных параметров, чем, существуют слоты формального параметра, Исключение TypeError повышено, если формальный параметр с помощью синтаксиса "*identifier" не присутствует; в этом случае тот формальный параметр получает кортеж, содержащий избыточные позиционные параметры (или пустой кортеж, если не было никаких избыточных позиционных параметров).
, Если какой-либо аргумент ключевого слова не соответствует имени формального параметра, Исключение TypeError повышено, если формальный параметр с помощью синтаксиса "** идентификатор" не присутствует; в этом случае тот формальный параметр получает словарь, содержащий избыточные аргументы ключевого слова (использующий ключевые слова в качестве ключей и значений аргументов как соответствующие значения), или (новый) пустой словарь, если не было никаких избыточных аргументов ключевого слова.
Сингл * означает, что может быть любое количество дополнительных позиционных параметров. foo()
может быть вызван как foo(1,2,3,4,5)
. В теле нечто () param2 является последовательностью, содержащей 2-5.
двойное ** средства там могут быть любым количеством дополнительных именованных параметров. bar()
может быть вызван как bar(1, a=2, b=3)
. В теле панели () param2 является словарем, содержащим {'':2, 'b ':3}
Со следующим кодом:
def foo(param1, *param2):
print(param1)
print(param2)
def bar(param1, **param2):
print(param1)
print(param2)
foo(1,2,3,4,5)
bar(1,a=2,b=3)
вывод
1
(2, 3, 4, 5)
1
{'a': 2, 'b': 3}
:input:not(:submit):not(:button)
... так это doesn' t стоящий того.
– gdoron
17 May 2012 в 10:19
Также стоит отметить, что можно использовать *
и **
при вызывании функций также. Это - ярлык, который позволяет Вам передавать несколько аргументов функции непосредственно с помощью или списка/кортежа или словаря. Например, если у Вас есть следующая функция:
def foo(x,y,z):
print("x=" + str(x))
print("y=" + str(y))
print("z=" + str(z))
можно сделать вещи как:
>>> mylist = [1,2,3]
>>> foo(*mylist)
x=1
y=2
z=3
>>> mydict = {'x':1,'y':2,'z':3}
>>> foo(**mydict)
x=1
y=2
z=3
>>> mytuple = (1, 2, 3)
>>> foo(*mytuple)
x=1
y=2
z=3
Примечание: ключи mydict
нужно назвать точно как параметры функции foo
. Иначе это бросит TypeError
:
>>> mydict = {'x':1,'y':2,'z':3,'badnews':9}
>>> foo(**mydict)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() got an unexpected keyword argument 'badnews'