class a(object):
data={'a':'aaa','b':'bbb','c':'ccc'}
def pop(self, key, *args):
return self.data.pop(key, *args)#what is this mean.
b=a()
print b.pop('a',{'b':'bbb'})
print b.data
self.data.pop(key, *args)
← ------ mengapa ada argumen kedua?
python
dictionary
zjm1126
sumber
sumber
help(b.data.pop)
di REPL.Jawaban:
The
pop
metode dicts (sepertiself.data
, yaitu{'a':'aaa','b':'bbb','c':'ccc'}
, di sini) membutuhkan dua argumen - lihat dokumentasiArgumen kedua
default
,, adalah apa yangpop
dikembalikan jika argumen pertamakey
,, tidak ada. (Jika Anda memanggilpop
hanya dengan satu argumenkey
,, ini menimbulkan pengecualian jika kunci itu tidak ada).Dalam contoh Anda
print b.pop('a',{'b':'bbb'})
, ini tidak relevan karena'a'
merupakan kuncinyab.data
. Tetapi jika Anda mengulangi baris itu ...:b=a() print b.pop('a',{'b':'bbb'}) print b.pop('a',{'b':'bbb'}) print b.data
Anda akan melihat hal itu membuat perbedaan: pertama
pop
menghilangkan'a'
kunci, sehingga di keduapop
tersebutdefault
argumen benar-benar kembali (karena'a'
sekarang absen darib.data
).sumber
pop
elemendict
tetapi tetap mempertahankan nilai elemen yang muncul. Jadi,dict.pop(key)
menghapuskey
bersama - sama dengan yang terkaitvalue
tetapi juga mengembalikanvalue
darikey
yang baru saja dihapus. Saya merasa berguna ...pop()
- perilaku umum di lebih banyak bahasa seperti JavaScript, PHP, Java, meskipun tidak semua bahasa melakukannya - misalnya C ++.Begitu banyak pertanyaan di sini. Saya melihat setidaknya dua, mungkin tiga:
*args
digunakan?Pertanyaan pertama dijawab dengan mudah dalam referensi Python Standard Library :
Pertanyaan kedua tercakup dalam Referensi Bahasa Python :
Dengan kata lain,
pop
fungsi tersebut membutuhkan setidaknya dua argumen. Dua yang pertama diberi namaself
dankey
; dan sisanya dimasukkan ke dalam tupel yang disebutargs
.Apa yang terjadi di baris berikutnya ketika
*args
diteruskan dalam panggilan keself.data.pop
adalah kebalikan dari ini - tupel*args
diperluas ke parameter posisi yang diteruskan. Ini dijelaskan dalam Referensi Bahasa Python :Singkatnya,
a.pop()
ingin fleksibel dan menerima sejumlah parameter posisi, sehingga dapat meneruskan sejumlah parameter posisi yang tidak diketahui ini keself.data.pop()
.Ini memberi Anda fleksibilitas;
data
kebetulan menjadi adict
sekarang, dan dengan demikianself.data.pop()
mengambil salah satu atau dua parameter; tetapi jika Anda berubahdata
menjadi tipe yang mengambil 19 parameter untuk panggilan,self.data.pop()
Anda tidak perlu mengubah kelasa
sama sekali. Anda masih harus mengubah kode apa pun yang dipanggila.pop()
untuk melewati 19 parameter yang diperlukan.sumber
def func(*args): pass
Saat Anda mendefinisikan fungsi dengan cara ini,
*args
akan ada larik argumen yang diteruskan ke fungsi tersebut. Ini memungkinkan fungsi Anda bekerja tanpa mengetahui sebelumnya berapa banyak argumen yang akan diteruskan ke sana.Anda melakukan ini dengan argumen kata kunci juga, menggunakan
**kwargs
:def func2(**kwargs): pass
Lihat: Daftar argumen arbitrer
Dalam kasus Anda, Anda telah menentukan kelas yang bertindak seperti kamus. The
dict.pop
Metode didefinisikan sebagaipop(key[, default])
.Metode Anda tidak menggunakan
default
parameter. Namun, dengan mendefinisikan metode Anda dengan*args
dan meneruskan*args
kedict.pop()
, Anda mengizinkan pemanggil untuk menggunakandefault
parameter.Dengan kata lain, Anda harus bisa menggunakan
pop
metode kelas Anda sepertidict.pop
:my_a = a() value1 = my_a.pop('key1') # throw an exception if key1 isn't in the dict value2 = my_a.pop('key2', None) # return None if key2 isn't in the dict
sumber
>>> def func(a, *args, **kwargs): ... print 'a %s, args %s, kwargs %s' % (a, args, kwargs) ... >>> func('one', 'two', 'three', four='four', five='five') a one, args ('two', 'three'), kwargs {'four': 'four', 'five': 'five'}
>>> def anotherfunct(beta, *args): ... print 'beta %s, args %s' % (beta, args) ... >>> def func(a, *args, **kwargs): ... anotherfunct(a, *args) ... >>> func('one', 'two', 'three', four='four', five='five') beta one, args ('two', 'three') >>>
sumber