匿名函式
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
複製程式碼