Jadual Kandungan
Mentakrifkan dan menghantar parameter
Apakah perbezaan antara parameter dan argumen
Dua cara untuk lulus parameter
Parameter fungsi
1. Cara mendapatkan semua parameter kedudukan yang tidak ditangkap
2. Bagaimana untuk mendapatkan semua hujah kata kunci yang tidak ditangkap
3. Jika anda mahu menerima parameter kata kunci sahaja, cara mereka bentuk
4. Cara mereka bentuk fungsi yang hanya menerima parameter kedudukan
5. Mixing and matching
6. Akhir sekali letakkan mereka bersama
Ringkasan
Rumah pembangunan bahagian belakang Tutorial Python Kaedah lulus parameter fungsi dalam Python *args, **kwargs, dan lain-lain

Kaedah lulus parameter fungsi dalam Python *args, **kwargs, dan lain-lain

Apr 13, 2023 am 09:58 AM
python Lulus parameter

Artikel ini akan membincangkan parameter fungsi Python. Kami akan memahami apa itu args dan **kwargs, / dan Walaupun soalan ini adalah soalan ular sawa asas, ia akan sering ditemui apabila kita menulis kod ini cara lulus parameter.

Kaedah lulus parameter fungsi dalam Python *args, **kwargs, dan lain-lain

Mentakrifkan dan menghantar parameter

Apakah perbezaan antara parameter dan argumen

Ramai orang menggunakan istilah ini secara bergantian, tetapi mereka Ada? ialah perbezaan:

  • Parameter ialah nama yang ditakrifkan dalam definisi fungsi
  • Argumen ialah nilai yang dihantar kepada fungsi

Kaedah lulus parameter fungsi dalam Python *args, **kwargs, dan lain-lain

Yang merah ialah parameter dan yang hijau ialah hujah.

Dua cara untuk lulus parameter

Kami boleh lulus parameter mengikut kedudukan dan kata kunci. Dalam contoh berikut, kami menghantar nilai hello sebagai parameter kedudukan. Dunia nilai diluluskan menggunakan kata kunci.

 def the_func(greeting, thing):
 print(greeting + ' ' + thing)
 
 the_func('hello', thing='world')
Salin selepas log masuk

Perbezaan antara parameter kedudukan dan kwarg (argumen kata kunci) ialah susunan parameter kedudukan diluluskan adalah penting. Jika anda memanggil the_func('world', 'hello') ia akan mencetak world hello. Urutan di mana kwarg diluluskan tidak penting:

the_func('hello', 'world')# -> 'hello world'
the_func('world', 'hello')# -> 'world hello'
the_func(greeting='hello', thing='world') # -> 'hello world'
the_func(thing='world', greeting='hello') # -> 'hello world'
the_func('hello', thing='world')# -> 'hello world'
Salin selepas log masuk

Anda boleh mencampur dan memadankan hujah kedudukan dan kata kunci selagi kwarg datang selepas hujah kedudukan, itulah yang kami sering lakukan dalam tutorial python Selepas melihat kandungan, mari teruskan.

Parameter fungsi

Kami akan menunjukkan 6 kaedah menghantar parameter fungsi, yang boleh merangkumi semua masalah.

1. Cara mendapatkan semua parameter kedudukan yang tidak ditangkap

Gunakan *args untuk membiarkannya menerima bilangan parameter formal yang tidak ditentukan.

def multiply(a, b, args):
result = a * b
for arg in args:
result = result * arg
return result
Salin selepas log masuk

Dalam fungsi ini, kita biasanya mentakrifkan dua parameter pertama (a dan b). Kemudian gunakan args untuk mengemas semua argumen yang tinggal ke dalam tuple. Anda boleh menganggap * sebagai mendapatkan parameter lain yang tidak diproses dan mengumpulnya ke dalam pembolehubah tuple bernama "args":

multiply(1, 2)# returns 2
multiply(1, 2, 3, 4)# returns 24
Salin selepas log masuk

