python學習8-函數

函數是python裏組織代碼的最小單元
一、定義
1、定義def fn(參數):
2、函數有輸入(參數)和輸出(返回值)
3、傳入的參數與函數定義時要匹配
4、按照定義的順序傳入參數,這樣的方法叫位置參數,和關鍵字參數混用時,必須在前面
5、按照定義時的變量名傳遞,叫關鍵字參數,和順序無關
二、參數
1、參數默認值,帶默認值的必須在不帶的之後
def inc(x,y=1):
2、可變參數(函數定義時)
位置可變參數:參數前加一個星號,構成元祖,只能位置參數傳參。
關鍵字可變參數:參數前加二個星號,構成字典,只能關鍵字參數傳參。
可以一起使用,但是位置可變參數必須在前
3、通常來說
默認參數靠後
可變參數靠後
默認參數和可變參數不同時出現
三、參數解構(函數調用時)
1、add(星號t) #加一個星號可以把可迭代對象解構成位置參數
2、add(星號星號t) #加二個星號,可以把字典解構成關鍵字參數,key必選是str
四、keyword-only 參數(python3添加)
1、def fn(星號,x): #星號之後的參數只能通過關鍵字參數調用
2、可變位置參數之後的參數也是
3、可以有默認值,可以和默認值一起出現
五、函數的返回值
1、return除了返回值且結束函數
2、可以出現多個return,執行到那個返回那個且結束函數
3、當函數沒有return語句時,隱式返回none
4、當函數需要返回多個值時,可以使用封裝把返回值封裝成元組
5、不返回值,可以用return即可。返回none,通常用於結束函數
六、函數可以嵌套定義
七、作用域
1、作用域是一個變量的可見範圍,叫這個變量的作用域
2、函數內部是一個局部的作用域,不能直接使用全局作用域的變量
3、變量的作用域爲定義此變量的作用域
4、上級作用域對下級作用域來說是隻讀可見
八、全局變量
1、global x #可以把x提升爲全局變量,但是並沒有定義變量
九、閉包
1、函數已經結束,但是函數內部變量的引用還在,python閉包可以用可變容器實現,這是python2的唯一方式
2、python3可以用nolocal標記一個變量由上級作用域定義,可讀可寫
十、函數也是對象,參數是函數對象的屬性,所以函數參數的作用域伴隨函數的整個生命週期
十一、函數的結束
1、定義在全局作用域的
重新定義、del刪除、程序結束退出
2、局部作用域
重新定義、del刪除、上級作用域被銷燬
十二、遞歸函數
類似求斐波那契數列,非常消耗cpu,層次不能太深,儘量不使用。
sys.getrecursionlimit() #獲取系統最大層次

def fn(n):
    if n < 2:
        return 1
    return fn(n-1) + fn(n-2)

十三、匿名函數
1、lanbda來定義
2、參數列表不需要小括號
3、冒號不是用來開啓新的語句塊
4、沒有return,最後一個表達式的值即返回值
5、只有寫在一行上,單行函數
6、普通函數所支持的變化,匿名函數也支持
十四、生成器
帶yield語句的函數稱之爲生成器函數。生成器函數的返回值是生成器
1、生成器執行的時候不會執行函數體
2、當next生成器的時候,當前代碼會執行到一個yield,會彈出值,並且暫停函數,當再次執行的時候,從上次暫停出繼續,當沒有多餘yield,會拋出stopiteration異常,異常的值是函數返回值
3、生成器是惰性求值
4、計數器

def count():
    def inc():
        x=0
        while True:
            x += 1
            yield x
    c = inc()
    return lambda:next(c)

5、用生成器解決遞歸問題
6、用生成器進行協成調度
十五、高階函數
返回函數或者參數是函數的函數
1、python中函數是一等對象,也可以像普通對象一樣賦值、作爲參數、作爲返回值
2、函數返回值,通常是用於閉包場景,需要封裝一些變量
3、函數作爲參數,通常用於邏輯固定,少部分邏輯不固定

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章