python3入門與實踐(六):函數語言程式設計

Meet.相識發表於2018-12-12

匿名函式

lambda

# 1.parameter_list 引數列表
# 2.expression 函式體,只能是有一些簡單的,注意不是程式碼塊,比如不能寫賦值語句
# 3.不需要return
lambda parameter_list: expression
複製程式碼
def add(x,y):
    return x+y;
複製程式碼

用lambda標示

lambda x,y: x+y
複製程式碼

呼叫lambda 複製給變數

f = lambda x,y: x+y
print(f(1,2))
複製程式碼

三元表示式

# x,y x大於y x 否則 y
x > y ? x : y

# 條件為真時返回的結果 if 條件判斷 else 條件為假時的返回結果
r = x if x > y else y
複製程式碼

map 內建類

幫助文件
將原來集合中的每一個集合的元素,都通過函式對映到新的集合裡面來

假設有很多個拋物線的點,已知每個點的x座標,y座標需要用平方函式求出

list_x = [1,2,3,4,5,6,7,8]
def square(x):
    return x*x
複製程式碼

迴圈方式解決


for x in list_x:
    square(x)
複製程式碼

map方式解決

r = map(square,list_x)
print(list(r))
# 輸出:[1, 4, 9, 16, 25, 36, 49, 64]
複製程式碼

map結合lambda表示式

r = map(lambda x:x*x,list_x)
複製程式碼

多引數的lambda表示式

list_x = [1,2,3,4,5,6,7,8]
list_y = [1,2,3,4,5,6,7,8]
# 可傳入多個引數列表,返回的結果元素個數與引數列表集合裡元素數較小的個數
r = map(lambda x,y:x*x+y,list_x,list_y)
複製程式碼

reduce

使用

from functools import reduce
複製程式碼

幫助文件

運算原理:連續呼叫lambda表示式,
# 第一次執行,取引數列表的前2個元素(2為lambda引數個數)
# 第二次執行,取上一次運算結果和下一個元素
r = reduce(lambda x,y:x+y,list_x)
print(list(r))
# 輸出 36


# 注意,10是初始值,不是最後運算
r = reduce(lambda x,y:x+y,list_x,10)
print(list(r))
# 輸出 46
複製程式碼

filter

幫助文件

過濾掉不符合規則的元素

# 要求傳入函式必須返回能夠代表真和假的值(True/False)(1/0)
r = filter(lambda x: True if x==1 else False,list_x)
print(list(r))
# 輸出[1, 1, 1]
複製程式碼

函數語言程式設計與指令式程式設計

指令式程式設計:

  • def 方法定義
  • if else 流程控制
  • for 迴圈

函數語言程式設計:

  • map reduce filter
  • lambda 運算元

一定程度下lambda可以替換指令式程式設計的函式,reduce可以替換指令式程式設計的迴圈

裝飾器

類似於C#的特性,java的註解 體現了AOP的程式設計思想

def f1():
    print('This is a function')
    
# 現在需要在方法上新增列印時間

## 方案1:不推薦,沒有體現出對原來函式的擴充套件,呼叫也變化了)
def print_current_time(func):
    print(time.time())
    func()
    
print_current_time(f1)

## 方案2:通過wrapper外面分裝了一層decorator,實現不改變原有函式實現過程,但是仍然改變了方法呼叫,不推薦

# 裝飾器
def decorator(func):
    # 包裝
    def wrapper():
        print(time.time())
        func()
    return wrapper

f = decorator(f1)
f()

## 方案3:語法糖 @符號,可以不改變方法呼叫,推薦!
@decorator
def f1():
    print('This is a function')
    
f1()

複製程式碼

帶引數的方法的裝飾器的使用

def f1(name):
    print('This is a function named '+name)
 
## 方案1:不推薦,無法為多個函式提供增強支援    
def decorator(func):
    # 包裝
    def wrapper(func_name):
        print(time.time())
        func(func_name)
    return wrapper  
    
## 方案2:可變引數列表,不支援關鍵字引數
def decorator(func):
    # 包裝
    def wrapper(*args):
        print(time.time())
        func(*args)
    return wrapper
    
## 方案3:推薦
@decorator
def f2(func_name1,func_name2,**kw):
        print('This is a function named '+func_name1)
        print('This is a function named '+func_name2)
        print(kw)
        
def decorator(func):
    # 包裝 args 引數,kw key word
    def wrapper(*args,**kw):
        print(time.time())
        func(*args, **kw)
    return wrapper
複製程式碼

小技巧

# 可以處理任何引數列表
def fun1(*args,**kw):
    pass
複製程式碼

裝飾器場景

flask

相關文章