# testFun返回一個列表,列表中存放着4個lambda表達式
def testFun():
temp = [lambda x : i * x for i in range(4)];
return temp;
for everyLambda in testFun():
#print(everyLambda);
#調用列表中的lambda表達式是,傳入的值爲2,即x=2;因爲testFun裏面的for
#循環已經結束,所以i=3;所有下面語句的輸出結果爲6
print(everyLambda(2));
print();
#第一種解決方法:創建一個閉包,使用默認參數立即綁定它的參數
def testFun1():
temp = [lambda x, i = i : i * x for i in range(4)];
return temp;
for everyLambda in testFun1():
print(everyLambda(2));
print();
#第二種解決方法
#使用functools.partial函數,把函數的某些參數(不管有沒有默認值)給固定住
#(也就是相當於設置默認值)
from functools import partial;
from operator import mul;
def testFun2():
return [partial(mul, i) for i in range(4)];
for everyLambda in testFun2():
print(everyLambda(2));
print();
# 第三種解決方法:直接用生成器
def testFun3():
return (lambda x, i = i : i * x for i in range(4));
for everyLambda in testFun3():
print(everyLambda(2));
print();
# 第四種解決方法:利用yield惰性求值的思想
def testFun4():
for i in range(4):
yield lambda x : i * x;
for everyLambda in testFun4():
print(everyLambda(2));
print();
python閉包查找變量晚綁定
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.