python-learning03 - 匿名函數lambda

1. 匿名函數

在python中普通函數定義是通過def關鍵字進行定義,然後再def中定義代碼塊,那麼什麼叫匿名函數呢?匿名函數顧名思義,沒有函數名,而函數體也不是複雜的代碼塊,而是表達式。

2. lambda使用

2.1 基礎應用

lambda [arg1, arg2]: expression

基礎應用,匿名函數作用,需要傳入arg1和arg2兩個參數,調用函數後,執行的表達式求和。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

sum = lambda arg1, arg2: arg1 + arg2

print "Value of sum: ", sum(10, 20)
print "Value of sum: ", sum(30, 40)

輸出

Value of sum: 30
Value of sum: 70

2.2 lambda結合函數

lambda結合標準函數,一樣是存在作用域規則,lambda定義的表達式中,也是一個作用域的,其他的作用域是不可以進行訪問的,lambda和函數一樣,可以共享訪問全局變量,但是不可以訪問彼此的局部變量。lambda可以訪問的變量,1. 全局變量;2. 共享函數體內的變量,但是對於表達式用lamdba自定義的變量,是不共享函數體變量的
實例

#!/usr/bin/env python
# -*- coding:utf-8 -*-

x = 10

def foo():
    y = 5
    bar = lambda y=y: x + y
    print bar()
    y = 8
    print bar()

foo()

變成結果

15
15

這個輸出結果是錯誤的,如果按照共享說法來講,應該是15和18,那爲什麼還是15呢?因爲在lambda函數中對於y進行了定義,第一次將y=5傳入lambda,lambda中y=y=5,這個時候lambda函數中存在一個變量就是y=5,而不是y=y,這個時候不會根據函數體中y=8而改變。

修改後的寫法

#!/usr/bin/env python
# -*- coding:utf-8 -*-

x = 10

def foo():
    y = 5
    bar = lambda : x + y
    print bar()
    y = 8
    print bar()

foo()

實例輸出結果

15
18
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章