lambda表達(dá)式
def add(x, y):
return x + y
print(add(1, 2))
f = lambda x, y: x + y
print(f(1, 2))
匿名函數(shù)的簡(jiǎn)單使用斟赚。
匿名函數(shù)最適合的場(chǎng)景是需要傳入函數(shù)作為參數(shù)着降,返回值的操作不復(fù)雜的地方
python對(duì)匿名函數(shù)的支持非常有限
三元表達(dá)式
表達(dá)式版本的if...else...
其他語(yǔ)言的表達(dá)式x > y ? x : y
python的表達(dá)式 x if x > y else y
三元表達(dá)式經(jīng)常用在lambda匿名函數(shù)中
map
list_x = [1, 2, 3, 4, 5, 6, 7, 8]
def f1(x):
return x * x
list_y = map(f1, list_x)
print(list_y) # 生成的是惰性的序列
print(list(list_y))
map會(huì)對(duì)可迭代對(duì)象的每一項(xiàng)執(zhí)行函數(shù) f1 并返回新的可迭代對(duì)象
map與lambda
list_x = [1, 2, 3, 4, 5, 6, 7, 8]
list_y = map(lambda x: x * x, list_x)
print(list_y) # 生成的是惰性的序列
print(list(list_y))
傳入多個(gè)參數(shù)的map,將計(jì)算幾個(gè)參數(shù)中長(zhǎng)度最短的序列次數(shù)的映射(下例中為6次)
# map
list_x = [1, 2, 3, 4, 5, 6, 7, 8]
list_y = [1, 2, 3, 4, 5, 6]
r1 = map(lambda x: x * x, list_x)
print(r1) # 生成的是惰性的序列
print(list(r1))
r2 = map(lambda x, y: x + y, list_x, list_y)
print(r2)
print(list(r2))
map 和 reduce 組合 能非常簡(jiǎn)單地構(gòu)建一個(gè)字符串轉(zhuǎn)換成整數(shù)的方法 ->
from functools import reduce
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def char2num(s):
return DIGITS[s]
def str2int(s):
return reduce(lambda x, y: x * 10 + y, map(char2num, s))
reduce
from functools import reduce
list_x = [1, 2, 3, 4, 5, 6, 7, 8]
r2 = reduce(lambda x, y: x + y, list_x)
print(r2)
reduce運(yùn)算規(guī)則拗军,連續(xù)計(jì)算任洞,調(diào)用列表的第一個(gè)和第二個(gè)參數(shù),通過(guò)傳入的函數(shù)進(jìn)行計(jì)算发侵,返回值作為第一個(gè)參數(shù)交掏,然后從列表讀取第三個(gè)參數(shù)作為函數(shù)的第二個(gè)參數(shù),再進(jìn)行計(jì)算刃鳄。盅弛。。直至參數(shù)調(diào)用結(jié)束叔锐。返回計(jì)算值挪鹏。
二維數(shù)組的累加(累積計(jì)算,本處為相加)
reduce(func, param, initial) 函數(shù)愉烙、參數(shù)列表讨盒、初始值
from functools import reduce
move_list = [(1, 1), (-2, 1), (1, -3), (2, -4)]
result = reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), move_list, (10, 10))
print(result)
大數(shù)據(jù)計(jì)算模型: map/reduce
編程模型 map 映射 reduce 歸約
大規(guī)模并行計(jì)算
借鑒思想:函數(shù)式編程
filter
過(guò)濾
def _not_divisible(n):
return lambda x: x % n > 0
def primes():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一個(gè)數(shù)
yield n
it = filter(_not_divisible(n), it) # 構(gòu)造新序列
判斷列表字符是否大寫,如果不是則去除齿梁,是則保留
list_u = ["a", "B", "c", "F", "e"]
re_d2 = filter(lambda s: s if s.isupper() else "", list_u)
print(list(re_d2))
命令式編程vs函數(shù)式編程
命令式編程:
func
條件判斷
循環(huán)
函數(shù)式編程: # 理論上可以用map\reduce 替換所有 if..else... for
map
reduce
filter
lambda 算子
裝飾器
更多的是一種設(shè)計(jì)模式
裝飾器 二
import time
def time_dec(func):
def func__(*args, **kw):
print(time.time())
return func(*args, **kw)
return func__
@time_dec
def f1(name):
print("This is a function" + name)
f1("name)
裝飾器 三
語(yǔ)法糖 @funcname
采用了語(yǔ)法糖裝飾函數(shù)催植,沒帶括號(hào),已經(jīng)運(yùn)行了一層勺择。
需要注意調(diào)用和引用的區(qū)別,需要注意調(diào)用次數(shù)和引用次數(shù)伦忠。
python裝飾器大量應(yīng)用了AOP的設(shè)計(jì)模式及思想:
在軟件業(yè)省核,AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程昆码,通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)气忠。
https://baike.baidu.com/item/AOP/1332219?fr=aladdin
裝飾器 四
非常經(jīng)典的關(guān)于多重裝飾器的裝飾順序,應(yīng)該深入理解赋咽。
def decorator_a(func):
print('Get in decorator_a')
def inner_a(*args, **kwargs):
print('Get in inner_a')
return func(*args, **kwargs)
return inner_a
def decorator_b(func):
print('Get in decorator_b')
def inner_b(*args, **kwargs):
print('Get in inner_b')
return func(*args, **kwargs)
return inner_b
@decorator_b
@decorator_a
def f(x):
print('Get in f')
return x * 2
# 初始化的時(shí)候旧噪,先初始化a,a才能返回一個(gè)函數(shù)對(duì)象用于初始化b脓匿,否則沒有對(duì)象給b去初始化淘钟。
# 初始化完成之后,返回的是一個(gè)b函數(shù)陪毡,調(diào)用b函數(shù)米母,才能返回a函數(shù)的調(diào)用從而完成整個(gè)裝飾過(guò)程
f(1)
裝飾器的傳入?yún)?shù)勾扭,因?yàn)槠渫ㄓ眯裕枰獋魅肟勺儏?shù):*args, **kwargs铁瞒。妙色。。
裝飾器 五
加上關(guān)鍵字參數(shù)
裝飾器 六
收尾
裝飾器思想:
想對(duì)某一個(gè)被封裝的單元修改某個(gè)功能慧耍,而不改變?cè)a身辨。(開閉原則)
對(duì)功能拓展
哪些地方會(huì)用到:
flask
多重裝飾