標籤:物件導向 長度 app 函數式編程 txt port 函數調用 lis lse
lambda
匿名函數,核心是作為運算元,處理邏輯只有一行但具有函數的特性,核心用於函數式編程中
三元運算子
其實本質上是if分支的簡化版,滿足條件返回 if 前面的值,不滿足條件返回 else後面的值
# 100 < 100 返回 False, 則 返回 else後面的值value = 100 if 100 < 100 else 10print(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 randintfrom functools import reducenumbers = [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 randintnumbers = [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 wrapperif __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 三元運算式 閉包