Python'da ** adı nedir?


59

Python programlamada bazen **dönüşüm yapmak için yapıyorum. Ne işe yaradığını anlıyorum ama hangi veri yapılarını değiştiriyorum? A dictve diğeri nedir? Bir array? **Operatör için bir isim var mı ?


3
üstel operatör?
Ocak'ta

12
Bunun iki anlamı var **. Güç ve "anahtar kelime argüman sözlük". Hangisinden bahsediyorsun Belgelerde şu kelimeler var: "“ ** tanımlayıcı ”formu mevcutsa, fazladan anahtar kelime argümanlarını alan ve yeni boş sözlüğe çeviren yeni bir sözlüğe başlatılır.” Hangisi sorunuzla alakalı görünüyor?
S.Lott

"Anahtar kelime argüman sözlüğü" soruyorum. Yorumlarınız için teşekkür ederiz.
Niklas Rosencrantz

Yanıtlar:


86

Bu gibi bir operatör değil, bu yüzden gerçekten bir adı yok, ancak "sözdizimsel kural" olarak tanımlanır . Bu yüzden çağrılmalıdır:

  • "anahtar kelime argümanı sözdizimini açma"

Eğer bir argümanlar listeniz varsa *args, buna "paket açma argümanı"**kwargs denir , aynı şekilde "anahtar sözcük argümanı açma" olarak da adlandırılır .

Bir sol taraftaki kullanırsanız =, hem de a, *middle, end = my_tuple, derdin ki "Başlık açma" .

Toplamda, üç tür (tek parametre) argüman vardır:

def f(x)  # x: positional argument
def f(x, y=0)  # y: keyword argument
def f(x, *xs, y=0)  # y: keyword-only argument

*argsArgüman "değişken konumsal parametre" ve denir **kwargs"değişken anahtar kelime parametresini" dir. Yalnızca anahtar sözcük argümanları konumsal olarak verilemez, çünkü değişken bir konumsal parametre ilettiğiniz tüm argümanları alır.

Bunun büyük kısmı PEP'lerden bulunabilir 0362 ve 3102 yılında olduğu gibi, Kontrol Akış dokümanlar bölümünde. Fonksiyon imzası nesnesi PEP'in sadece bir taslak olduğu ve terminolojinin sadece bir kişinin fikri olabileceği de belirtilmelidir. Ama yine de iyi şartlar. :)

Yani *ve **argümanlar sadece kendi veri yapılarını açar:

args = (1, 2, 3)  # usually a tuple, always an iterable[1]

f(*args)  f(1, 2, 3)

# and 

kwargs = {"a": 1, "b": 2, "c": 3}  # usually a dict, always a mapping*

f(**kwargs) -> f(a=1, b=2, c=3)

[1]: Iterables uygulamak nesnelerdir __iter__()yöntem ve eşlemeler uygulamak nesneleridir keys()ve __getitem__(). Bu protokolü destekleyen herhangi bir nesne kurucular tarafından anlaşılacak tuple()ve dict()böylece argümanları açmak için kullanılabilirler.


3
Başka birinin kafası karışırsa, def f(x, *xs, y=0): passPython 2 geçerli değildir def f(x, y=0, *xs):. AFAIK, (açıkçası) amaçlanan etkiyi elde etmenin tek yolu def f(x, *xs, **kw): y=kw.get('y', 0); del kw; .... Python 3, orijinal sözdizimini beklendiği gibi kullanır.
chbrown

1
Biz varken: begin, *middle, end = (0, 1, 2, 3, 4, 5)sözdizimi Python 2.x de çalışmıyor.
Stefano Palazzo

Bu cevap Python 3.5 ve sonrasında yanlış. PEP-448 ** işlecini sözlük açma işleci olarak belirtir. Bkz. Python.org/dev/peps/pep-0448
devnul3

13

Bir adı olduğunu sanmıyorum. In Python Dokümanlar "Argüman Listeleri paketinin açılması" altında, sadece olarak anılacaktır " **-Operatör."

"Öteki" veri yapısı ile ne demek istediğinizi anlamadım. Bunu yaptığınızda f(**kwargs), sözlüğü kwargsbir anahtar / değer çiftleri dizisi olarak açarsınız. Katılan başka bir yapı olduğunu görmüyorum.

Açıklık sağlamak için yukarıdaki dokümantasyondaki örneği kopyalayacağım .

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

Ayrıca bakınız: * args ve ** kwargs ne anlama geliyor?


Bir okuyucunun yorumlayabileceği birkaç olası yol vardır f(**kwargs)...
Deer Hunter

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.