函數: python
函數是組織好的,可重複使用的,實現單一功能的代碼段app
函數有輸入(參數)和輸出(返回值)ide
Python中,函數是一等對象(first class)函數
一.函數的定義與調用優化
基本語法spa
def fn(): pass
帶函數的參數orm
def add(x, y): return x + y
有賦值就建立新的變量對象
x = 1y = 2def swap(x, y): x, y = y, x swap(x, y) x >1 y >2
經過list修改變量[由於並無修改變量,因此將會返回append追加內容]
遞歸
lst = [1, 2, 3]def append(item):lst.append(item) append(4) lst [1, 2, 3, 4]
二.位置參數和關鍵字參數:作用域
經過位置傳遞參數的叫位置參數
位置參數和關鍵字參數
def add(x, y): print() add(1, 2) //位置參數 add(x=1, y=2) //關鍵字參數 * 位置參數和關鍵字參數能夠混合使用,可是關鍵字參數要在位置參數後面.不然會報錯SyntaxError python add(1,y=2)
三.可變參數
非默認非可變參數, 可變位置參數,可變關鍵字參數
默認參數不要和可變參數放到一塊兒
def print_info(x, y, *args, **kwargs): //自動組裝成一個字典 print(x) print(y) for x in args: print(x) for k, v in kwargs.items(): print('{0} {1}'.format(k, v)) print_info(1, 2, 3, 4, 5, 6, name='roach',age=16) x => 1 y => 2 可變參數爲(3, 4, 5, 6) 可變關鍵字參數爲: name roach age 16
可變位置參數
def sum(lst): ret = 0 for x in lst: ret += x return ret sum([1, 2, 3, 4, 5]) //這裏須要傳入一個list # 變成 可變參數 def sum(*args): //自動組裝成一個元組 ret = 0 for x in args: ret += x return ret sum(1, 2, 3, 4, 5)
可變關鍵字參數:
def print_info(**kwargs): //自動組裝成一個字典 for k, v in kwargs.items(): print('{0} {1}'.format(k, v)) print_info(name='roach',age=16) > name roach > age 16
可變位置參數和可變關鍵字參數混合:
可變參數函數在定義的時候,就決定了參數是位置參數仍是關鍵字參數
def print_info(*args, **kwargs): //自動組裝成一個字典 for x in args: print(x) for k, v in kwargs.items(): print('{0} {1}'.format(k, v)) print_info(name='roach',age=16) > name roach > age 16
四.參數解包 [重要]
a = [1, 2, 3] b = {'a':1, 'b':2, 'c':3} def fn(a, b, c): pass fn(*a)(1) fn(**b)(1) fn(*[1, 2], **{'c':3})(3)
1.能夠用 * 解包列表或者元組做爲位置參數
2.能夠用**解包字典爲關鍵字參數
3.也能夠混合使用,思考:fn([1, 2],*{'c':3, 'a':4})會怎麼樣?
例子1 - 列表[參數解包]:
lst = [1, 2] def add(x, y): print(x) print(y) add(*lst) //參數解包
例子2 - 字典[參數解包]:
d = {'x':1, 'y':2} def add(x=1, y=3): //key 要和非可變形參一一對應 print(x) print(y) add(**d)
五.默認參數:
默認參數的坑: 列表
當形參是可變類型的時候就會發生這種狀況:
def fn(lst = []): lst.append(1) print(list)
解決辦法
def fn(lst = None): if lst is None: lst = [] lst.append(1) print(list)
六.函數返回值:
能夠經過type來查看函數的返回值;
函數默認return None;
def add(): pass type(add())
七.遞歸函數:
函數體內條用自身的函數
遞歸函數須要有合適的退出條件
迭代均可以轉換成遞歸
遞歸不必定能夠轉化爲迭代
python遞歸最大深度爲1000,且不支持尾遞歸優化
python中應儘可能避免使用遞歸
八.做用域與全局變量:
做用域: 變量生效的範圍
局部變量:在函數體內定義的變量, 局部變量做用域爲函數體
輸出當前的全局變量和局部變量:
print(globals())
print(locals())
九.函數的調用過程:
def add(x, y): def inc(x): def main(): x = 1 y = 2 ret = add(x, y) ret =inc(ret) print(ret)
十.生成器:
def iterator(x): i = 0 while i < 5: yield i i += 1 def main(): for i in iterator(5): print(i) main()
1.先執行main函數.
2.執行到iterator 將main函數壓棧;執行iterator函數.
3.執行到yield,將 i = 0 放入main的命令空間,同時把iterator壓棧,暫停,調出main函數;
4.而後就重複1-3步驟,直到while條件不知足,逐步退出函數;
def iterator(): lst = [1, 2, 3, 4, 5] yield from lst for x in iterator(): print(x)
經過生成器求積數:
def fn(x): ret = 1 for i in range(1, x +1): ret *=i yield ret for x in fn(5): print(x) 1 2 6 24 120 it = fn(5) it.next() //生成器能夠生成可迭代對象; //遍歷到最後一個完後會返回,StopIteration;