"Anahtar kelime bağımsız değişkenleri" normal bağımsız değişkenlerden nasıl farklıdır? Tüm argümanlar name=value
konumsal sözdizimi kullanmak yerine iletilemez mi?
"Anahtar kelime bağımsız değişkenleri" normal bağımsız değişkenlerden nasıl farklıdır? Tüm argümanlar name=value
konumsal sözdizimi kullanmak yerine iletilemez mi?
Yanıtlar:
Her ikisi de " anahtar kelime bağımsız değişkenleri " olarak adlandırılan ilgili iki kavram vardır .
Arama tarafında, diğer yorumcuların bahsettiği şey, bazı işlev bağımsız değişkenlerini adıyla belirtebilirsiniz. Adsız argümanlardan ( konum bağımsız değişkenleri ) sonra bunlardan bahsetmelisiniz ve hiç belirtilmeyen parametreler için varsayılan değerler olmalıdır .
Diğer kavram işlev tanımı tarafındadır: parametreleri ada göre alan bir işlev tanımlayabilirsiniz - ve bu adların ne olduğunu belirtmeniz bile gerekmez. Bunlar saf anahtar kelime bağımsız değişkenleridir ve konumsal olarak iletilemez. Sözdizimi
def my_function(arg1, arg2, **kwargs)
Bu işleve ilettiğiniz tüm anahtar kelime bağımsız değişkenleri adlı bir sözlüğe yerleştirilir kwargs
. Bu sözlüğün tuşlarını çalışma zamanında şu şekilde inceleyebilirsiniz:
def my_function(**kwargs):
print str(kwargs)
my_function(a=12, b="abc")
{'a': 12, 'b': 'abc'}
kwargs
yoksa sth olarak yeniden adlandırabilirim. gibi options
( def my_fuction(arg1, arg2, **options)
)?
kwargs
daha uygun bir isim olmadığında kongre olsa da
Ayrımın önemli olduğu son bir dil özelliği var. Aşağıdaki işlevi göz önünde bulundurun:
def foo(*positional, **keywords):
print "Positional:", positional
print "Keywords:", keywords
*positional
Argüman geçirilen pozisyonel argümanlar tüm depolar foo()
Verdiğiniz kaç hiçbir sınırı ile.
>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}
Bağımsız **keywords
değişken, anahtar kelime bağımsız değişkenlerini depolar:
>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}
Ve elbette, her ikisini aynı anda kullanabilirsiniz:
>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}
Bu özellikler nadiren kullanılır, ancak bazen çok kullanışlıdır ve hangi argümanların konumsal veya anahtar kelime olduğunu bilmek önemlidir.
*positional
ve **keywords
işlev tanımını değiştirirsek not edeceğimizi unutmayın def foo(arg1, *positional, **keywords):
. İşte arg1
konumsal ve gerekli. Yanıttaki konumun isteğe bağlı ve değişken sayıda konum argümanı anlamına geldiğini lütfen unutmayın.
foo(bar=True)
, değerlerini bar = keywords.pop('bar')
aynı ile alabilirsiniz bar = keywords.pop('bar', None)
. Varsayılan değer içinbar = keywords.pop('bar', False)
Anahtar kelime bağımsız değişkenlerini kullanmak, sıralamanın önemi dışında normal bağımsız değişkenlerle aynı şeydir. Örneğin, aşağıdaki iki işlev çağrısı aynıdır:
def foo(bar, baz):
pass
foo(1, 2)
foo(baz=2, bar=1)
Önlerinde hiç anahtar kelime yok. Sipariş önemlidir!
func(1,2,3, "foo")
Önlerinde anahtar kelimeler var. Herhangi bir sırada olabilirler!
func(foo="bar", baz=5, hello=123)
func(baz=5, foo="bar", hello=123)
Ayrıca, varsayılan bağımsız değişkenleri kullanır ve anahtar kelimeleri eklemek için ihmal ederseniz, siparişin önemli olacağını da bilmelisiniz!
def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)
func("bar", 5)
? Ve sonra hello
bunun varsayılan değerini aldığını söyleyin 3
.
İşlev parametrelerine bağımsız değişken değerleri atamanın iki yolu vardır, her ikisi de kullanılır.
Pozisyona göre. Konumsal bağımsız değişkenlerin anahtar sözcükleri yoktur ve önce atanır.
Anahtar kelime ile. Anahtar kelime bağımsız değişkenleri anahtar kelimelere sahiptir ve konumsal bağımsız değişkenlerden sonra ikinci olarak atanır.
Not olduğunu sen pozisyonel argümanları kullanma seçeneğine sahip.
Eğer siz konumsal argümanları kullanmayın, daha sonra - evet - her şey sen bir anahtar kelime argüman olarak döner yazdım.
Ne zaman sen bir işlevi çağırmak Eğer kullanım pozisyonunda veya anahtar kelime veya bir karışıma bir karar. İsterseniz tüm anahtar kelimeleri yapmayı seçebilirsiniz. Bazılarımız bu seçimi yapmıyor ve konumsal argümanlar kullanmıyor.
Hiç kimsenin, bu gibi resmi parametreleri tatmin eden anahtarlı argüman parametreleri sözlüğü geçebileceğine işaret etmediğine şaşırdım.
>>> def func(a='a', b='b', c='c', **kwargs):
... print 'a:%s, b:%s, c:%s' % (a, b, c)
...
>>> func()
a:a, b:b, c:c
>>> func(**{'a' : 'z', 'b':'q', 'c':'v'})
a:z, b:q, c:v
>>>
, **kwargs
. Bu, sabit bir parametre sayısı olan basit bir fonk def'nin bile bir sözlük sağlanabileceğini gösterir. Yani, tanımda fantezi bir şey gerektirmez. Daha sonra, tanımla birlikte ** kwargs olan ikinci bir örnek ekleyebilir ve sözlükteki EKSTRA öğelerin bu yöntemle nasıl kullanılabileceğini gösterebilirsiniz.
print 'a:%s, b:%s, c:%s' % (a, b, c)
sözdizimi hatası veriyor, ancak print('a:%s, b:%s, c:%s' % (a, b, c))
çalışıyor. Python sürümü ile ilgili bir şey mi var? Her neyse, bu anlayış için teşekkürler, şimdiye kadar daha hantal kullanıyordumprint('a:{}, b:{}, c:{}'.format(a, b, c))
Kullanımı Python 3 sen olabilir hem zorunlu ve gerekli olmayan anahtar kelime argümanlar :
İsteğe bağlı : ('b' parametresi için varsayılan değer tanımlandı)
def func1(a, *, b=42):
...
func1(value_for_a) # b is optional and will default to 42
Gerekli ('b' parametresi için varsayılan değer tanımlanmadı):
def func2(a, *, b):
...
func2(value_for_a, b=21) # b is set to 21 by the function call
func2(value_for_a) # ERROR: missing 1 required keyword-only argument: 'b'`
Bu, özellikle aynı türdeyse, yan yana birçok benzer bağımsız değişkenin olduğu durumlarda yardımcı olabilir, bu durumda adlandırılmış bağımsız değişkenler kullanmayı tercih ederim veya bağımsız değişkenler bir aradaysa özel bir sınıf oluştururum.
Kimse bu *args
ve **kwargs
( bu siteden ) kullanarak sinsi şeyler yapmak için konum ve anahtar kelime argümanları karıştırabilirsiniz gerçeğinden bahsetmedi şaşırdım :
def test_var_kwargs(farg, **kwargs):
print "formal arg:", farg
for key in kwargs:
print "another keyword arg: %s: %s" % (key, kwargs[key])
Bu, önceden tanımlamak istemediğiniz anahtarlara sahip olabilecek rastgele anahtar kelime bağımsız değişkenlerini kullanmanızı sağlar.
Tip ek açıklama kullanarak varsayılan kwargs vardı bir örnek arıyordum:
def test_var_kwarg(a: str, b: str='B', c: str='', **kwargs) -> str:
return ' '.join([a, b, c, str(kwargs)])
misal:
>>> print(test_var_kwarg('A', c='okay'))
A B okay {}
>>> d = {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', c='c', b='b', **d))
a b c {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', 'b', 'c'))
a b c {}
İşlevi çağırırken anahtar sözcüklerde atanmamış olan bağımsız değişkenlerin varsayılan değerini tanımlamak için bir yol ekleyin / ekleyin :
def func(**keywargs):
if 'my_word' not in keywargs:
word = 'default_msg'
else:
word = keywargs['my_word']
return word
bunu şu adla ara:
print(func())
print(func(my_word='love'))
alacaksınız:
default_msg
love
python hakkında *args
ve **kwargs
python hakkında daha fazla bilgi edinin : https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3