1. 程式人生 > >Python-函數式編程-map reduce filter lambda 三元表達式 閉包

Python-函數式編程-map reduce filter lambda 三元表達式 閉包

閉包 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 三元表達式 閉包