Python-函數式編程-map reduce filter lambda 三元表達式 閉包
阿新 • • 發佈:2018-06-05
閉包 imp and 不能 from one 生成 經驗 結果
lambda
匿名函數,核心是作為算子,處理邏輯只有一行但具有函數的特性,核心用於函數式編程中
三元運算符
其實本質上是if分支的簡化版,滿足條件返回 if 前面的值,不滿足條件返回 else後面的值
# 100 < 100 返回 False, 則 返回 else後面的值
value = 100 if 100 < 100 else 10
print(value)
map
映射函數(依次把可叠代對象(可多個)中的值依次傳遞到函數中,然後返回生成器(長度以最短的為基礎))
numbers = [1, 2, 3, 4] names = [‘bei_men_chui_xue‘, ‘qi_niu_yun‘] numbers = map(lambda value: value + 1, numbers) students = map(lambda value: value.upper(), names) print(list(numbers)) print(list(students))
reduce
減少函數(連續計算,處理函數中第一個值是上一次函數執行的返回結果,第二個值是依次從叠代對象中的值,傳遞完則返回最後函數執行的結果)
from random import randint
from functools import reduce
numbers = [randint(-10, 10) for _ in range(10)]
print(numbers)
print(sum(numbers))
numbers_sum = reduce(lambda one, two: one + two, numbers)
print(numbers_sum)
filter
依次依順序把可叠代對象傳入一個函數,獲取函數返回為True的值,變成生成器
from random import randint
numbers = [randint(-10, 10) for _ in range(10)]
print(numbers)
# 取大於等於0 的整數
result = filter(lambda value: value >= 0, numbers)
print(list(result))
閉包
函數 + 環境變量(放在上層函數, 上層函數沒有任何參數,則不能形成閉包) (不再受外層函數之外的任何參數影響)
閉包架構 函數內再定義一個函數,外層函數返回內層函數名,內層函數需要引用外層函數變量
閉包意義:函數調用的現場(上層函數的變量)保存了起來, 通過 nonlocal 聲明不是當前函數局部變量,進行現場變量的修改
閉包是裝飾器實現的原理,所有的閉包問題都可以通過面向對象類的方式解決,選擇簡單實現的額方法
def is_jpg(name):
"""判斷文件的後綴名是是不是jpg,如果不是則添加上jpg"""
def wrapper(filename):
if filename.endswith(name):
return filename
else:
return filename + name
return wrapper
if __name__ == ‘__main__‘:
f = is_jpg(‘.jpg‘)
print(f(‘beimenchuixue.txt‘))
print(f(‘beimenchuixue.jpg‘))
經驗:
1. 三元運算符其實本質上是if分支的簡寫邏輯
2. 經常使用的是命令是編程,命令式編程包含流程控制、函數、分支、循環,函數式編程包括map reduce filter lambda,理論上可以替換所有命令式編程
3. 命令式編程可以使用函數式編程簡化代碼邏輯
4. 函數閉包,本質上保留了上層函數的變量
Python-函數式編程-map reduce filter lambda 三元表達式 閉包