Python進階(二)

高階函數

1.把函數做爲參數傳入,這樣的函數稱爲高階函數,函數式編程就是指這種高度抽象的編程範式。

2.Python內建了map( )和reduce( ) 函數

map()函數接收兩個參數,一個是函數,一個是Iterable,map將傳入的函數依次做用到序列的每一個元素,並把結果做爲新的Iterator返回。
reduce把一個函數做用在一個序列[x1, x2, x3, ...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素作累積計算。python

3.filter()函數用於過濾序列

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

filter()的做用是從一個序列中篩出符合條件的元素。因爲filter()使用了惰性計算,因此只有在取filter()結果的時候,纔會真正篩選並每次返回下一個篩出的元素

回數

def is_palindrome(n):
           return n==int(str(n)[::-1])

output = filter(is_palindrome, range(1, 1000))
print('1~1000:', list(output))
if list(filter(is_palindrome, range(1, 200))) == [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191]:
    print('測試成功!')
else:
    print('測試失敗!')

注意:先整數變字符串,再字符串倒序,而後變成整數,最後比較原來的數。這裏變爲整數的緣由,是由於你傳入的n是整數,而倒敘以後的是str類型。整數和str沒法做比較。此處也可修改成:return str(n) == str(n)[::-1]。

4.sorted 排序的核心是比較兩個元素的大小。若是是數字,咱們能夠直接比較,但若是是字符串或者兩個dict呢?直接比較數學上的大小是沒有意義的,所以,比較的過程必須經過函數抽象出來。

sorted()函數也是一個高階函數,它還能夠接收一個key函數來實現自定義的排序,例如按絕對值大小排序:閉包

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

要進行反向排序,沒必要改動key函數,能夠傳入第三個參數reverse=True:
***app

返回函數

閉包(比較好的兩個例題對比)

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

f1, f2, f3 = count()
***
>>> f1()
9
>>> f2()
9
>>> f3()
9

緣由就在於返回的函數引用了變量i,但它並不是馬上執行。等到3個函數都返回時,它們所引用的變量i已經變成了3,所以最終結果爲9。函數式編程

返回閉包時牢記一點:返回函數不要引用任何循環變量,或者後續會發生變化的變量。

def count():
    def f(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i)) # f(i)馬上被執行,所以i的當前值被傳入f()
    return fs
***
>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9

例題:利用閉包返回一個計數器函數,每次調用它返回遞增整數

def createCounter():
    i = 0
    def counter():
        print(i)
        i += 1
        return i
    return counter

def createCounter():
    i = [0]
    def counter():
        i[0] += 1
        return i
    return counter

也能夠使用生成器函數

def createCounter():
    def num():
        n = 1
        while 1:
            yield n
            n = n + 1

    n = num()
    def counter():
        return next(n)
    return counter

相關文章
相關標籤/搜索