1. 程式人生 > 實用技巧 >Python學習筆記

Python學習筆記

函式

  定義:申請記憶體空間將儲存函式體程式碼,將上述記憶體地址繫結函式名,
  定義函式不會執行函式體程式碼,但是會檢測函式體程式碼語法
      def 函式名(引數1,引數2...):
	   '''文件描述'''
            函式體
            return 值

呼叫:通過函式名找到函式的記憶體地址,然後通過加括號觸發函式體程式碼的執行
	 1.語句形式:只加括號呼叫函式
	 2.表示式形式:賦值表示式,數學表示式
	 3.函式呼叫當引數

函式返回值:
	 return是函式結束的標誌,即函式體程式碼一旦執行到return會立刻
	 終止函式的執行,並且會將本次執行的結果返回
	 	1.返回None:函式體內沒有return
           return
           return None
		2.返回一個值:return 值
	 	3.返回多個值:return 值,值
    	  用逗號分隔開,會被return返回成元組

無參函式:

無需引數,自身程式碼能實現功能

有參函式:

需要引數,程式碼執行是需要傳入對應的引數才能執行

形參:

在定義函式階段定義的引數稱之為形式引數,簡稱形參,相當於變數名

實參:

在呼叫函式階段傳入的值稱之為實參,相當於變數值

形參與實參的關係:

在呼叫階段,實參(變數名)會繫結給形參(變數名)
這種繫結關係只能在函式體內用

形參與實參繫結關係在函式呼叫是生效,函式呼叫結束後解除繫結關係

形參與實參的具體作用:

1.位置引數:按照位置從左到右的順序依次定義的引數稱之為位置引數
    位置形參:在函式定義階段,按照從左到右的順序直接定義的“變數名”
        特點:必須被傳值,多一個不行少一個不行
    位置實參:在函式呼叫階段,按照從左到右的順序依次傳入的值
        特點:按照順序與形參一一對應

2.關鍵字引數(實參)
    關鍵字實參:在函式呼叫階段,按照key=value的形式傳入的值
        特點:可以指明給某個形參傳值,完全不參照順序

3.預設引數(形參)
    預設形參:在定義函式階段。就已經被賦值的形參,稱之為預設形參
        特點:在定義階段就已經被賦值,意味著在呼叫階段可以不用為其賦值
             預設形參是在函式定義階段被賦值的,被賦予的是值的記憶體地址
             不推薦使用可變型別

4.混合使用:
    1.位置實參必須放在關鍵字實參前
    2.不能為同一個形參重複傳值

可變長度的引數:

可變長度指的是在呼叫函式時,傳入的值(實參)的個數不穩定
而實參是用來為形參賦值的,所以對應著,針對溢位的實參必須有對應的實參來接收

形參:
    *形參格式:接收溢位的位置實參,溢位的實參會被*儲存成元組的格式然後賦值緊跟其後的形參
             *後跟的可以說任意名字,但是約定俗成的是args

    **形參格式:接收溢位的關鍵字實參,**會將溢位的實參會儲存成字典的格式然後賦值緊跟其後的形參
             **後跟的可以說任意名字,但是約定俗成的是kwargs
實參:
 	實參中帶*,先將*後的值打散成位置實參
 	實參中帶**(**後只能是字典),先將**後的值打散成關鍵字實參

混用*與**:*args必須在**kwargs前
	特點:什麼都能接收(元組在前,字典在後)

函式物件:

精髓:可以把函式當成變數去用
     可以把函式當做引數傳給另外一個函式
     可以把函式當做另外一個函式的返回值
     可以把函式當做容器型別的一個元素

名稱空間與作用域

名稱空間:

  存放名字的地方,是對棧區的劃分
  有了名稱空間後,就可以在棧區中存放相同的名字

名稱空間分為三種:

1.內建名稱空間
    存放的名字:存放Python直譯器內建的名字
    存活週期:Python直譯器啟動則產生,Python直譯器關閉則銷燬

2.全域性名稱空間
    存放的名字:只要不是函式內定義,也不是內建的,剩下的都是全域性名稱
    存活週期:Python檔案執行則產生,Python檔案執行完畢後銷燬

3區域性名稱空間
    存放的名字:在呼叫函式時,執行函式體程式碼的過程中產生的函式內的名字
    存活週期:在呼叫函式是存活,函式呼叫完畢後則銷燬

名稱空間的載入順序:

內建名稱空間------>全域性名稱空間------->區域性名稱空間

名稱空間的銷燬順序:

區域性名稱空間------>全域性名稱空間------->內建名稱空間

名稱的查詢優先順序:當前所在的位置往上一層一層查詢(以定義為基準)

區域性名稱空間   ^
全域性名稱空間   ^
內建名稱空間   ^

作用域:

作用範圍:
    全域性作用域:全域性有效:被所有函式共享
        內建名稱、全域性名稱

    區域性作用域:臨時存活,區域性有效
        區域性名稱

裝飾器:為其他函式新增額外的功能

在不修改被裝飾物件原始碼以及呼叫方式的前提下為被裝飾物件增加新功能

開放封閉原則:

開放:指的是對拓展功能是開放的
封閉:指的是對修改原始碼是封閉的

語法糖:

可以更加方便的呼叫裝飾器
@函式名

無參裝飾器:

from functools import wraps
def outter(func)
    @wraps(func)
    def wrapper(*args,**kwargs):
        res=func(*args,**kwargs)
        return res
    return wrapper

疊加多個裝飾器:

載入順序為自下而上
載入順序為自上而下

閉包函式:

閉包函式 = 名稱空間與作用域 + 函式巢狀 + 函式物件
核心點:名字的查詢關係是以函式定義階段為準

生成器:generator

在函式內一旦存在yield關鍵字,呼叫函式並不會執行函式體程式碼,會返回一個生成器物件,生成器即自定義迭代器

__next__會觸發函式體程式碼的執行,然後遇到yield停下來會將yield後的值當做本次呼叫的結果返回

迭代器:keyiterator

迭代器指的是迭代取值的工具,迭代是一個重複的過程,每次重複都是基於上一次的結果而繼續的,單純的重複並不是迭代

可迭代物件:

__iter__()將可迭代物件轉化成迭代器
__next__()將可迭器取出

  在一個迭代器取值取乾淨的情況下,在對其取值取不到

for迴圈原理:迭代器迴圈

1、可迭代物件.__iter__()得到一個迭代器物件
2、迭代器物件.__next__()拿到一個返回值,然後該返回值賦值給X
3、迴圈往復步驟2,直到丟擲異常StopIterantion然後for迴圈捕捉異常結束迴圈

def fo(d):
    while True:
        dc = d.__iter__()
        while True:
            try:
                print(dc.__next__())
            except StopIteration:
                break
        break

三元表示式:

條件成立時要返回的值if條件else條件不成立要返回的值
res = 1 if 1 > 2 else 2
等同於
res = if i > 2:
		  return 1
	  else:
		  return 2

函式的遞迴呼叫:

在呼叫函式的過程中又直接或者間接地呼叫到本身

強調:

遞迴不應該無限迴圈地呼叫下去,必須在滿足條件後結束遞迴呼叫

遞迴的兩個階段:

回溯:一層一層呼叫下去
遞推:滿足某種結束條件,結束遞迴呼叫,然後一層一層返回

匿名函式lambda:用於臨時呼叫一次的場景