Aku harus pergi dengan Tuan Lott untuk yang ini. Anda dapat dengan cepat mendapatkan jawaban otoritatif yang satu ini di Python docs, plus Anda akan merasakan apa lagi yang ada di docs. Adalah bermanfaat bagi Anda untuk mengenal dokumen-dokumen itu jika Anda berencana untuk bekerja dengan Python.
Iya. Anda dapat menggunakan *argssebagai argumen non-kata kunci . Anda kemudian dapat melewati sejumlah argumen.
def manyArgs(*arg):print"I was called with", len(arg),"arguments:", arg
>>> manyArgs(1)
I was called with1 arguments:(1,)>>> manyArgs(1,2,3)
I was called with3 arguments:(1,2,3)
Seperti yang Anda lihat, Python akan membongkar argumen sebagai satu tupel dengan semua argumen.
Untuk argumen kata kunci, Anda harus menerimanya sebagai argumen aktual yang terpisah, seperti yang ditunjukkan dalam jawaban Skurmedel .
Juga penting ... seseorang mungkin menemukan waktu ketika mereka harus memberikan sejumlah argumen ke suatu fungsi. Dalam kasus seperti ini panggil "manyArgs" Anda dengan membuat daftar yang disebut "args" dan meneruskannya ke manyArgs seperti ini "manyArgs (* args)"
wilbbe01
4
Ini dekat, tetapi sayangnya ini tidak cukup umum: manyArgs(x = 3)gagal dengan TypeError. Jawaban Skumedel menunjukkan solusi untuk ini. Poin kuncinya adalah bahwa tanda tangan umum suatu fungsi adalah f(*list_args, **keyword_args)(bukan f(*list_args)).
Tidak yakin bagaimana Anda membuat myfunc (abc = 123, def = 456) berfungsi, tetapi di milik saya (2.7), 'def' tidak dapat dilewati dalam fungsi ini tanpa mendapatkan SyntaxError. Saya berasumsi ini karena def memiliki arti dalam python. Coba myfunc (abc = 123, fgh = 567) sebagai gantinya. (Kalau tidak, jawaban yang bagus dan terima kasih untuk itu!)
Dannid
@Dannid: Tidak tahu juga haha ... tidak bekerja pada 2.6 atau 3.2. Saya akan mengganti nama itu.
Skurmedel
Ketika Anda mengatakan 'dipanggil dalam urutan itu', apakah maksud Anda lulus dalam urutan itu? Atau sesuatu yang lain?
Nikhil Prabhu
1
@NikhilPrabhu: Ya. Argumen kata kunci harus menjadi yang terakhir saat Anda menyebutnya. Mereka selalu datang terakhir jika Anda memiliki argumen non-kata kunci dalam panggilan juga.
Skurmedel
2
Untuk Python 3: Hanya tukar print adengan print(a), dan kwargs.iteritems():dengan kwargs.items().
MasterControlProgram
22
Kalau boleh, kode Skurmedel adalah untuk python 2; untuk beradaptasi untuk python 3, perubahan iteritemske itemsdan menambahkan kurung untuk print. Itu bisa mencegah pemula seperti saya untuk bertabrakan:
AttributeError: 'dict' object has no attribute 'iteritems'dan mencari di tempat lain (misalnya objek "dict 'Kesalahan tidak memiliki atribut' iteritems '" ketika mencoba menggunakan write_shp () ) dari NetworkX mengapa hal ini terjadi.
Kadang-kadang Anda tidak ingin menentukan jumlah argumen dan ingin menggunakan kunci untuk mereka (kompiler akan mengeluh jika satu argumen yang dilewatkan dalam kamus tidak digunakan dalam metode ini).
def manyArgs1(args):print args.a, args.b #note args.c is not used heredef manyArgs2(args):print args.c #note args.b and .c are not used hereclassArgs:pass
args =Args()
args.a =1
args.b =2
args.c =3
manyArgs1(args)#outputs 1 2
manyArgs2(args)#outputs 3
Maka Anda dapat melakukan hal-hal seperti
myfuns =[manyArgs1, manyArgs2]for fun in myfuns:
fun(args)
Ini kode yang mengerikan. Jauh lebih baik adalah:f = lambda **dic: ' '.join(dic.get(key, 'None') for key in 'abc')
metaperture
0
Cara lain untuk melakukannya, selain jawaban yang bagus yang telah disebutkan, tergantung pada fakta bahwa Anda dapat memberikan argumen opsional berdasarkan posisi. Sebagai contoh,
Jawaban:
Iya. Anda dapat menggunakan
*args
sebagai argumen non-kata kunci . Anda kemudian dapat melewati sejumlah argumen.Seperti yang Anda lihat, Python akan membongkar argumen sebagai satu tupel dengan semua argumen.
Untuk argumen kata kunci, Anda harus menerimanya sebagai argumen aktual yang terpisah, seperti yang ditunjukkan dalam jawaban Skurmedel .
sumber
manyArgs(x = 3)
gagal denganTypeError
. Jawaban Skumedel menunjukkan solusi untuk ini. Poin kuncinya adalah bahwa tanda tangan umum suatu fungsi adalahf(*list_args, **keyword_args)
(bukanf(*list_args)
).args
adalahtuple
.kwargs
berarti args kata kunci . Jenisnyakwargs
adalahdictionary
.for arg in args:
untuk mengulangi argumen yang sudah lewatMenambahkan ke unwinds postingan:
Anda juga dapat mengirim beberapa argumen nilai kunci.
Dan Anda dapat mencampur keduanya:
Keduanya harus dideklarasikan dan dipanggil dalam urutan itu, yaitu fungsi tanda tangan harus * args, ** kwargs, dan dipanggil dalam urutan itu.
sumber
print a
denganprint(a)
, dankwargs.iteritems():
dengankwargs.items()
.Kalau boleh, kode Skurmedel adalah untuk python 2; untuk beradaptasi untuk python 3, perubahan
iteritems
keitems
dan menambahkan kurung untukprint
. Itu bisa mencegah pemula seperti saya untuk bertabrakan:AttributeError: 'dict' object has no attribute 'iteritems'
dan mencari di tempat lain (misalnya objek "dict 'Kesalahan tidak memiliki atribut' iteritems '" ketika mencoba menggunakan write_shp () ) dari NetworkX mengapa hal ini terjadi.dan:
sumber
Menambahkan ke pos luar biasa lainnya.
Kadang-kadang Anda tidak ingin menentukan jumlah argumen dan ingin menggunakan kunci untuk mereka (kompiler akan mengeluh jika satu argumen yang dilewatkan dalam kamus tidak digunakan dalam metode ini).
Maka Anda dapat melakukan hal-hal seperti
sumber
kode di atas akan ditampilkan
Ini sama baiknya dengan melewatkan argumen variabel melalui kamus
sumber
f = lambda **dic: ' '.join(dic.get(key, 'None') for key in 'abc')
Cara lain untuk melakukannya, selain jawaban yang bagus yang telah disebutkan, tergantung pada fakta bahwa Anda dapat memberikan argumen opsional berdasarkan posisi. Sebagai contoh,
Hasil
sumber