日常Python學習-4

2018.3.11

1.高階函數舉例

編寫高階函數,就是讓函數的參數能夠接收別的函數。

  • 變量可以指向函數:
>>> f=abs
>>> f(-1)
1
  • 傳入參數可以是函數
def add(x, y, f):
    return f(x) + f(y)

調用的時候, f 的位置傳一個函數進去就好

2.map/reduce

map和reduce都是內置模塊中的函數,介紹一下他們的功能和參數:

  • map
    map()函數接收兩個參數,一個是函數,一個是Iteratable對象.作用是把函數作用在Iterator的每個元素上,並作爲一個新的Iterator返回結果.
>>> def f(x):
...     return x*x
... 
>>> ans = map(f,[1,2,3,4,5])
>>> ans
<map object at 0x7f9546341240>
>>> list(ans)
[1, 4, 9, 16, 25]

# map應用舉例
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
  • reduce
    reduce把一個函數作用在一個序列[x1, x2, x3, …]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

可以看一個str轉換成int的例子:使用reduce前需要從functools裏import一下

DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}

def str2int(s):
    def fn(x, y):
        return x * 10 + y
    def char2num(s):
        return DIGITS[s]
    return reduce(fn, map(char2num, s))

這個函數還可以用lambda寫的更簡單一點:

from functools import reduce

DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}

def char2num(s):
    return DIGITS[s]

def str2int(s):
    return reduce(lambda x, y: x * 10 + y, map(char2num, s))
3.sorted()

sorted函數用來對一個Iteraterable的對象進行排序,它還可以接收一個key函數來實現自定義的排序,接受一個bool值的reverse來表示升序和降序:sorted(iterable, key=None, reverse=False),如果不加False,則是返回一個升序的包含所有item的list.

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
4.函數作爲返回值和閉包

返回的是函數,返回時不會進行調用.只有在之後調用時,返回的函數纔會運行.

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
>>> f()
>>> 25

由此可以引出閉包結構,可以把閉包簡單理解成”定義在一個函數內部的函數”.閉包的作用有兩個:
1.讀取函數內部的變量 2.讓這些變量的值始終保持在內存中

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
5.匿名函數

以map爲例子寫一個帶lambda的式子:

>>> 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表達式,這就是一個匿名函數.和下面這個等價

def f(x):
    return x * x

關鍵字lambda表示匿名函數,冒號前面的x表示函數參數。

匿名函數有個限制,就是隻能有一個表達式,不用寫return,返回值就是該表達式的結果.當然也可以把匿名函數賦值給變量再進行調用

>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x101c6ef28>
>>> f(5)
25

def build(x,y):
    return lambda: x*x +y*y
f = build(1,5)
print f
print f()
# <function <lambda> at 0x025377F0>
# 26
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章