Panggilan terakhir akan Nilai 1 diberikan kepada parameter a, 2 diberikan kepada parameter b, dan pembolehubah arg diisi dengan (3,4). Memandangkan ini adalah tuple, kita boleh menggelungkannya dalam fungsi dan mendarab menggunakan nilai

2. Bagaimana untuk mendapatkan semua hujah kata kunci yang tidak ditangkap

Serupa dengan *args, ini diikuti dengan dua asterisk **kwargs

def introduce(firstname, lastname, **kwargs):
introduction = f"I am {firstname} {lastname}"
for key, value in kwargs.items():
introduction += f" my {key} is {value} "
return introduction
Salin selepas log masuk

**kata kunci kwargs akan menyimpan semua hujah kata kunci yang tidak dapat dipadankan dalam kamus yang dipanggil kwargs. Kamus ini kemudiannya boleh diakses seperti fungsi di atas.

 print(introduce(firstname='mike', lastname='huls'))
 # returns "I am mike huls"
 
 print(introduce(firstname='mike', lastname='huls', age=33, website='mikehuls.com'))
 # I am mike huls my age is 33 my website is overfit.cn
Salin selepas log masuk

3. Jika anda mahu menerima parameter kata kunci sahaja, cara mereka bentuk

untuk memaksa fungsi hanya menerima parameter kata kunci.

 def transfer_money(*, from_account:str, to_account:str, amount:int):
 print(f'Transfering ${amount} FORM {from_account} to {to_account}')
 
 transfer_money(from_account='1234', to_account='6578', amount=9999)
 # won't work: TypeError: transfer_money() takes 0 positional arguments but 1 positional argument (and 2 keyword-only arguments) were given
 transfer_money('1234', to_account='6578', amount=9999)
 # won't work: TypeError: transfer_money() takes 0 positional arguments but 3 were given
 transfer_money('1234', '6578', 9999)
Salin selepas log masuk

Dalam fungsi di atas, asterisk * mendapat semua parameter kedudukan yang tidak sepadan, tetapi tiada pembolehubah untuk menerimanya, iaitu, ia diabaikan.

4. Cara mereka bentuk fungsi yang hanya menerima parameter kedudukan

Berikut ialah contoh fungsi yang hanya membenarkan parameter kedudukan:

 def the_func(arg1:str, arg2:str, /):
 print(f'provided {arg1=}, {arg2=}')
 
 # These work:
 the_func('num1', 'num2')
 the_func('num2', 'num1')
 
 # won't work: TypeError: the_func() got some positional-only arguments passed as keyword arguments: 'arg1, arg2'
 the_func(arg1='num1', arg2='num2')
 # won't work: TypeError: the_func() got some positional-only arguments passed as keyword arguments: 'arg2'
 the_func('num1', arg2='num2')
Salin selepas log masuk

The / in definisi fungsi dipaksa sebelum itu Semua parameter adalah parameter kedudukan. Ini tidak bermakna bahawa semua hujah yang mengikuti / mestilah kwarg sahaja; ini boleh menjadi kedudukan dan kata kunci.

Apabila anda melihat ini, anda pasti akan berfikir, mengapa anda mahu ini tidak akan mengurangkan kebolehbacaan kod?, Saya juga fikir anda sangat betul, apabila mentakrifkan fungsi yang sangat jelas, tidak? Argumen kata kunci diperlukan untuk menentukan fungsinya. Contohnya:

def exceeds_100_bytes(x, /) -> bool:
 return x.__sizeof__() > 100
 
 exceeds_100_bytes('a')
 exceeds_100_bytes({'a'})
Salin selepas log masuk

