測開之函數進階· 第2篇《純函數》

堅持原創輸出,點擊藍字關注我吧

做者:清菡
博客:oschina、雲+社區、知乎等各大平臺都有。html

因爲微信公衆號推送改成了信息流的形式,防止走丟,請給加個星標 ⭐,你就能夠第一時間接收到本公衆號的推送!python

目錄

  • 1、純函數的概念
    • 1.純函數
    • 2.非純函數
    • 3.純函數:相同的輸入保證相同的輸出
    • 4.純函數和非純函數對比
  • 2、純函數的 3 個原則
  • 3、函數的反作用
  • 4、Python 中的內置函數

重點須要記住純函數的概念和函數的反作用,面試會問,哈哈。面試

1、純函數的概念

一個函數的返回結果只依賴於它的參數,而且在執行過程裏面沒有反作用,咱們就把這個函數叫作純函數。微信

純函數不是特定的語法,不是特定的功能,它只是一個概念。就是一個函數使用的時候的一種規則。函數

1.純函數

雖然這是個遞歸函數,它也是純函數的一種:測試

def fun(n):
    if n == -1:# 遞歸臨界點:當達到遞歸臨界點的時候,就再也不調用自身函數的條件
        return 1
    else:
        return n * fun(n-1) # 4 *3*2*1

fun(4)

2.非純函數

函數裏面進行一系列計算,它返回的結果是根據傳入的數據相關。再也不依賴於任何的其它數據,好比定義個a = 100,那麼在:code

if n == 0:# 遞歸臨界點:當達到遞歸臨界點的時候,就再也不調用自身函數的條件
        return 1
    else:
        return n * fun(n-1) # 4 *3*2*1

這段代碼,也就是純函數裏面用到了外面的變量:htm

a = 100
def fun(n):
    print(a)
    if n == 0:# 遞歸臨界點:當達到遞歸臨界點的時候,就再也不調用自身函數的條件
        return 1
    else:
        return n * fun(n-1) # 4 *3*2*1

fun(4)

那這種函數就再也不叫作純函數了。print(a)由於它對外部變量有引用。遞歸

3.純函數:相同的輸入保證相同的輸出

純函數不會引用外部的變量,它調用的結果只對你傳入進去的參數fun(4)有關。作用域

例如:

定義a=100return a返回一個 a,傳入參數idef func(i):

這個時候調用這個函數,傳進去的參數跟它的返回值有關嗎?

這個函數和它的返回值沒有關係。傳進去的func(10),無論傳什麼,不會影響返回值return a

a = 100
def func(i):
    print('99999')
    print(i)
    return a

func(10)

純函數是傳進去的參數是什麼,返回的結果只跟你的參數有關。

純函數:無論在何時調用(無論在哪裏調用),傳入的參數相同,返回的結果就必定是同樣的。

例如:

這個函數,調用的時候傳個 10 進去,它返回的時候應該是多少呢?

它返回的結果是 110。

a = 100
def func(i):
    i = i + a
    return i

res = func(10)
print(res)

在下面對 a 進行修改,對 a 再賦個值:

a = a+1111

那麼這個時候,a 的值確定發生變化了。這個時候在這裏再調用函數,再傳入 10,func(10)

a = 100
def func(i):
    i = i + a
    return i

res = func(10)
print(res)

a = a+1111
res2 = func(10)
print(res2)

一樣調用的是同一個函數,傳入的參數都是相同的func(10),可是拿到的返回值卻不是相同的。

像這種函數,它會受外部環境變量的影響,那麼這種函數不能稱爲純函數。

4.純函數和非純函數對比

# 函數func1返回的結果爲兩個參數相加的結果

def func1(a,b):
    return a + b


var1=100
#函數func2返回的結果爲參數a和外部變量var1相加的結果
def func2(a):
    return var1+a


#在上面兩個案例中func1返回的結果只受傳入的參數的影響,而func2不只
# 受傳入參數的影響還會受外部變量var1的影響,像func1這樣的返回值只跟
#傳入參數有關的函數,咱們把它叫作純函數。

2、純函數的 3 個原則

原則一:變量都只在函數做用域內獲取,做爲的函數的參數傳入。

原則二:不會產生反作用,不會改變被傳入的數據或者其它數據(全局變量)。

原則三:相同的輸入保證相同的輸出。

解釋原則一:

純函數的變量只在函數的做用域內得到,也就是說純函數裏面要麼使用的是函數內部定義的,要麼使用的是傳進來的參數,不會再使用其它任何的變量了。

解釋原則二:

純函數是不會產生反作用的。

解釋原則三:

任什麼時候候調用,只要你傳入的參數是相同的,它給你返回的結果都是同樣的。

3、函數的反作用

函數的反作用就是當函數被調用的時候,既完成了(函數既定的計算任務)函數相關的功能,在完成函數相關功能的時候,你這個函數訪問了外部變量,尤爲是對外部的數據進行了寫操做。

好比在函數內部用到了外面的列表,在這裏面還往列表裏面加了個元素。這個時候修改了全局變量,形成外部環境發生了改變。這種就叫作函數的反作用。

4、Python 中的內置函數

內置函數: https://docs.python.org/zh-cn/3.7/library/functions.html

Python 中的內置函數包含的不單單是內置函數還有不少的內置類型。

雖然內置類型是個類,不是函數。Python 官方也把內置類型概括在內置函數裏面,把它稱爲內置函數。

str()底層是個類,可是 Python 官方是把它概括在內置函數裏面的。

無論何時調用內置函數,內置函數返回的結果只跟傳入的參數相關,任什麼時候候傳進去的參數是同樣的,那麼內置函數返回的結果都是同樣的。

內置函數是沒有反作用的,所有是屬於純函數的一種,都是屬於純函數。

str()不是個函數,實際上是個類。雖然算個內置函數,可是不能稱爲純函數。


公衆號 清菡軟件測試 首發,更多原創文章:清菡軟件測試 111+原創文章,歡迎關注、交流,禁止第三方擅自轉載。

相關文章
相關標籤/搜索