函式知識總結
一、函式引數
函式的引數按位置順序傳遞
#Example x = '全域性變數' def example(a,b='2b',*c,**d): y = '實參' print('所有引數:', a, b, c, d, y) return print('已執行函式') example('1a','2B','3c',**{'4d':'1234'},one = 'first')
執行結果:
所有引數: 1a 2B ('3c',) {'4d': '1234', 'one': 'first'} 實參 已執行函式
形參變數:只在被呼叫時分配到記憶體單元,呼叫結束後釋放,只在函式內部有效。如:a,b,c,d
實參:已確定的變數,在函式呼叫時必須先賦值。 如:變數x,y
預設引數:在寫函式時指定該引數的預設值,但只能放在形參的最後。 如:b
關鍵引數:不按照順序傳遞引數時,可在呼叫時指定引數名傳遞引數,但不可重複傳遞。
非固定引數(元組型):把多傳遞的引數變成元組的形式存放。 如:*c
非固定引數(字典型):把有對應鍵和值的引數以字典的形式存放。 如:**d
函式返回值:函式執行時遇到return語句會停止執行並返回return後的語句,沒有則為None。
全域性變數:函式外部定義的變數。如:x 在函式內部呼叫時可用global x在函式內部修改。
區域性變數:函式內部定義的變數。如:y
作用域:global操作可在函式內部修改全域性變數。
二、高階函式
1、匿名函式
example = lambda x,y:x**y
example(2,4)
執行結果
2**4
結果為16
2、高階函式
1.接受一個或多個函式作為輸入
2.return返回另一個函式
3、遞迴
在一個函式內部呼叫自身
def calc(n): print(n) if int(n/2) == 0: return n return calc(int(n/2))
遞迴的特性:
1.必須有一個明確的結束條件
2.每次進入深一層的遞迴時,問題規模相比上一次遞迴都應有所減少
3.遞迴效率不高,遞迴層次過多會導致棧溢位。
4、函式進階
1.名稱空間
locals:函式內的名稱空間,包括區域性變數和形參
globals:全域性變數函式定義所在模組的名稱空間
builtins:內建模組的名稱空間
2.作用域
全域性範圍:全域性存活,全域性有效
區域性範圍:臨時存放,區域性有效
檢視作用域方法 globals()、locals()
5、閉包和裝飾器
閉包:函式定義和函式表示式位於另一個函式的函式體內(巢狀函式)。而且,這些內部函式可以訪問他們所在的外部函式中宣告的所有區域性變數、引數。當其中一個這樣的內部函式在包含它們的外部函式之外被呼叫,就會形成閉包。
def outer(fuc): name = 'abc' def inner(): print('列印外層函式的變數',name)
fuc() return inner f = outer() f()
閉包的意義:返回的函式物件不僅僅是一個函式物件,在該函式外還包裹了一層作用域,使得該函式無論在何處呼叫,優先使用自己外層包裹的作用域。
三、生成器&迭代器
1、列表生成式
b = [i + 1 for i in range(10)] print(b)
2、生成器
在Python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。
1.將列表生成式的[ ] 改為 ()
2.在函式中插入yield關鍵字
g = (x * x for x in range(10))
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done'
yield既可以中斷並返回該值,也可以用send傳遞引數給該生成器。
def test1(): while True: name = yield print('我的名字叫%s'%(name)) for i in name: te = test1() te.__next__() # 生成器必須先執行後才可用send傳入引數。 te.send(i) 我的名字叫a 我的名字叫b 我的名字叫c 我的名字叫d
生成器可以用for迴圈或__next__()呼叫生成下一個值。
3、迭代器
可以直接作用於for迴圈的物件成為可迭代物件:Iterable。可以用isinstan()判斷一個物件是否是Iterable。
主要包括:集合資料型別如list、tuple、dict、set、str,生成器generator。
可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器:Iterator。
生成器都是Iterator,但list、tuple、dict、set、str雖然是可迭代物件但並不是迭代器。但可以用iter()函式變成迭代器。