python的一些高階用法

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(方法,數組)java

reduce的用法

先看例子python

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方法有一些不同。算法

  1. map是python自帶的函數,而reduce須要引入functools
  2. map 返回的是一個map對象,而reduce是返回的一個數字
  3. 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)的時候,才調用了函數裏面的執行。舉個例子app

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'

以上的內容參考學習 廖學峯的學習網站

相關文章
相關標籤/搜索