最近python學習到了包裝函式,說真的,這部分內容一開始真的有點難理解。
遇到一道很簡單的練習題:(附上**)
利用閉包返回乙個計數器函式,每次呼叫它返回遞增整數
def createcounter():
ans = [0]
def counter():
ans[0] += 1
return ans[0]
return counter
一開始,我是這樣寫的:
def createcounter():
n = 0
def counter():
n = n + 1
return n
return counter
結果報錯了,琢磨了好久,發現原來內層函式只可以呼叫外層函式中定義的變數,但不能對其進行更改(內層函式對於外層函式中的變數只有讀許可權,沒有寫許可權)。如果想要更改,系統會認為要更改的是內層函式中乙個相同名字的變數(內層函式中可以使用乙個與外層函式中名字完全相同的變數),所以在counter內創立乙個新的變數n,而這個變數n沒有初始化,因此報錯了。
看了別人的分析之後,收集了三種解決方法:
1.將x定義為global,全域性命名空間在任何乙個位置都有讀寫許可權,但問題是在任何地方都可以對其修改。
def createcounter():
global x
x=0def counter():
global x
x += 1
return x
return counte
2.將外層函式中的x定義為list。在內層使用x[0]+=1時,list的指向不會發生變化,變化的是list內部的元素。
def createcounter():
x = [0]
def counter():
x[0] += 1
return x[0]
return counter
3.設定乙個指向可變物件list的預設引數。思路與2一樣,只要引數一直等於預設引數,就會始終指向同乙個list的位址,變化的是list內部的元素。
def createcounter():
def counter(x=[0]):
x[0] = x[0]+1
return x[0]
return counter
Python函式中的變數和函式返回值的使用例項
區域性變數和全域性變數 python中的任何變數都有特定的作用域 在函式中定義的變數一般只能在該函式內部使用,這些只能在程式的特定部分使用的變數我們稱之為區域性變數 在乙個檔案頂部定義的變數可以供檔案中的任何函式呼叫,這些可以為整個程式所使用的變數稱為全域性變數。def fun x 100 prin...
python中的enumerate 函式使用方法
結合例項來理解比較好,網上找了一下這個enumerate用法,自己也記錄一下加深印象 舉例說明 具體例子 列印輸出索引與value值 列表1 print 列表1 product mac pro iphone iwatch for index,item in enumerate product pri...
關於python中argsort 函式的使用
在實現 機器學習實戰 中knn 時遇到需要將計算好的距離進行排序,即可使用argsort 函式,在此依據個人理解對該函式進行簡單的介紹。總的來說,argsort 函式是對陣列中的元素進行從小到大排序,並返回相應序列元素的陣列下標。以下通過例子進行詳細解釋。from numpy import a ar...