python的一些高階用法
阿新 • • 發佈:2020-01-05
map的用法
def fn(x):
return x*2
L1 = [1,2,3,4,5,6]
L2 = list(map(fn,L1))
L2
[2, 4, 6, 8, 10, 12]
通過上面的執行,可以知道map就是把一個數組內所有的元素都執行map加入的方法。
用法如下 map(方法,陣列)
reduce的用法
先看例子
from functools import reduce
def add(x,y):
return x + y
L1 = [1,2,3,4,5,6]
L2 = reduce(add,L1)
L2
21
通過上面的例子,直觀的來看,我們可以發現reduce和map方法有一些不一樣。
- map是python自帶的函式,而reduce需要引入functools
- map 返回的是一個map物件,而reduce是返回的一個數字
- map函式需要一個引數,而reduce的引數需要兩個。
map是對一個集合中的每個元素執行指定的方法。而reduce則是依次對集合的元素呼叫指定的方法。先把前兩個引數執行reduce以後形成的返回之作為第一個引數,再和第三個引數形成返回值,依次執行。
filter函式
filter則是對集合的每個元素執行一次判斷,能讓filter指定的函式返回真值則返回,否則則不出現在返回集合中。
def fn(x): return x%2 ==0 L1 = [1,2,3,4,5,6,7,8] F1 = filter(fn,L1) print(F1) print(list(F1))
<filter object at 0x7f1d38369358>
[2, 4, 6, 8]
sorted
顧名思義排序。用法如下
sorted(集合,key=排序的演算法,reverse=True) #reverse=True如果新增反向排序
返回函式(閉包)
def fn(x):
def add(y):
return x + y
return add
a = fn(5)
a(6)
11
需要注意的是閉包的程式碼是到最後執行a(6)的時候,才呼叫了函式裡面的執行。舉個例子
def fn(): rs = [] for i in range(4): def sub(): return i rs.append(sub) return rs a,b,c,d = fn() print(a()) print(b()) print(c()) print(d())
3
3
3
3
從上面的例子中,我們如果沒有理解到返回的函式是在最後加上括號的時候才呼叫,可能以為返回之是0,1,2,3
但是實際上def sub()裡面的內容一直都沒執行,但是外面的i 一直到了3.當呼叫a()的時候。開始執行。所以如上面的返回結果。
def efn():
i = 1
def sub():
i = i + 1
return i
return sub
t = efn()
t()
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-15-7574f0a729df> in <module>()
7
8 t = efn()
----> 9 t()
<ipython-input-15-7574f0a729df> in sub()
2 i = 1
3 def sub():
----> 4 i = i + 1
5 return i
6 return sub
UnboundLocalError: local variable 'i' referenced before assignment
上面的報錯,需要引入關鍵詞nonlocal 如下:
def efn():
i = 1
def sub():
#關鍵字
nonlocal i
i = i + 1
return i
return sub
t = efn()
print(t())
print(t())
2
3
匿名函式
list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
通過上面的式子我們簡單可以看到lambda函式或者匿名函式的意義
f = lambda x,y:x + y
f(5,6)
11
我們大概可以看到lambda函式的:前面相當於引數,後面的是返回數值
裝飾器
我的理解類似java中的AOP或者.net中的面向切片程式設計
'''比如呼叫一個方法的時候,我們期望另外一個方法也被呼叫。比如我們執行一個操作,期望不改變任何程式碼,就可以打印出來這個方法的日誌'''
def log(func):
def wraper(*args,**kw):
print(func.__name__+' is call to log')
return func(*args,**kw)
return wraper
@log
def fn():
print('this is fn')
fn()
fn is call to log
this is fn
''' 如果我們希望往log裡面傳遞引數'''
def log(text):
def decorator(func):
def wraper(*args,**kw):
print(func.__name__+' is call to log ' + text)
return func(*args,**kw)
return wraper
return decorator
@log('hello')
def fn():
print('fn')
fn()
fn.__name__
fn is call to log hello
fn
'wraper'
fn的名稱發生了改變,要保持不變,需要@functools.wraps(func)
''' 如果我們希望往log裡面傳遞引數'''
import functools
def log(text):
def decorator(func):
@functools.wraps(func)
def wraper(*args,**kw):
print(func.__name__+' is call to log ' + text)
return func(*args,**kw)
return wraper
return decorator
@log('hello')
def fn():
print('fn')
fn()
fn.__name__
fn is call to log hello
fn
'fn'
以上的內容參考學習 廖學峰的學習網站