Dalam contoh ini, ia sedang menyemak sama ada saiz memori 'a' melebihi 100 bait. Kerana nama x ini tidak penting kepada kami, tidak perlu untuk menyatakan x='a' apabila memanggil fungsi tersebut. Sebagai contoh, len kami yang paling biasa digunakan, jika anda memanggil len(__obj=[]), adakah ia kelihatan agak bodoh, kerana len ditakrifkan seperti ini def len(__obj: Saiz) -> int:

5. Mixing and matching

Sebagai contoh, kita akan lihat pada fungsi len yang dibincangkan tadi. Fungsi ini hanya membenarkan hujah kedudukan. Kami akan melanjutkan fungsi ini dengan membenarkan pembangun memilih sama ada untuk mengira pendua, seperti menghantar kata kunci ini dengan kwargs:

 def len_new(x, /, *, no_duplicates=False):
 if (no_duplicates):
 return len(list(set([a for a in x])))
 return len(x)
Salin selepas log masuk

Ingin mengira len parameter pembolehubah kerana ia mempunyai / dalam hadapannya. Argumen no_duplicate mesti dihantar dengan kata kunci kerana ia mengikuti . Mari lihat bagaimana fungsi ini boleh dipanggil:

print(len_new('aabbcc'))# returns 6
 print(len_new('aabbcc', no_duplicates=True))# returns 3
 print(len_new([1, 1, 2, 2, 3, 3], no_duplicates=False)) # returns 6
 print(len_new([1, 1, 2, 2, 3, 3], no_duplicates=True))# returns 3
 
 # Won't work: TypeError: len_() got some positional-only arguments passed as keyword arguments: 'x'
 print(len_new(x=[1, 1, 2, 2, 3, 3]))
 # Won't work: TypeError: len_new() takes 1 positional argument but 2 were given
 print(len_new([1, 1, 2, 2, 3, 3], True))
Salin selepas log masuk

6. Akhir sekali letakkan mereka bersama

Fungsi berikut adalah contoh yang sangat melampau tentang cara menggabungkan semua teknik yang dibincangkan sebelum ini: ia memaksa dua hujah pertama diluluskan mengikut kedudukan, dua hujah seterusnya boleh diluluskan mengikut kedudukan, dan dengan kata kunci, dan kemudian dua hujah kata kunci sahaja, yang kemudiannya kami tangkap dengan **kwargs Parameter yang tidak ditangkap yang selebihnya.

 def the_func(pos_only1, pos_only2, /, pos_or_kw1, pos_or_kw2, *, kw1, kw2, **extra_kw):
 # cannot be passed kwarg <-- | --> can be passed 2 ways | --> can only be passed by kwarg
 print(f"{pos_only1=}, {pos_only2=}, {pos_or_kw1=}, {pos_or_kw2=}, {kw1=}, {kw2=}, {extra_kw=}")
Salin selepas log masuk

Kaedah panggilan adalah seperti berikut:

# works (pos_or_kw1 & pow_or_k2 can be passed positionally and by kwarg)
 pos_only1='pos1', pos_only2='pos2', pos_or_kw1='pk1', pos_or_kw2='pk2', kw1='kw1', kw2='kw2', extra_kw={}
 pos_only1='pos1', pos_only2='pos2', pos_or_kw1='pk1', pos_or_kw2='pk2', kw1='kw1', kw2='kw2', extra_kw={}
 pos_only1='pos1', pos_only2='pos2', pos_or_kw1='pk1', pos_or_kw2='pk2', kw1='kw1', kw2='kw2', extra_kw={'kw_extra1': 'extra_kw1'}
 
 # doesnt work, (pos1 and pos2 cannot be passed with kwarg)
 # the_func(pos_only1='pos1', pos_only2='pos2', pos_or_kw1='pk1', pos_or_kw2='pk2', kw1='kw1', kw2='kw2')
 
 # doesnt work, (kw1 and kw2 cannot be passed positionally)
 # the_func('pos1', 'pos2', 'pk1', 'pk2', 'kw1', 'kw2')
Salin selepas log masuk

Ringkasan

