def sum(*args):
def he():
s = 0
for i in args:
s = s + i
return s
return he # 返回sum函式內部的函式he(),和def he()的縮排相同
print sum(1,2,3,4)# 返回函式
print sum(123,3,3)()#返回求和的數值
閉包中盡量不要使用迴圈的變數或者後續中會發生變化的變數,如果使用則應該再建立乙個函式,把迴圈的變數繫結
如:
def sum():
l =
for i in range(3):
def f(j):
def g():
return j*j
return g
return l
a1,a2,a3 = sum()
print a1(),a2(),a3()
正確理解匿名函式即lambda 函式和返回函式
def f1(x,y):
return lambda m,n : m + n
s1 = f1(1,2)
s11 = f1() #由於f1(x,y)有x,y兩個引數,所以賦值時需要有兩個引數,在賦值階段即出錯
print s1 # 返回函式
print s1()# 錯誤是lambda 需要兩個引數,即f1(x,y)返回的函式同樣需要兩個引數
print s1(1,3) # 返回函式值4,此時使用(1,3)兩個引數進行計算,即使用lambda 的兩個引數
# 相當於f1(1,2)(1,3),前面的兩個引數是f1(x,y)的引數,後面的兩個引數是lambda的兩個引數。lambda後面的引數也可以改為x,y但是和f1中的
#x,y 是不同的,注意引數的為形參。
def f2():
return lambda x,y : x + y
s2 = f2()
s22 = f2(1,2) # 即 f2() 不需要引數,所以賦值時不能附帶引數
print s2 # 返回引數
print s2(1,3) #返回求和數值4
# 相當於f1(1,2)(1,3),前面的兩個引數是f1(x,y)的引數,後面的兩個引數是lambda的兩個引數。
# 和f1的不同之處在於f1需要兩個引數,而f2不需要引數。f1的兩個引數實際在計算中用不到。lambda後面的引數也可以改為x,y但是和f1中的
# x,y 是不同的,注意引數的為形參。
f1和f2的等價形式為:
def
f1(x,y):
def
g(m,n):
return
m +
nreturn g
deff2():
def
g(m,n):
return
m +
nreturn g
def f3(x,y):
return lambda : x + y
s3 = f3(1,2)
# s33 = f3() # f3(x,y)需要兩個引數,此語句在賦值時即出錯
print s3 # 返回函式
print s3(1,3) #由於lambda中沒有引數,即lambda 後面沒有跟變數,所以s3()後面不能跟引數
print s3()# 返回求和的數值3,此時使用的是f3的引數
#由於f3有引數,而lambda沒有引數,所以計算時使用的是f3的引數,即正確的賦值方式為f3(1,3)()
def
f4():
return lambda : x + y
#這種情況下由於在lambda的定義中沒有引數,即lambda後面沒有跟變數,所以函式編寫錯誤,也不存在賦值的情況f3 的等價函式為:
deff3(x,y):
def
g():
return x + y
return
gprint f(1,2)()
綜上所述,在f和lambda兩個函式中必須有乙個需要賦值變數,如果同時存在,則在計算的時候按照返回函式的引數進行計算;如果返回函式
沒有引數,在按照f所帶的引數帶入到lambda中進行計算,注意此時lambda函式後面表示式的變數要和f中的變數一致
python返回函式 python中返回函式
python的函式不但可以返回int str list dict等資料型別,還可以返回函式!例如,定義乙個函式 f 我們讓它返回乙個函式 g,可以這樣寫 deff print call f 定義函式g defg print call g 返回函式g return g 仔細觀察上面的函式定義,我們在函...
python 返回函式
返回函式 python的函式不但可以返回int str list dict等資料型別,還可以返回函式!例如,定義乙個函式 f 我們讓它返回乙個函式 g,可以這樣寫 deff print call f 定義函式g defg print call g 返回函式g return g仔細觀察上面的函式定義,...
python 返回函式
實現乙個可變引數的求和。通常情況下,求和的函式是這樣定義的 def calc sum args ax 0 for n in args ax ax n return ax但是,如果不需要立刻求和,而是在後面的 中,根據需要再計算怎麼辦?可以不返回求和的結果,而是返回求和的函式 def lazy sum...