高階函數

1、高進函數

In [1]: def counter(base):
   ...:     def inc(x=1):
   ...:         nonlocal base
   ...:         base += x
   ...:         return base
   ...:     return inc
   ...: 

In [2]: inc = counter(3)

In [3]: inc(3)
Out[3]: 6

In [4]:
In [4]: def fn():
   ...:     print('fn called')
   ...:     

In [5]: f = fn

In [6]: f()
fn called

In [7]:

當函數做爲返回值的時候,就稱爲高階函數python

In [12]: def sort(it):
    ...:     ret = []
    ...:     for x in it:
    ...:         for i, e in enumerate(ret):
    ...:             if x > e:
    ...:                 ret.insert(i, x)
    ...:                 break
    ...:         else:
    ...:             ret.append(x)
    ...:     return ret
    ...:             

In [13]: sort([1, 4, 7, 2, 3, 10, 8])
Out[13]: [10, 8, 7, 4, 3, 2, 1]

In [14]:
In [1]: def sort(it, r=False):
   ...:     ret = []
   ...:     for x in it:
   ...:         for i, e in enumerate(ret):
   ...:             if r :
   ...:                 if x < e:
   ...:                     ret.insert(i, x)
   ...:                     break
   ...:             else:
   ...:                 if x > e:
   ...:                     ret.insert(i, x)
   ...:                     break
   ...:         else:
   ...:             ret.append(x)
   ...:     return ret
   ...:                     

In [2]: sort([1, 4, 7, 2, 3, 10, 8])
Out[2]: [10, 8, 7, 4, 3, 2, 1]

In [3]: sort([1, 4, 7, 2, 3, 10, 8], True)
Out[3]: [1, 2, 3, 4, 7, 8, 10]
In [7]: def sort(it, cmp=lambda a, b: a < b):
   ...:     ret = []
   ...:     for x in it:
   ...:         for i, e in enumerate(ret):
   ...:             if cmp(x, e):
   ...:                 ret.insert(i, x)
   ...:                 break
   ...:         else:
   ...:             ret.append(x)
   ...:     return ret
   ...:             

In [8]: sort([1, 4, 7, 2, 3, 10, 8])
Out[8]: [1, 2, 3, 4, 7, 8, 10]

In [9]: sort([1, 4, 7, 2, 3, 10, 8], lambda a, b: a > b)
Out[9]: [10, 8, 7, 4, 3, 2, 1]

In [10]:
In [10]: def counter(i):
    ...:     base = i
    ...:     def inc(x=1):
    ...:         nonlocal base
    ...:         base += x
    ...:         return base
    ...:     return inc
    ...: 

In [11]: inc = counter(3)

In [12]: inc(3)
Out[12]: 6
In [15]: def logger(fn):
    ...:     def wrap(*args, **kwargs):
    ...:         print('call {}'.format(fn.__name__))
    ...:         ret = fn(*args, **kwargs)
    ...:         print('{} called'.format(fn.__name__))
    ...:         return ret
    ...:     return wrap
    ...: 

In [16]: def add(x, y):
    ...:     return x + y
    ...: 

In [17]: logged_add = logger(add)

In [18]: logged_add(3, 4)
call add
add called
Out[18]: 7

In [19]:
In [19]: import datetime

In [20]: def logger(fn):
    ...:     def wrap(*args, **kwargs):
    ...:         start = datetime.datetime.now()
    ...:         ret = fn(*args, **kwargs)
    ...:         end = datetime.datetime.now()
    ...:         print('{} called took {}'.format(fn.__name__, end - start))
    ...:         return ret
    ...:     return wrap
    ...: 

In [21]: import time

In [22]: def sleep(x):
    ...:     time.sleep(x)
    ...:     

In [23]: logged_add = logger(sleep)

In [24]: logged_add(3)
sleep called took 0:00:03.003101

In [25]: @logger                            # 裝飾器
    ...: def sleep(x):
    ...:     time.sleep(x)
    ...:     

In [26]: sleep(3)
sleep called took 0:00:03.000086

In [27]:
In [16]: def logger(fn):
    ...:     def wrap(*args, **kwargs):
    ...:         print(args)
    ...:         print(kwargs)
    ...:         start = datetime.datetime.now()
    ...:         ret = fn(*args, **kwargs)
    ...:         end = datetime.datetime.now()
    ...:         print('{} called took {}'.format(fn.__name__, end - start))
    ...:         return ret
    ...:     return wrap
    ...: 

In [17]: def add(x, y):
    ...:     return x + y
    ...: 

In [18]: f = logger(add)

In [19]: f(1, 3)
(1, 3)
{}
add called took 0:00:00.000014
Out[19]: 4
In [20]: f
Out[20]: <function __main__.logger.<locals>.wrap>

In [21]: f
Out[21]: <function __main__.logger.<locals>.wrap>

In [22]: @logger
    ...: def add(x, y):
    ...:     return x + y
    ...: 

In [23]: add
Out[23]: <function __main__.logger.<locals>.wrap>
相關文章
相關標籤/搜索