python匿名函數(lambda)、函數參數(*args、**kwargs)、柯裡化及產生器

來源:互聯網
上載者:User

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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.