parameter fungsi

1. Parameter nilai lalai

Kadangkala, dalam fungsi tersuai kami, jika tiada parameter ditetapkan semasa membuat panggilan, kami perlu memberikan nilai lalai pada masa ini, kami perlu menggunakan parameter nilai lalai.

# -*- coding: UTF-8 -*-
def print_user_info( name , age , sex = '男' ):
    # 打印用户信息
    print('昵称:{}'.format(name) , end = ' ')
    print('年龄:{}'.format(age) , end = ' ')
    print('性别:{}'.format(sex))
    return;
# 调用 print_user_info 函数
print_user_info( '两点水' , 18 , '女')
print_user_info( '三点水' , 25 )

Hasil keluaran:

昵称:两点水 年龄:18 性别:女
昵称:三点水 年龄:25 性别:男

Anda boleh melihat bahawa apabila anda menetapkan parameter lalai, apabila memanggil fungsi, jika anda tidak melepasi parameter, nilai lalai akan digunakan. Tetapi satu perkara yang perlu diperhatikan di sini ialah: hanya parameter di penghujung senarai parameter formal boleh mempunyai nilai parameter lalai, maksudnya, apabila mengisytiharkan parameter fungsi, anda tidak boleh terlebih dahulu mengisytiharkan parameter dengan nilai lalai dan kemudian mengisytiharkan parameter tanpa. nilai lalai. Ini kerana nilai yang diberikan kepada parameter formal ditetapkan mengikut kedudukan. Sebagai contoh, def func(a, b=1) adalah sah, tetapi def func(a=1, b) adalah tidak sah.

Adakah ini penghujung parameter nilai lalai? Belum lagi, fikirkan dengan teliti, jika parameter adalah bekas yang boleh diubah suai seperti lsit (senarai) atau dict (kamus), maka apakah yang harus kita gunakan sebagai nilai lalai? Kita boleh menggunakan Tiada sebagai nilai lalai. Sama seperti contoh berikut:

# 如果 b 是一个 list ,可以使用 None 作为默认值
def print_info( a , b = None ):
    if b is None :
        b=[]
    return;

Lihat contoh dengan teliti Adakah anda mempunyai sebarang soalan seperti itu? Tidak bolehkah kita menggunakan b=[] terus dalam parameter? Iaitu, ia akan ditulis seperti ini:

def print_info( a , b = [] ):
    return;

, bukan? Tiada ralat ditemui selepas menjalankannya. Bolehkah saya menulisnya seperti ini? Satu perkara yang memerlukan perhatian khusus di sini: nilai parameter lalai ialah objek tidak boleh diubah, seperti Tiada, Benar, Salah, nombor atau rentetan Jika anda beroperasi seperti di atas, anda akan menghadapi masalah apabila nilai lalai diubah ke tempat lain segala macam kesusahan. Perubahan ini akan menjejaskan nilai lalai apabila fungsi ini dipanggil seterusnya.

Contohnya adalah seperti berikut:

# -*- coding: UTF-8 -*-
def print_info( a , b = [] ):
    print(b)
    return b ;
result = print_info(1)
result.append('error')
print_info(2)

Hasil keluaran:

[]
['error']

Perhatikan dengan teliti, anda akan mendapati bahawa nilai keluaran kali kedua bukanlah seperti yang anda mahukan sama sekali, jadi jangan lakukan ini.

Seperkara lagi, kadangkala saya tidak mahu nilai lalai saya hanya mahu menilai sama ada parameter lalai mempunyai nilai yang diluluskan. Apakah yang perlu saya lakukan? Kita boleh melakukan ini:

_no_value =object()
def print_info( a , b = _no_value ):
    if b is _no_value :
        print('b 没有赋值')
    return;

objek di sini ialah kelas asas untuk semua kelas dalam python. Anda boleh mencipta contoh kelas objek, tetapi kejadian ini tidak berguna kerana ia tidak mempunyai sebarang kaedah berguna, mahupun data contoh (kerana ia tidak mempunyai sebarang kamus contoh, anda tidak boleh menetapkan sebarang sifat nilai). Satu-satunya perkara yang boleh anda lakukan ialah menguji identiti. Ciri ini juga boleh digunakan untuk menentukan sama ada terdapat input nilai.

2. Parameter kata kunci

Dalam Python, anda boleh menghantar parameter ke fungsi melalui nama parameter tanpa mengambil berat tentang susunan senarai parameter ditakrifkan Ini dipanggil parameter kata kunci. Terdapat dua kelebihan menggunakan parameter utama:

Pertama, kerana kita tidak perlu risau tentang susunan parameter, penggunaan fungsi menjadi lebih mudah.

2. Dengan mengandaikan bahawa parameter lain mempunyai nilai lalai, kami hanya boleh menetapkan nilai kepada parameter yang kami mahukan