Nampak kemas, betul? Kerana Python adalah bahasa yang sangat longgar apabila ia direka, tidak begitu banyak spesifikasi Semakin ramai orang menggunakannya, semakin banyak kaedah yang digunakan, dan ia menjadi seperti ini.

Jadi kembali kepada gambar pertama:

def func(x,/,y,,z,**k):
Salin selepas log masuk

(x,/,y,,z,**k):是函数的参数。总共有四个参数:

  • x: 是一个常规参数,这意味着它可以按位置传递,也可以按关键字传递。
  • /,: 是一个参数分隔符,将仅限位置的参数与其他参数分开。与前面的x结合,意味着x只能按位置传递。
  • y: 时另一个常规参数。
  • *: 是一个参数分隔符,用于分隔仅限位置参数和仅限关键字参数。它意味着后面的z只能通过关键字传递。
  • z: 是一个仅限关键字的参数。
  • **k: 这是一个参数,将所有剩余的关键字参数收集到一个名为' k '的字典中。

这样解释是不是就很明白了。

我们今天介绍的这个例子虽然在看源代码时没有遇到这么复杂的情况,但是在 面试 的时候还真有人问(虽然我觉得没啥用),所以最好还是知道一些,以免尴尬。

如果你忘记了,这里可以教你一个变通的办法,可以使用类似的回答:

上面的参数传递在开发时并不常用,因为对于开发规范来说,应该保证代码的可读性,我们这边遵循的开发规范是:

1、尽量不要在函数定义中将可变位置参数 *args 和可变关键字参数 **kwargs 放在一起,因为这样会让函数的调用方式变得不太直观。

2、在使用可变参数时,要保证函数的行为是可预测的。上面函数中的进行了太多的python语法糖,对于理解该函数的参数会造成很大的困惑,也就是可读性太差,我们在进行codereview(如果你了解什么是codereview就说,不了解就说组长检查)/组长merge代码 时会直接要求返工,所以我们在实际开发时是不会用这个的。

对于我阅读的开源代码,也都基本上使用的是 **kwargs这种情况(这里可以举两个例子),还没有看到有人写这么乱的代码,我想要是写这样的代码估计开源的人也会被人吐糟(这里自己可以自行延伸),所以这些参数传递的规则我在学习的时候看到过,但是实际中没见过真正使用,就不太记住了。

回到本文,我们介绍了设计函数参数的所有方法,并了解了如何混合和匹配它们,虽然后面几个内容可能你一辈子也不会用到,但是了解一下也是好的,因为万一呢。

Atas ialah kandungan terperinci Kaedah lulus parameter fungsi dalam Python *args, **kwargs, dan lain-lain. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

PHP dan Python: Paradigma yang berbeza dijelaskan PHP dan Python: Paradigma yang berbeza dijelaskan Apr 18, 2025 am 12:26 AM

PHP terutamanya pengaturcaraan prosedur, tetapi juga menyokong pengaturcaraan berorientasikan objek (OOP); Python menyokong pelbagai paradigma, termasuk pengaturcaraan OOP, fungsional dan prosedur. PHP sesuai untuk pembangunan web, dan Python sesuai untuk pelbagai aplikasi seperti analisis data dan pembelajaran mesin.

Memilih antara php dan python: panduan Memilih antara php dan python: panduan Apr 18, 2025 am 12:24 AM

PHP sesuai untuk pembangunan web dan prototaip pesat, dan Python sesuai untuk sains data dan pembelajaran mesin. 1.Php digunakan untuk pembangunan web dinamik, dengan sintaks mudah dan sesuai untuk pembangunan pesat. 2. Python mempunyai sintaks ringkas, sesuai untuk pelbagai bidang, dan mempunyai ekosistem perpustakaan yang kuat.

Python vs JavaScript: Keluk Pembelajaran dan Kemudahan Penggunaan Python vs JavaScript: Keluk Pembelajaran dan Kemudahan Penggunaan Apr 16, 2025 am 12:12 AM

Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Cara menjalankan program di terminal vscode Cara menjalankan program di terminal vscode Apr 15, 2025 pm 06:42 PM

