python閉包查找變量晚綁定


# 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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章