# -*- coding: UTF-8 -*-
def print_user_info( name ,  age  , sex = '男' ):
    # 打印用户信息
    print('昵称:{}'.format(name) , end = ' ')
    print('年龄:{}'.format(age) , end = ' ')
    print('性别:{}'.format(sex))
    return;
# 调用 print_user_info 函数
print_user_info( name = '两点水' ,age = 18 , sex = '女')
print_user_info( name = '两点水' ,sex = '女', age = 18 )

Nilai output:

昵称:两点水 年龄:18 性别:女
昵称:两点水 年龄:18 性别:女

3

Kadangkala apabila kami mereka bentuk antara muka fungsi, kami mungkin memerlukan parameter panjang berubah-ubah. Dalam erti kata lain, kita tidak boleh menentukan bilangan parameter yang diluluskan terlebih dahulu. Python menyediakan kaedah tuple untuk menerima parameter yang tidak ditakrifkan secara langsung. Kaedah ini menambah asterisk * di hadapan parameter. Jika tiada parameter dinyatakan apabila fungsi dipanggil, ia adalah tuple kosong. Kita juga tidak boleh menghantar pembolehubah yang tidak dinamakan kepada fungsi tersebut.

Contohnya:

# -*- coding: UTF-8 -*-
def print_user_info( name ,  age  , sex = '男' , * hobby):
    # 打印用户信息
    print('昵称:{}'.format(name) , end = ' ')
    print('年龄:{}'.format(age) , end = ' ')
    print('性别:{}'.format(sex) ,end = ' ' )
    print('爱好:{}'.format(hobby))
    return;
# 调用 print_user_info 函数
print_user_info( '两点水' ,18 , '女', '打篮球','打羽毛球','跑步')

Hasil keluaran:

昵称:两点水 年龄:18 性别:女 爱好:('打篮球', '打羽毛球', '跑步')

Anda boleh tahu daripada hasil keluaran bahawa *hobi ialah parameter berubah, dan hobi sebenarnya adalah tuple (nenek moyang asal)

Parameter panjang boleh ubah juga menyokong parameter utama dan tidak Parameter utama yang ditentukan akan diletakkan dalam kamus. Kaedah ini adalah untuk menambah ** di hadapan parameter, dan menukar contoh di atas seperti berikut:

# -*- coding: UTF-8 -*-
def print_user_info( name ,  age  , sex = '男' , ** hobby ):
    # 打印用户信息
    print('昵称:{}'.format(name) , end = ' ')
    print('年龄:{}'.format(age) , end = ' ')
    print('性别:{}'.format(sex) ,end = ' ' )
    print('爱好:{}'.format(hobby))
    return;
# 调用 print_user_info 函数
print_user_info( name = '两点水' , age = 18 , sex = '女', hobby = ('打篮球','打羽毛球','跑步'))

Hasil output:

昵称:两点水 年龄:18 性别:女 爱好:{'hobby': ('打篮球', '打羽毛球', '跑步')}

Dengan membandingkan contoh di atas dan contoh ini, kita boleh tahu bahawa *hobi ialah parameter berubah-ubah , dan hobi sebenarnya Ia adalah tuple (nenek moyang asal), **hobi ialah parameter kata kunci, dan hobi ialah dict (kamus)

4 Hanya terima parameter kata kunci

Parameter kata kunci mudah digunakan dan mudah digunakan. tidak terdedah kepada ralat parameter, jadi sesetengah Kadang-kadang, fungsi yang kami takrifkan berharap parameter tertentu mesti diluluskan menggunakan parameter kata kunci Apakah yang perlu kami lakukan pada masa ini?

Kesan ini boleh dicapai dengan meletakkan parameter kata kunci mandatori selepas parameter * atau satu *, seperti:

# -*- coding: UTF-8 -*-
def print_user_info( name , *, age  , sex = '男' ):
    # 打印用户信息
    print('昵称:{}'.format(name) , end = ' ')
    print('年龄:{}'.format(age) , end = ' ')
    print('性别:{}'.format(sex))
    return;
# 调用 print_user_info 函数
print_user_info( name = '两点水' ,age = 18 , sex = '女' )
# 这种写法会报错,因为 age ,sex 这两个参数强制使用关键字参数
#print_user_info( '两点水' , 18 , '女' )
print_user_info('两点水',age='22',sex='男')

Seperti yang anda boleh lihat daripada contoh, jika parameter kata kunci umur dan jantina tidak berkenaan, ralat akan dilaporkan.

Dalam banyak kes, menggunakan parameter kata kunci mandatori akan menjadikan maksud lebih jelas daripada menggunakan parameter kedudukan dan program akan lebih mudah dibaca. Menggunakan parameter kata kunci mandatori juga lebih baik daripada menggunakan **parameter kw dan parameter kata kunci mandatori juga berguna dalam beberapa situasi yang lebih lanjut.

Meneruskan pembelajaran
  • Cadangan kursus
  • Muat turun perisian kursus