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>