- 函數(shù)就是最基本的一種代碼抽象的方式演顾。
-
help(abs)
查看幫助信息腥椒。
調(diào)用函數(shù)
abs(2)
cmp(x,y)
int()
float()
str()
unicode()
bool()
hex()
max()
- 函數(shù)名其實就是指向一個函數(shù)對象的引用,完全可以把函數(shù)名賦給一個變量,相當于給這個函數(shù)起了一個“別名”
- 函數(shù)參數(shù)數(shù)量和類型不對時都會報
TypeError
錯誤。
定義函數(shù)
def my_abs(x):
if x>=0:
return x
else:
return -x
- 空函數(shù)
pass
def nop():
pass
- 參數(shù)檢查
TypeError
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
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
>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)
Python的函數(shù)返回多值其實就是返回一個tuple。
函數(shù)的參數(shù)
- 位置參數(shù)
def power(x, n):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
x
和n
厦取,這兩個參數(shù)都是位置參數(shù),調(diào)用函數(shù)時管搪,傳入的兩個值按照位置順序依次賦給參數(shù)x
和n
虾攻。
- 默認參數(shù)
- 當函數(shù)有多個參數(shù)時,把變化大的參數(shù)放前面更鲁,變化小的參數(shù)放后面霎箍。變化小的參數(shù)就可以作為默認參數(shù)。
- 當不按順序提供部分默認參數(shù)時澡为,需要把參數(shù)名寫上
- 默認參數(shù)必須指向不變對象
def add_end(L=None):
if L is None:
L = []
L.append('END')
return L
- 可變參數(shù)(tuple)
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc(1, 2)
5
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
*nums
表示把nums
這個list的所有元素作為可變參數(shù)傳進去漂坏。
- 關鍵字參數(shù)(dict)
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> person('Michael', 30)
name: Michael age: 30 other: {}
>>> 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'}
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, city=extra['city'], job=extra['job'])
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
**extra
表示把extra
這個dict的所有key-value用關鍵字參數(shù)傳入到函數(shù)的**kw
參數(shù),kw將獲得一個dict媒至,注意kw獲得的dict是extra的一份拷貝顶别,對kw的改動不會影響到函數(shù)外的extra。
-
參數(shù)組合
- 順序必須是:必選參數(shù)拒啰、默認參數(shù)驯绎、可變參數(shù)和關鍵字參數(shù)。
def func(a, b, c=0, *args, **kw): print 'a:', a, 'b:', b, 'c:', c, 'args:', args, 'kw:', kw func(1, 3, 4, 5, 6, 23) func(1, 3, 4, 5, 6, ab=23) args = (12, 5, 6, 7) kw = {"key1": 90, 'x': 999} func(*args, **kw)
- 對于任意函數(shù)谋旦,都可以通過類似func(*args, **kw)的形式調(diào)用它剩失,無論它的參數(shù)是如何定義的。
遞歸函數(shù)
使用遞歸函數(shù)需要注意防止棧溢出册着。在計算機中拴孤,函數(shù)調(diào)用是通過棧(stack)這種數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的,每當進入一個函數(shù)調(diào)用甲捏,棧就會加一層棧幀演熟,每當函數(shù)返回,棧就會減一層棧幀摊鸡。由于棧的大小不是無限的绽媒,所以蚕冬,遞歸調(diào)用的次數(shù)過多免猾,會導致棧溢出。
尾遞歸指在函數(shù)返回的時候囤热,調(diào)用自身本身猎提,并且,return語句不能包含表達式。這樣锨苏,編譯器或者解釋器就可以把尾遞歸做優(yōu)化疙教,使遞歸本身無論調(diào)用多少次,都只占用一個棧幀伞租,不會出現(xiàn)棧溢出的情況贞谓。
尾遞歸調(diào)用時,如果做了優(yōu)化葵诈,棧不會增長裸弦,因此,無論多少次調(diào)用也不會導致棧溢出作喘。
參考:《Python教程》