一、概述
python和其他高級語言一樣,支持函數
注意和scala不一樣,結果必須使用return,否則默認return None!這和scala最后一個值作為返回是不一樣的!
二、函數調用
和其他語言一樣,寫出函數名,傳入合適的參數即可,例如調用內置函數abs:
>>> abs(-1) 1
函數支持別名:
>>> a = abs # 變量a指向abs函數
>>> a(-1) # 所以也可以通過a調用abs函數
1
如果傳入了錯誤的參數,Python會報TypeError錯誤
數據類型在Python中的轉換可以通過相關的函數:
>>> int('1') 1
>>> str(1) '1'
三、函數定義
定義也是使用和scala一致的def關鍵字:
def fun1(x): if x > 0: print('正數') return x else: print('負數') return -x
如果什么都不做,那就用pass(如果返回空,使用return None)
def nop(): pass
由python這個函數定義也能知道,Python只能給我們做參數個數的檢查,參數類型無法檢查。要檢查參數,只能通過手動編碼使用instance實現:
def my_abs(x): if not isinstance(x, (int, float)): raise TypeError('bad operand type') if x >= 0: return x else: return -x
並且,在Python這類有tuple的語言中,是可以返回多個值的!
def fun1(x,y): if x > 0: return x,y else: return x,y
a,b = fun1(1,2)
當然,內在的是返回了一個tuple,只是返回值可以省略這個()來顯示表明這是一個tuple
默認參數:
定義帶有默認參數的函數時,注意默認參數必須放在后面且必須是不可變對象!
def fun1(x,y=1): if x > 0: return x+y else: return x-y
可變參數
在參數前面加一個星號*即可,內部使用的是一個tuple包裝的
def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum
如果要使用list或者tuple作為可變參數,類似calc(list[0],list[1]),可以使用*進行參數轉換:
calc(*list)
關鍵字參數
在參數前面加兩個星號**即可,內部會把這個關鍵字參數轉換為dict(也就是map)
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw)
>>> person('Bob', 35, city='Beijing') name: Bob age: 35 other: {'city': 'Beijing'} >>> person('Adam', 45, gender='M', job='Engineer') name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
//內部接收的dict是外部的副本,不會對傳入的作改變
命名關鍵字參數(Python3獨有)
在參數中使用*作為一個分隔符即可,這樣可以對傳入的關鍵字參數作命名檢查,只能傳入指定名字的關鍵字參數
def person(name, age, *, city, job): print(name, age, city, job)
這樣,就可以對入參作命名檢查了,只能傳入city=xx,job=xx:
person('Jack', 24, city='Beijing', job='Engineer')
多種參數組合時,順序必須嚴格控制:
必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。
四、遞歸函數
和其他語言的遞歸函數是類似的:
def fact(n): if n==1: return 1
return n * fact(n - 1)