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