調用函數
- 調用函數
# 求絕對值的函數abs()
>>> abs(100)
100
>>> abs(-20)
20
>>> abs(12.34)
12.34
# 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
定義函數
- 定義函數
# 自定義一個求絕對值的my_abs函數
# 如果沒有return語句,函數執行完畢后也會返回結果,只是結果為None。
# return None可以簡寫為return。
def my_abs(x):
if x >= 0:
return x
else:
return -x
注:如果已經把my_abs()的函數定義保存為abstest.py文件了,那么,可以在該文件的當前目錄下啟動Python解釋器,用from abstest import my_abs來導入my_abs()函數,注意abstest是文件名(不含.py擴展名)。
- 空函數
# 如果想定義一個什么事也不做的空函數,可以用pass語句
def nop():
pass
# pass還可以用在其他語句里,比如:
if age >= 18:
pass
注:缺少了pass,代碼運行就會有語法錯誤。
- 參數檢測
# 對參數類型做檢查,只允許整數和浮點數類型的參數。數據類型檢查可以用內置函數isinstance()實現
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
- 返回多個值
# import math語句表示導入math包,并允許后續代碼引用math包里的sin、cos等函數
import math
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
# 可以同時獲得多個返回值:
>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print(x, y)
151.96152422706632 70.0
# 但其實這只是一種假象,Python函數返回的是一個 tuple 有序不可變的列表
>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)
函數的參數
- 默認參數(默認參數必須指向不變對象)
# 由于我們經常計算x^2,所以,完全可以把第二個參數n的默認值設定為2,
# 這樣,當我們調用power(5)時,相當于調用power(5, 2)
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
# 當不按順序提供部分默認參數時,需要把參數名寫上
enroll('Adam', 'M', city='Tianjin')
# Python函數在定義的時候,默認參數L的值就被計算出來了,即[],因為默認參數L也是一個變量,
# 它指向對象[],每次調用該函數,如果改變了L的內容,則下次調用時,默認參數的內容就變了,
# 不再是函數定義時的[]了。
def add_end(L=None):
if L is None:
L = []
L.append('END')
return L
- 可變參數(可變參數在函數調用時自動組裝為一個
tuple
)
# 計算a2 + b2 + c2 + …
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
# 普通方法,組裝出一個list或tuple:
>>> calc([1, 2, 3])
14
>>> calc((1, 3, 5, 7))
84
# 如果利用可變參數,調用函數的方式可以簡化成這樣:
>>> calc(1, 2, 3)
14
>>> calc(1, 3, 5, 7)
84
# 且把函數的參數改為可變參數:
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
# Python允許在list或tuple前面加一個*號,把list或tuple的元素變成可變參數傳進去:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
- 關鍵字參數
關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict
。
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
# 傳入任意個數的關鍵字參數:
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
# 可以先組裝出一個dict,然后,把該dict轉換為關鍵字參數傳進去
# kw獲得的dict是extra的一份拷貝,對kw的改動不會影響到函數外的extra。
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
- 命名關鍵字參數
# 如果要限制關鍵字參數的名字,就可以用命名關鍵字參數,
# 例如,只接收city和job作為關鍵字參數。這種方式定義的函數如下:
def person(name, age, *, city, job):
print(name, age, city, job)
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
# 如果函數定義中已經有了一個可變參數,后面跟著的命名關鍵字參數就不再需要一個特殊分隔符*了
def person(name, age, *args, city, job):
print(name, age, args, city, job)
# 命名關鍵字參數可以有缺省值,從而簡化調用:
def person(name, age, *, city='Beijing', job):
print(name, age, city, job)
>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer
- 參數組合
在Python中定義函數,上面5種參數都可以組合使用。但是請注意,參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。
對于任意函數,都可以通過類似func(*args, **kw)的形式調用它,無論它的參數是如何定義的。