在程序設計中,函數(shù)或類的方法可以實現(xiàn)代碼的復用,方便代碼的維護和實現(xiàn)模塊化編程。
Python中在各個模塊中內(nèi)置了大量的函數(shù)可以幫助我們實現(xiàn)很多工作。在實際程序設計中,我們也可以把多次重用的代碼以函數(shù)的方式在程序多個地方進行調(diào)用。這就需要程序提供一種自定義函數(shù)的功能。
在Python中使用 def 關(guān)鍵字來定義一個函數(shù):
def 函數(shù)名稱(參數(shù)列表):
函數(shù)語句
即一個python函數(shù)使用def 來定義,后面緊跟函數(shù)的名稱。函數(shù)的參數(shù)放在英文半角的小括號中,Python函數(shù)可以有參數(shù),也可以沒有參數(shù)。在函數(shù)體中可以有1到多條語句,但Python的函數(shù)體不能沒有語句,如果暫時只是定義一個函數(shù)名稱,想在今后來實現(xiàn)它,可以使用pass語句。要注意Python函數(shù)的語法格式中,小括號后面要有一個英文半角的冒號,且函數(shù)體要進行縮進,在Python中使用縮進來表示語句的層級關(guān)系,讀者可以查看本站的文章《編寫第一個Python程序》中最后一段的說明。
下面舉例說明Python中定義函數(shù)的方法與調(diào)用方法。
def hello():
print("Hello,武林網(wǎng)VEVB")
def sum(x, y):
return x + y
hello() # 調(diào)用
# sum函數(shù)的參數(shù)直接給參數(shù)賦值
he = sum(10,20)
print(he)
# sum函數(shù)通過變量給參數(shù)賦值
a , b = 10, 20
print(sum(a, b))
上面定義了一個無參的函數(shù)hello和一個包含兩個參數(shù)的函數(shù)sum。hello()參數(shù)的作用是向控制臺輸出一行字符串。sum()函數(shù)的作用是返回兩個參數(shù)的和。
運行結(jié)果:
Hello,武林網(wǎng)VEVB
30
30
Python允許給函數(shù)的參數(shù)定義默認值,當調(diào)用函數(shù)時,若定義了默認值的參數(shù)沒有給傳值,則使用默認值。
def hello(nickname = '游客'):
print("您好:", nickname)
#調(diào)用時沒有給參數(shù),則使用默認值
hello()
#調(diào)用時給了參數(shù),則使用參數(shù)指定的值
hello('武林網(wǎng)VEVB')
輸出結(jié)果:
您好: 游客
您好: 武林網(wǎng)VEVB
在Python中參數(shù)的默認值必須位于所有未指定默認值參數(shù)的后邊,下面兩個函數(shù)的定義形式都是錯誤的:
# 錯誤的參數(shù)默認值,沒有默認值的參數(shù)不能位于有默認值參數(shù)的后面
def sum1(x = 1, y):
return x + y
def sum2(x, y = 1, z):
return x + y + z
上面兩個函數(shù)的定義會給出如下錯誤:
non-default argument follows default argument
也就是:非默認值參數(shù)位于默認值參數(shù)的后面。也就是說在Python中,非默認值參數(shù)不能位于有默認值參數(shù)的后面。
下面的形式是正確的:
def sum1(x, y = 1):
return x + y
def sum2(x, y, z = 1):
return x + y + z
在給帶默認值的函數(shù)賦值時,傳遞的參數(shù)個數(shù)不能少于沒有默認值參數(shù)的個數(shù),如果函數(shù)中有多個默認值,且賦值時只想給某個帶默認值的參數(shù)賦值時,可以使用 參數(shù)名 = 值 的方式進行賦值,如下例所示:
def sum3(w, x, y = 0, z = 0):
return w + x + y + z
sum = sum3(1, 2, z = 4)
print(sum)
上面這個例子在調(diào)用函數(shù)時,1 和 2 分別給了參數(shù)w和x,z = 4指定參數(shù)z的值是4,而y使用默認值0;如果調(diào)用時使用 sum3(1, 2, 4),則函數(shù)會把1, 2和4分別給了w,x和y,而z使用默認值0.
空函數(shù)指函數(shù)本身只有定義,但函數(shù)沒有具體的語句,什么也不做。由于Python不允許函數(shù)體為空的情況出現(xiàn),所以需要借助pass語句來實現(xiàn)。這與其它語言不一樣。
def myfun():
pass
上面這個例子就定義了一個空函數(shù),當調(diào)用這個函數(shù)時,函數(shù)什么也不會做。這在實際中非常有用,比如有時我們知道程序中需要這個函數(shù)來處理一些事情,但具體算法還不清楚時,可以暫時這樣定義,等對算法本身有足夠認識時再給出函數(shù)的具體語句。
迭代函數(shù)指在函數(shù)體中調(diào)用自身的情況。這在許多算法中都非常有用,下面給出兩個例子來說明具體的實現(xiàn)方法:
1、編寫一個函數(shù)求 n!.
n!= n × (n-1) × (n-2) × ... × 2 × 1 = n × (n-1)!
如:5! = 5×4×3×2×1 = 120
實際上,這可以通過定義迭代函數(shù)來實現(xiàn)。
5! = 5×4!4! = 4×3!3! = 3×2!2! = 2×1!1! = 1
也就是說,要求5!,只需求5×4!,這里4!未知,則進一步求4!,以此類推,當推到1!時,1!=1,在一步一步將結(jié)果帶到上面的式子中,最終可以求出5!,即是一個往下推和回溯的過程。
具體實現(xiàn)代碼:
def fac(n):
if n == 0 or n == 1:
return 1
else:
return n * fac(n - 1)
n = 5
res = fac(n)
print(f'{n}! = {res}')
輸出結(jié)果:
5! = 120
2、求斐波那契數(shù)列的第n項的值
關(guān)于斐波那契數(shù)列,本站在前面有相關(guān)介紹,讀者可以參照這篇文章《python使用while循環(huán)輸出斐波那契數(shù)列》。
下面這個例子僅給出輸出第n項的代碼:
def fib(n):
if n == 0 or n == 1:
return 1
else:
return fib(n - 2) + fib(n - 1)
n = 20
iv = fib(n)
print(f'Fibonacci數(shù)列第{n}項的值是{iv}')
輸出結(jié)果:
Fibonacci數(shù)列第20項的值是10946
在Python中定義在類中的函數(shù)一般稱作方法(method),方法在調(diào)用時使用如下格式:
對象名.方法名(參數(shù)列表)
而非類中定義的才叫做函數(shù)(function),他們定義的形式是完全相同的,只不過調(diào)用形式有所不同。
本站前面講的很多字符串函數(shù)實際上屬于字符串類的方法。
本文(完)
|
新聞熱點
疑難解答