1. 程式人生 > >Python進階(十四)- 基礎課程結課總結:高階函式

Python進階(十四)- 基礎課程結課總結:高階函式

分享一下我的偶像大神的人工智慧教程!http://blog.csdn.net/jiangjunshow

也歡迎轉載我的文章,轉載請註明出處 https://blog.csdn.net/mm2zzyzzp

Python進階(十四)- 基礎課程結課總結:高階函式

  在慕課網完成了廖雪峰老師的《Python入門》與《Python進階》兩門基礎課程。在此做一下簡單的知識點小結。

函數語言程式設計

  Python特點:

  • 不是純函數語言程式設計(允許變數存在);
  • 支援高階函式(可以傳入函式作為變數);
  • 支援閉包(可以返回函式);
  • 有限度的支援匿名函式;

  高階函式:

  • 變數可以指向函式;
  • 函式的引數可以接收變數;
  • 一個函式可以接收另一個函式作為引數;
def add(x,y,f):  
    return f(x)+f(y)  
#14
add(-5,9,abs)  
  
  • 1
  • 2
  • 3
  • 4

內建高階函式map()

  map函式有兩個引數,一個是函式,另一個是列表,返回值為對傳入的列表中每一個元素執行傳入的函式操作之後得到的列表;

def format_name(s):  
    return s.title()

print map(format_name, ['adam'
, 'LISA', 'barT'])
  • 1
  • 2
  • 3
  • 4

內建高階函式reduce()

  reduce函式也有兩個引數,一個是函式,另一個是列表,返回值為對list的每一個元素反覆呼叫函式f,得到最終結果,以下函式為連乘;

def prod(x, y):  
    return x*y;  

print reduce(prod, [2, 4, 5, 7, 12])  
  
  • 1
  • 2
  • 3
  • 4

內建高階函式filter()

  filter函式接受函式引數f和列表引數lst,f對lst元素進行判斷,返回lst元素中呼叫f函式結果為true的元素組成的列表(將不滿足f函式條件的元素過濾掉);

import math  

def is_sqr(x):  
    return int(math.sqrt(x))*int(math.sqrt(x))==x  

print filter(is_sqr, range(1, 101))  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

自定義排序函式sorted()

  sorted函式接受一個列表lst和一個函式引數f,f為自定義的比較lst元素大小的函式,返回值為lst中元素按f函式排列的列表;

def cmp_ignore_case(s1, s2):  
    return cmp(s1.lower(),s2.lower())  

print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
  
  • 1
  • 2
  • 3
  • 4

返回函式:

def calc_prod(lst):  
    def prod(x,y):  
        return x*y;  
    def g():
        return reduce(prod,lst)  
    return g; 

f = calc_prod([1, 2, 3, 4])  
print f()  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

閉包

  內層函式使用外層函式的引數,然後返回內層函式;

def count():  
    fs = []  
    for i in range(1, 4):  
        def f(j):  
            def g():  
              return j*j;  
            return g  
        fs.append(f(i))  
    return fs  

f1, f2, f3 = count()  
print f1(), f2(), f3()  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

匿名函式

  傳入函式引數不需要顯式定義函式,可以用lambda x:statement x為引數,statement為對引數執行的語句;

def is_not_empty(s):  
    return s and len(s.strip()) > 0  

print filter(lambda s:s and len(s.strip())>0, ['test', None, '', 'str', '  ', 'END'])  
  
  • 1
  • 2
  • 3
  • 4

裝飾器

  給函式新增新功能,並簡化該函式呼叫;

無引數裝飾器

def log(f): 
    def fn(*args, **kw): #*args,**kw保證對任意個數引數都能正常呼叫  
        print 'call ' + f.__name__ + '()...'  
        return f(*args, **kw)
    return fn

@log   #呼叫日誌裝飾器  
def factorial(n):  
    return reduce(lambda x,y: x*y, range(1, n+1))  
#call factorial()...  
#3628800  
print factorial(10)  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

帶引數裝飾器

def log(prefix):  
    def log_decorator(f):  
        def wrapper(*args, **kw):  
            print '[%s] %s()...' % (prefix, f.__name__)  
            return f(*args, **kw)  
        return wrapper  
    return log_decorator  

@log('DEBUG') #DEBUG為給裝飾器傳入的引數  
def test():  
    pass  
#[DEBUG] test()...  
#None  
print test()  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

  利用functool.wraps作用在返回的新函式上,使得呼叫裝飾器以後不改變原函式的資訊

import time, functools  
def performance(unit):  
    def perf_decorator(f):  
        @functools.wraps(f)  
        def wrapper(*args, **kw):  
            t1 = time.time()  
            r = f(*args, **kw)  
            t2 = time.time()  
            t = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1)  
            print 'call %s() in %f %s' % (f.__name__, t, unit)  
            return r  
        return wrapper  
    return perf_decorator  

@performance('ms')  
def factorial(n):  
    return reduce(lambda x,y: x*y, range(1, n+1))  
print factorial.__name__  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

偏函式

  functools.partial(f,f的預設引數) 減少需要提供給f的引數

import functools  
int2 = functools.partial(int, base=2)  
int2('1000000')  #64
  
  • 1
  • 2
  • 3


這裡寫圖片描述

給我偶像的人工智慧教程打call!http://blog.csdn.net/jiangjunshow