Что ** (двойная звезда / звездочка) и * (звездочка / звездочка) делают для параметров?

Возможно, это потому, что вы смешиваете разные способы добавления ячеек? Вы пытались явно создать объект ячейки, массируя его, но вы хотите добавить его для каждой ячейки?

Еще одна вещь, которую вы могли бы попробовать, - установить вертикальное выравнивание, а также горизонтальное.

2063
задан ShadowRanger 22 March 2019 в 20:30
поделиться

4 ответа

*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 позиционных параметра и все после * может только быть передан как аргументы ключевого слова.

2036
ответ дан gblomqvist 22 March 2019 в 20:30
поделиться

Из документации Python:

, Если существует больше позиционных параметров, чем, существуют слоты формального параметра, Исключение TypeError повышено, если формальный параметр с помощью синтаксиса "*identifier" не присутствует; в этом случае тот формальный параметр получает кортеж, содержащий избыточные позиционные параметры (или пустой кортеж, если не было никаких избыточных позиционных параметров).

, Если какой-либо аргумент ключевого слова не соответствует имени формального параметра, Исключение TypeError повышено, если формальный параметр с помощью синтаксиса "** идентификатор" не присутствует; в этом случае тот формальный параметр получает словарь, содержащий избыточные аргументы ключевого слова (использующий ключевые слова в качестве ключей и значений аргументов как соответствующие значения), или (новый) пустой словарь, если не было никаких избыточных аргументов ключевого слова.

12
ответ дан Chris Upchurch 22 March 2019 в 20:30
поделиться
  • 1
    It' s также работающий. Спасибо за быстрые ответы. – designersvsoft 17 May 2012 в 10:15

Сингл * означает, что может быть любое количество дополнительных позиционных параметров. 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}
161
ответ дан Community 22 March 2019 в 20:30
поделиться
  • 1
    @VisioN. Я думал об этом, но это должно быть :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'
561
ответ дан Trenton 22 March 2019 в 20:30
поделиться
  • 1
    Не работая wo. права администратора над XP – user1126070 29 March 2013 в 15:19
Другие вопросы по тегам:

Похожие вопросы: