Python函數
- 函數是最基本的一種代碼抽象的方式。
- Python內置了很多有用的函數,我們可以直接調用。
- 函數的優點就是簡化編程,我們將公共的代碼邏輯聲明在函數中,例:要求用戶從Cosole臺輸入用戶信息的時候 input()
- 函數的特徵:能完成某種操作
- 要調用一個函數,需要知道函數的名稱和參數,比如求絕對值的函數ads(),只有一個參數。可以直接從python的官方查看文檔:http://docs.python.org/3/library/functions.html#abs
- 也可以再交互式命令行通過help(abs)查看abs函數的幫助信息。
#調用abs函數:
>>> abs(100)
100
>>> abs(-20)
20
>>> abs(12.34)
12.34
#調用函數的時候,如果傳入的參數數量不對,會報TypeError的錯誤,並且Python會明確地告訴你:abs()有且僅有1個參數,但給出了兩個:
>>> abs(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: abs() takes exactly one argument (2 given)
#如果傳入的參數數量是對的,但參數類型不能被函數所接受,也會報TypeError的錯誤,並且給出錯誤信息:str是錯誤的參數類型:
>>> abs('a')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'str'
#而max函數max()可以接收任意多個參數,並返回最大的那個:
>>> max(1, 2)
2
>>> max(2, 3, 1, -5)
3
數據類型轉換
#Python內置的常用函數還包括數據類型轉換函數,比如int()函數可以把其他數據類型轉換爲整數:
>>> int('123')
123
>>> int(12.34)
12
>>> float('12.34')
12.34
>>> str(1.23)
'1.23'
>>> str(100)
'100'
>>> bool(1)
True
>>> bool('')
False
#函數名其實就是指向一個函數對象的引用,完全可以把函數名賦給一個變量,相當於給這個函數起了一個“別名”:
>>> a = abs # 變量a指向abs函數
>>> a(-1) # 所以也可以通過a調用abs函數
1
#在Python中,定義一個函數要使用def語句,依次寫出函數名、括號、括號中的參數和冒號:,然後,在縮進塊中編寫函數體,函數的返回值用return語句返回。
#如何定義函數
# -*- coding: utf-8 -*-
def my_abs(n):
if n >= 0:
return n;
else:
return -n;
#運行調用函數
a=int(input('請輸入要計算的絕對值:'))
print(my_abs(a))
#函數的特點二:函數具有返回值。返回值:運行完函數之後可以接受到的值
#在return字句後的python代碼 雖然不保錯 但也不會執行
def my_abs(n):
if n >= 0:
return n;
print('hiahia')
else:
return -n;
print('hiahia')
空函數
#如果想定義一個什麼事也不做的空函數,可以用pass語句:
def nop():
pass
#pass語句什麼都不做,那有什麼用?實際上pass可以用來作爲佔位符,比如現在還沒想好怎麼寫函數的代碼,就可以先放一個pass,讓代碼能運行起來。
#pass還可以用在其他語句裏,比如:
if age >= 18:
pass
#缺少了pass,代碼運行就會有語法錯誤。
參數檢查
#調用函數時,如果參數個數不對,Python解釋器會自動檢查出來,並拋出TypeError:
>>> my_abs(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: my_abs() takes 1 positional argument but 2 were given
#但是如果參數類型不對,Python解釋器就無法幫我們檢查。試試my_abs和內置函數abs的差別:
>>> my_abs('A')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in my_abs
TypeError: unorderable types: str() >= int()
>>> abs('A')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'str'
#當傳入了不恰當的參數時,內置函數abs會檢查出參數錯誤,而我們定義的my_abs沒有參數檢查,會導致if語句出錯,出錯信息和abs不一樣。所以,這個函數定義不夠完善。
#讓我們修改一下my_abs的定義,對參數類型做檢查,只允許整數和浮點數類型的參數。數據類型檢查可以用內置函數isinstance()實現:
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
#添加了參數檢查後,如果傳入錯誤的參數類型,函數就可以拋出一個錯誤:
>>> my_abs('A')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in my_abs
TypeError: bad operand type
錯誤和異常處理將在後續講到。
返回多個值
#函數可以返回多個值嗎?答案是肯定的。
#返回值會被包裝成一個tuple(元組)但是,在語法上,返回一個tuple可以省略括號,而多個變量可以同時接收一個tuple,按位置賦給對應的值,所以,Python的函數返回多值其實就是返回一個tuple,但寫起來更方便。
def hiahia():
return 1,2,3,4,5,6
print(hiahia())
小結
- 定義函數時,需要確定函數名和參數個數;
- 如果有必要,可以先對參數的數據類型做檢查;
- 函數體內部可以用return隨時返回函數結果;
- 函數執行完畢也沒有return語句時,自動return None。
- 函數可以同時返回多個值,但其實就是一個tuple。
函數高級
#迭代函數:可以聲明一種函數 可以將另一個函數作爲參數之後調用
#函數與函數之間相互調用
def a(number):
print('我是number:%s'%number)
def b(a):
a(8);
b(a);
#遞歸函數 函數是否可以自己調用自己呢? 形成一種循環的方式 但是 要避免的無限遞歸 所以說在函數的函數體 需要聲明函數的出口。
#藉助遞歸函數 第一個例子:階乘 12345 計算的是階乘的積
sum=1;
for i in range(1,6):
sum*=i;
print(sum)
#藉助遞歸 實現階乘
def clac(n):#求5的階乘 代表 1*2*3*4*5
#遞歸函數的出口
if n==1:
return 1;
return n*clac(n-1)
print(clac(5))
#計算機底層的算法:黃金分割法非常常見的
#計算斐波那契數列的合
he=0
def fb(b):
if b<=1:
return b;
else:
return fb(b-1)+fb(b-2);
a=int(input('請輸入要計算斐波那契數列的位數:'))
for i in range(a):
he=he+fb(i)
print(he)