做者:清菡
博客:oschina、雲+社區、知乎等各大平臺都有。html
因爲微信公衆號推送改成了信息流的形式,防止走丟,請給加個星標 ⭐,你就能夠第一時間接收到本公衆號的推送!python
重點須要記住純函數的概念和函數的反作用,面試會問,哈哈。面試
一個函數的返回結果只依賴於它的參數,而且在執行過程裏面沒有反作用,咱們就把這個函數叫作純函數。微信
純函數不是特定的語法,不是特定的功能,它只是一個概念。就是一個函數使用的時候的一種規則。函數
雖然這是個遞歸函數,它也是純函數的一種:測試
def fun(n): if n == -1:# 遞歸臨界點:當達到遞歸臨界點的時候,就再也不調用自身函數的條件 return 1 else: return n * fun(n-1) # 4 *3*2*1 fun(4)
函數裏面進行一系列計算,它返回的結果是根據傳入的數據相關。再也不依賴於任何的其它數據,好比定義個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)
由於它對外部變量有引用。遞歸
純函數不會引用外部的變量,它調用的結果只對你傳入進去的參數fun(4)
有關。作用域
例如:
定義a=100
,return a
返回一個 a,傳入參數i
,def 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)
,可是拿到的返回值卻不是相同的。
像這種函數,它會受外部環境變量的影響,那麼這種函數不能稱爲純函數。
# 函數func1返回的結果爲兩個參數相加的結果 def func1(a,b): return a + b var1=100 #函數func2返回的結果爲參數a和外部變量var1相加的結果 def func2(a): return var1+a #在上面兩個案例中func1返回的結果只受傳入的參數的影響,而func2不只 # 受傳入參數的影響還會受外部變量var1的影響,像func1這樣的返回值只跟 #傳入參數有關的函數,咱們把它叫作純函數。
原則一:變量都只在函數做用域內獲取,做爲的函數的參數傳入。
原則二:不會產生反作用,不會改變被傳入的數據或者其它數據(全局變量)。
原則三:相同的輸入保證相同的輸出。
解釋原則一:
純函數的變量只在函數的做用域內得到,也就是說純函數裏面要麼使用的是函數內部定義的,要麼使用的是傳進來的參數,不會再使用其它任何的變量了。
解釋原則二:
純函數是不會產生反作用的。
解釋原則三:
任什麼時候候調用,只要你傳入的參數是相同的,它給你返回的結果都是同樣的。
函數的反作用就是當函數被調用的時候,既完成了(函數既定的計算任務)函數相關的功能,在完成函數相關功能的時候,你這個函數訪問了外部變量,尤爲是對外部的數據進行了寫操做。
好比在函數內部用到了外面的列表,在這裏面還往列表裏面加了個元素。這個時候修改了全局變量,形成外部環境發生了改變。這種就叫作函數的反作用。
內置函數: https://docs.python.org/zh-cn/3.7/library/functions.html
Python 中的內置函數包含的不單單是內置函數還有不少的內置類型。
雖然內置類型是個類,不是函數。Python 官方也把內置類型概括在內置函數裏面,把它稱爲內置函數。
str()
底層是個類,可是 Python 官方是把它概括在內置函數裏面的。
無論何時調用內置函數,內置函數返回的結果只跟傳入的參數相關,任什麼時候候傳進去的參數是同樣的,那麼內置函數返回的結果都是同樣的。
內置函數是沒有反作用的,所有是屬於純函數的一種,都是屬於純函數。
str()
不是個函數,實際上是個類。雖然算個內置函數,可是不能稱爲純函數。
公衆號 清菡軟件測試 首發,更多原創文章:清菡軟件測試 111+原創文章,歡迎關注、交流,禁止第三方擅自轉載。