python學習——基礎(五)

函數式編程就是一種抽象程度很高的編程範式,純粹的函數式編程語言編寫的函數沒有變量,所以,任意一個函數,只要輸入是肯定的,輸出就是肯定的,這種純函數咱們稱之爲沒有反作用。而容許使用變量的程序設計語言,因爲函數內部的變量狀態不肯定,一樣的輸入,可能獲得不一樣的輸出,所以,這種函數是有反作用的。 python

函數式編程的一個特色就是,容許把函數自己做爲參數傳入另外一個函數,還容許返回一個函數! 編程

Python對函數式編程提供部分支持。因爲Python容許使用變量,所以,Python不是純函數式編程語言。 app

map函數:對list的每一個元素做用於傳入的函數中 編程語言

def fc(x):
    return x*x

print map(fc, [1, 2, 3, 4, 5, 6, 7, 8, 9])# 將list的每一個元素在fc中調用;參數:函數、list

結果:
[1, 4, 9, 16, 25, 36, 49, 64, 81]


reduce函數:對list的前兩個元素迭代的做用於傳入的函數


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

List = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print reduce(prod,List)# 相似於1,2先傳入prod,2*3傳入,6*4傳入...

結果:
362880


filter函數:map()相似,filter()也接收一個函數和一個序列。和map()不一樣的時,filter()把傳入的函數依次做用於每一個元素,而後根據返回值是True仍是False決定保留仍是丟棄該元素 函數式編程

def is_odd(n):
    return n % 2 == 1

filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
# 結果: [1, 5, 9, 15]


把一個序列中的空字符串刪掉: 函數

def not_empty(s):
    return s and s.strip()# 「s字符串」 與 「s字符串首尾刪除空格後的字符串」的交集

filter(not_empty, ['A', '', 'B', None, 'C', '  '])
# 結果: ['A', 'B', 'C']


filter() 刪除1~100的奇數:


L = range(1,101)
print L

def dealMethond(x):
    return x%2 == 0

print filter(dealMethond, L) # 對L中的元素進行過濾


sorted對元素進行排序: spa

def reverse(s1, s2):
    if s1 < s2:
        return 1
    elif s1 == s2:
        return 0
    else :
        return -1

List = ['a', 1, 'd', 'b','120']
print sorted(List, reverse) # 能夠自定義排序規則

結果:['d', 'b', 'a', '120', 1]


注: 一般是函數參數在前,可是sorted的函數參數是可選的,放在第二個調用比較方便,不然你必須傳入

sorted(None, list)

返回函數: 設計

高階函數除了能夠接受函數做爲參數外,還能夠把函數做爲結果值返回 code

def count():
    fs = []
    for i in range(1, 4):
        def square(i):
            def func():
                return i*i
            return func
        fs.append(square(i))
    return fs

f1, f2, f3 = count()
print f1(), f2(), f3()


func函數做爲返回值;即便傳入的參數一致,返回的函數也是不相同的;

匿名函數: 對象

關鍵字lambda表示匿名函數匿名函數有個限制,就是隻能有一個表達式,不用寫return,返回值就是該表達式的結果。用匿名函數有個好處,由於函數沒有名字,沒必要擔憂函數名衝突。此外,匿名函數也是一個函數對象,也能夠把匿名函數賦值給一個變量,再利用變量來調用該函數

能夠把匿名函數做爲返回值返回:

def count():
    fs = []
    for i in range(1, 4):
        def func(i):
            return lambda i = i: i*i
        fs.append(func(i))
    return fs

f1, f2, f3 = count()
print f1(), f2(), f3()


裝飾器:

decorator就是一個返回函數的高階函數

def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        print '%s():%s' % (func.__name__, args[0])
        return func(*args, **kw)
    return wrapper

@log
def f(name):
    return 'f now %s' % name

print f('syc')

結果:
f():syc
f now syc


當log帶參數時:

def log(text=None):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print '%s():%s:%s' % (func.__name__, args[0], text)
            return func(*args, **kw)
        return wrapper
    return decorator

@log('execute')
def f(name):
    return 'f now %s' % name

print f('syc')

結果:
f():syc:execute
f now syc


偏函數:

使用functools.partial能夠建立一個新的函數,這個新函數能夠固定住原函數的部分參數,從而在調用時更簡單。

int2 = functools.partial(int, base=8)

print int2('10001011')

結果:2097673
相關文章
相關標籤/搜索