3-函數式編程

函數聲明

爲了代碼的可讀性,在定義一個函數的時候,最好有其函數參數的說明。示例:python

def func_test(s):
    """
    :type s: str
    :rtype: str
    """
    pass

實現這種效果能夠經過插件設置,好比在vscode裏面,咱們可使用 koroFileHeader 來實現這樣的功能,直接在vscode搜索安裝便可,而後根據其 github 裏面的說明進行配置git

函數的參數

Python中函數的參數有四種,分別是:github

位置參數
默認參數
可變參數
關鍵字參數

python 按照參數的位置來區別參數,位置參數的優先級是最高的,其次分別是默認參數,可變參數,關鍵字參數編程

def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

可變參數將傳入的參數包裝成一個tuple,關鍵字參數將傳入的參數包裝成一個dict,所以在函數中使用這些參數的時候,可使用 args 或者 kw 這樣的關鍵字來使用其中的值,由於在函數聲明的時候,是以這兩個關鍵字聲明的。app

高階函數

下面幾個函數在大多數編程語言裏面都有,屬於高階函數,它們接受函數做爲其中的參數:編程語言

map
reduce
filter
sorted

這些函數涉及到python的一個概念,iterator 和 iterable函數

Iterator 和 Iterable 的區別

Iterator 是惰性的,也就是說,一開始並不知道 下一個數是多少,只有使用了next ,它纔會去計算下一個數,這樣的好處是什麼呢?這樣就保證了不會一次性將大量的數據帶到內存裏面計算,只有用到的時候,在去計算插件

Iterable 則是相反的,它會一次把全部的數據所有帶到內存裏面,其中list,dict,tuple 都是Iterable 而不是 Iteratorcode

map

map()函數接收兩個參數,一個是函數,一個是Iterable,map將傳入的函數依次做用到序列的每一個元素,並把結果做爲新的Iterator返回。
代碼:排序

>>> def f(x):
...     return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

reduce

reduce 把一個函數做用在一個序列[x1, x2, x3, ...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素作累積計算

filter

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

sorted

sorted 函數也是一個高階函數,它還能夠接收一個key函數來實現自定義的排序

匿名函數

>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]

裝飾器

裝飾器是Python裏面很是有用的黑魔法,在許許多多的地方都會使用到裝飾器,從而使代碼複用,舉一個例子,假如存在有多個函數,調用每一個函數的時候,都須要通過認證,最好的作法就是把認證的代碼寫成一個裝飾器,而後加在每個函數的開頭。

#coding:utf-8
import functools
cert = {
    "username":"test",
    "password":"qwe123"

}

def authentication(func):
    @functools.wraps(func)
    def wrapper(*args,**kw):
        if cert["username"] == "test" and cert["password"] == "qwe123":
            return func(*args,**kw)
        else:
            print("auth failed")
    return wrapper


@authentication
def user_profile():
    print("Hello Here is user profile")


if __name__ == "__main__":
    user_profile()

裝飾器函數的代碼有必定的規律,寫起來大同小異,只是其中的業務邏輯不一樣。

相關文章
相關標籤/搜索