Dalam kod VS, anda boleh menjalankan program di terminal melalui langkah -langkah berikut: Sediakan kod dan buka terminal bersepadu untuk memastikan bahawa direktori kod selaras dengan direktori kerja terminal. Pilih arahan Run mengikut bahasa pengaturcaraan (seperti python python your_file_name.py) untuk memeriksa sama ada ia berjalan dengan jayanya dan menyelesaikan kesilapan. Gunakan debugger untuk meningkatkan kecekapan debug.

Boleh kod vs dijalankan di Windows 8 Boleh kod vs dijalankan di Windows 8 Apr 15, 2025 pm 07:24 PM

Kod VS boleh dijalankan pada Windows 8, tetapi pengalaman mungkin tidak hebat. Mula -mula pastikan sistem telah dikemas kini ke patch terkini, kemudian muat turun pakej pemasangan kod VS yang sepadan dengan seni bina sistem dan pasangnya seperti yang diminta. Selepas pemasangan, sedar bahawa beberapa sambungan mungkin tidak sesuai dengan Windows 8 dan perlu mencari sambungan alternatif atau menggunakan sistem Windows yang lebih baru dalam mesin maya. Pasang sambungan yang diperlukan untuk memeriksa sama ada ia berfungsi dengan betul. Walaupun kod VS boleh dilaksanakan pada Windows 8, disyorkan untuk menaik taraf ke sistem Windows yang lebih baru untuk pengalaman dan keselamatan pembangunan yang lebih baik.

PHP dan Python: menyelam mendalam ke dalam sejarah mereka PHP dan Python: menyelam mendalam ke dalam sejarah mereka Apr 18, 2025 am 12:25 AM

PHP berasal pada tahun 1994 dan dibangunkan oleh Rasmuslerdorf. Ia pada asalnya digunakan untuk mengesan pelawat laman web dan secara beransur-ansur berkembang menjadi bahasa skrip sisi pelayan dan digunakan secara meluas dalam pembangunan web. Python telah dibangunkan oleh Guidovan Rossum pada akhir 1980 -an dan pertama kali dikeluarkan pada tahun 1991. Ia menekankan kebolehbacaan dan kesederhanaan kod, dan sesuai untuk pengkomputeran saintifik, analisis data dan bidang lain.

Adakah sambungan vscode berniat jahat? Adakah sambungan vscode berniat jahat? Apr 15, 2025 pm 07:57 PM

Sambungan kod VS menimbulkan risiko yang berniat jahat, seperti menyembunyikan kod jahat, mengeksploitasi kelemahan, dan melancap sebagai sambungan yang sah. Kaedah untuk mengenal pasti sambungan yang berniat jahat termasuk: memeriksa penerbit, membaca komen, memeriksa kod, dan memasang dengan berhati -hati. Langkah -langkah keselamatan juga termasuk: kesedaran keselamatan, tabiat yang baik, kemas kini tetap dan perisian antivirus.

Bolehkah kod studio visual digunakan dalam python Bolehkah kod studio visual digunakan dalam python Apr 15, 2025 pm 08:18 PM

Kod VS boleh digunakan untuk menulis Python dan menyediakan banyak ciri yang menjadikannya alat yang ideal untuk membangunkan aplikasi python. Ia membolehkan pengguna untuk: memasang sambungan python untuk mendapatkan fungsi seperti penyempurnaan kod, penonjolan sintaks, dan debugging. Gunakan debugger untuk mengesan kod langkah demi langkah, cari dan selesaikan kesilapan. Mengintegrasikan Git untuk Kawalan Versi. Gunakan alat pemformatan kod untuk mengekalkan konsistensi kod. Gunakan alat linting untuk melihat masalah yang berpotensi lebih awal.

See all articles