1、匿名函數
通過lambda關鍵字進行定義,語句的結果就是傳回值,如下所示:
In [32]: def sho_function(a): ...: return a**2 ...:In [33]: equiv = lambda a : a**2In [34]: print(equiv(3))9
2、函數的參數
python中,函數參數的工作方式是很簡單的,如編寫的函數function(a, b, c, d=some , e=value)時,位置和關鍵字參數分別被打包成元組和字典,函數實際接收到的是一個元組args和一個字典kwargs,自動在內部做如下轉換:
a, b, c = args
d = kwargs('d', d_default_value)
e = kwargs('e', e_default_value)
如下面的樣本:
In [35]: def argsfunction(*args, **kwargs): ...: print('args is ',args) ...: print('kwargs is ',kwargs) ...: print('first value in args is ',args[0]) ...: print('key \'kw1\' value is' ,kwargs.get('kw1','java')) ...:In [36]: argsfunction(2, 4, kw1='thon', kw2='py')args is (2, 4)kwargs is {'kw1': 'thon', 'kw2': 'py'}first value in args is 2key 'kw1' value is thon
3、柯裡化:部分參數的應用
柯裡化是指通過“部分參數應用”從現有函數派生出新函數的技術,如下面的應用:
In [37]: def add_number(x, y): ...: return x+y ...:In [38]: add_five = lambda y : add_number(5, y)In [39]: print(add_five(10))15
add_number的第二個參數被稱為“柯裡化的”,其實質就是定義了一個可以調用現有函數的新函數而已。內建的functools模組可以用partial函數將此過程簡化。如下所示:
In [1]: def add_numbers(x, y): ...: return x + y; ...:In [2]: from functools import partialIn [3]: add_six = partial(add_numbers, 6)In [4]: print(add_six(10))16
4、 產生器
產生器(generator)是構造新的可迭代對象的一種簡單方式,一般的函數執行之後只會返回單個值,而產生器是以延遲的方式返回一個值序列,即每返回一個值之後暫停,直到下一個值被請求時再繼續。建立一個產生器,只需將函數中的return替換為yield即可,請看下面的樣本:
In [5]: #函數In [6]: def squares1(n=10): ...: print('generating squares from 1 to %d' % (n ** 2)) ...: for i in range(1, n+1): ...: return i ** 2 ...:In [7]: sq1=squares1()generating squares from 1 to 100
In [8]: #產生器In [9]: def squares2(n=10): ...: print('generating squares from 1 to %d' % (n ** 2)) ...: for i in range(1, n+1): ...: yield i ** 2 ...:In [10]: gen = squares2()In [11]: genOut[11]: <generator object squares2 at 0x000001F35699D8E0>In [12]: for x in gen: ...: print(x) ...:generating squares from 1 to 100149162536496481100
產生器運算式(generator expression):是構造產生器的最簡單方式,產生器也有一個類似於列表、字典、集合推導式的東西,建立方式為:把列表推導式兩端的方括弧(中括弧)改成圓括弧(小括弧),如下所示:
In [13]: gen2 = (x ** 2 for x in range(100))In [14]: gen2Out[14]: <generator object <genexpr> at 0x000001F356A92CA8>
產生器運算式可用於任何接受產生器的python函數中,如下所示:
In [15]: sum (x ** 2 for x in range(100))Out[15]: 328350
itertools模組:標準庫itertools模組中有一組用於常見資料演算法的產生器,比如groupby可以接受任何序列和一個函數,他根據函數的傳回值對序列中的連續元素進行分組(注意是連續元素),所下面的例子:
In [16]: #itertools模組 ...: import itertools ...: first_letter = lambda x:x[0] ...: names=['Alan', 'ABC', 'Test', 'Tom', 'ACT', 'Why'] ...: for letter, names in itertools.groupby(names, first_letter): ...: print(letter, list(names)) ...:A ['Alan', 'ABC']T ['Test', 'Tom']A ['ACT']W ['Why']
常見的itertools函數如下:
(1)imap(func, *iterables):內建函數map的產生器版,將func應用於參數序列的各個打包元組;
(2)ifilter(func, iterable):內建函數filter的產生器版,當func(x)為True時輸出元素x;
(3)combinations(iterable, k):產生一個由iterable中所有可能的k元元組構成的序列(不考慮順序);
(4)permutations(iterable, k):產生一個由iterable中所有可能的k元元組構成的序列(考慮順序);
(5)groupby(iterable[, keyfunc]):為每個唯一鍵產生一個(key, subitrator)。