亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

跟老齊學(xué)Python之大話題小函數(shù)(1)

 更新時(shí)間:2014年10月10日 08:50:05   投稿:hebedich  
今天本講要講什么呢?今天要介紹幾個(gè)python中的小函數(shù),這幾個(gè)函數(shù)都是從函數(shù)式編程借鑒過(guò)來(lái)的,它們就是:filter、map、reduce、lambda、yield 有了它們,最大的好處是程序更簡(jiǎn)潔

開(kāi)篇就要提到一個(gè)大的話題:編程范型。什么是編程范型?引用維基百科中的解釋:

復(fù)制代碼 代碼如下:

編程范型或編程范式(英語(yǔ):Programming paradigm),(范即模范之意,范式即模式、方法),是一類典型的編程風(fēng)格,是指從事軟件工程的一類典型的風(fēng)格(可以對(duì)照方法學(xué))。如:函數(shù)式編程、程序編程、面向?qū)ο缶幊?、指令式編程等等為不同的編程范型?/p>

編程范型提供了(同時(shí)決定了)程序員對(duì)程序執(zhí)行的看法。例如,在面向?qū)ο缶幊讨?,程序員認(rèn)為程序是一系列相互作用的對(duì)象,而在函數(shù)式編程中一個(gè)程序會(huì)被看作是一個(gè)無(wú)狀態(tài)的函數(shù)計(jì)算的串行。
 
正如軟件工程中不同的群體會(huì)提倡不同的“方法學(xué)”一樣,不同的編程語(yǔ)言也會(huì)提倡不同的“編程范型”。一些語(yǔ)言是專門為某個(gè)特定的范型設(shè)計(jì)的(如Smalltalk和Java支持面向?qū)ο缶幊?,而Haskell和Scheme則支持函數(shù)式編程),同時(shí)還有另一些語(yǔ)言支持多種范型(如Ruby、Common Lisp、Python和Oz)。
 
編程范型和編程語(yǔ)言之間的關(guān)系可能十分復(fù)雜,由于一個(gè)編程語(yǔ)言可以支持多種范型。例如,C++設(shè)計(jì)時(shí),支持過(guò)程化編程、面向?qū)ο缶幊桃约胺盒途幊?。然而,設(shè)計(jì)師和程序員們要考慮如何使用這些范型元素來(lái)構(gòu)建一個(gè)程序。一個(gè)人可以用C++寫(xiě)出一個(gè)完全過(guò)程化的程序,另一個(gè)人也可以用C++寫(xiě)出一個(gè)純粹的面向?qū)ο蟪绦颍踔吝€有人可以寫(xiě)出雜揉了兩種范型的程序。

不管看官是初學(xué)者還是老油條,都建議將上面這段話認(rèn)真讀完,不管理解還是不理解,總能有點(diǎn)感覺(jué)的。

這里推薦一篇文章,這篇文章來(lái)自網(wǎng)絡(luò):《主要的編程范型》

扯了不少編程范型,今天本講要講什么呢?今天要介紹幾個(gè)python中的小函數(shù),這幾個(gè)函數(shù)都是從函數(shù)式編程借鑒過(guò)來(lái)的,它們就是:

filter、map、reduce、lambda、yield

有了它們,最大的好處是程序更簡(jiǎn)潔;沒(méi)有它們,程序也可以用別的方式實(shí)現(xiàn),只不過(guò)麻煩一些罷了。所以,還是能用則用之吧。

lambda

lambda函數(shù),是一個(gè)只用一行就能解決問(wèn)題的函數(shù),聽(tīng)著是多么誘人呀??聪旅娴睦樱?br />

復(fù)制代碼 代碼如下:

>>> def add(x):     #定義一個(gè)函數(shù),將輸入的變量增加3,然后返回增加之后的值
...     x +=3
...     return x
...
>>> numbers = range(10)
>>> numbers
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  #有這樣一個(gè)list,想讓每個(gè)數(shù)字增加3,然后輸出到一個(gè)新的list中

>>> new_numbers = []
>>> for i in numbers:
...     new_numbers.append(add(i))  #調(diào)用add()函數(shù),并append到list中
...
>>> new_numbers
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

 在這個(gè)例子中,add()只是一個(gè)中間操作。當(dāng)然,上面的例子完全可以用別的方式實(shí)現(xiàn)。比如:

復(fù)制代碼 代碼如下:

>>> new_numbers = [ i+3 for i in numbers ]
>>> new_numbers
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

 首先說(shuō)明,這種列表解析的方式是非常非常好的。

但是,我們偏偏要用lambda這個(gè)函數(shù)替代add(x),如果看官和我一樣這么偏執(zhí),就可以:

復(fù)制代碼 代碼如下:

>>> lam = lambda x:x+3
>>> n2 = []
>>> for i in numbers:
...     n2.append(lam(i))
...
>>> n2
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

 這里的lam就相當(dāng)于add(x),請(qǐng)看官對(duì)應(yīng)一下,這一行l(wèi)ambda x:x+3就完成add(x)的三行(還是兩行?),特別是最后返回值。還可以寫(xiě)這樣的例子:

復(fù)制代碼 代碼如下:

>>> g = lambda x,y:x+y  #x+y,并返回結(jié)果
>>> g(3,4)
7
>>> (lambda x:x**2)(4)  #返回4的平方
16

 通過(guò)上面例子,總結(jié)一下lambda函數(shù)的使用方法:
 •在lambda后面直接跟變量
 •變量后面是冒號(hào)
 •冒號(hào)后面是表達(dá)式,表達(dá)式計(jì)算結(jié)果就是本函數(shù)的返回值
 
為了簡(jiǎn)明扼要,用一個(gè)式子表示是必要的:

復(fù)制代碼 代碼如下:

lambda arg1, arg2, ...argN : expression using arguments

 要特別提醒看官:雖然lambda 函數(shù)可以接收任意多個(gè)參數(shù) (包括可選參數(shù)) 并且返回單個(gè)表達(dá)式的值,但是lambda 函數(shù)不能包含命令,包含的表達(dá)式不能超過(guò)一個(gè)。不要試圖向 lambda 函數(shù)中塞入太多的東西;如果你需要更復(fù)雜的東西,應(yīng)該定義一個(gè)普通函數(shù),然后想讓它多長(zhǎng)就多長(zhǎng)。

就lambda而言,它并沒(méi)有給程序帶來(lái)性能上的提升,它帶來(lái)的是代碼的簡(jiǎn)潔。比如,要打印一個(gè)list,里面依次是某個(gè)數(shù)字的1次方,二次方,三次方,四次方。用lambda可以這樣做:

復(fù)制代碼 代碼如下:

>>> lamb = [ lambda x:x,lambda x:x**2,lambda x:x**3,lambda x:x**4 ]
>>> for i in lamb:
...     print i(3),
...
3 9 27 81

 lambda做為一個(gè)單行的函數(shù),在編程實(shí)踐中,可以選擇使用。根據(jù)我的經(jīng)驗(yàn),盡量少用,因?yàn)樗蛟S更多地是為減少單行函數(shù)的定義而存在的。

map

先看一個(gè)例子,還是上面講述lambda的時(shí)候第一個(gè)例子,用map也能夠?qū)崿F(xiàn):

復(fù)制代碼 代碼如下:

>>> numbers
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      #把列表中每一項(xiàng)都加3

>>> map(add,numbers)                #add(x)是上面講述的那個(gè)函數(shù),但是這里只引用函數(shù)名稱即可
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

>>> map(lambda x: x+3,numbers)      #用lambda當(dāng)然可以啦
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

 map()是python的一個(gè)內(nèi)置函數(shù),它的基本樣式是:map(func, seq),func是一個(gè)函數(shù),seq是一個(gè)序列對(duì)象。在執(zhí)行的時(shí)候,序列對(duì)象中的每個(gè)元素,按照從左到右的順序,依次被取出來(lái),并塞入到func那個(gè)函數(shù)里面,并將func的返回值依次存到一個(gè)list中。

在應(yīng)用中,map的所能實(shí)現(xiàn)的,也可以用別的方式實(shí)現(xiàn)。比如:

復(fù)制代碼 代碼如下:

>>> items = [1,2,3,4,5]
>>> squared = []
>>> for i in items:
...     squared.append(i**2)
...
>>> squared
[1, 4, 9, 16, 25]

>>> def sqr(x): return x**2
...
>>> map(sqr,items)
[1, 4, 9, 16, 25]

>>> map(lambda x: x**2,items)
[1, 4, 9, 16, 25]

>>> [ x**2 for x in items ]     #這個(gè)我最喜歡了,一般情況下速度足夠快,而且可讀性強(qiáng)
[1, 4, 9, 16, 25]

 條條大路通羅馬,以上方法,在編程中,自己根據(jù)需要來(lái)選用啦。

在以上感性認(rèn)識(shí)的基礎(chǔ)上,在來(lái)瀏覽有關(guān)map()的官方說(shuō)明,能夠更明白一些。

復(fù)制代碼 代碼如下:

map(function, iterable, ...)

Apply function to every item of iterable and return a list of the results. If additional iterable arguments are passed, function must take that many arguments and is applied to the items from all iterables in parallel. If one iterable is shorter than another it is assumed to be extended with None items. If function is None, the identity function is assumed; if there are multiple arguments, map() returns a list consisting of tuples containing the corresponding items from all iterables (a kind of transpose operation). The iterable arguments may be a sequence or any iterable object; the result is always a list.

理解要點(diǎn):
 •對(duì)iterable中的每個(gè)元素,依次應(yīng)用function的方法(函數(shù))(這本質(zhì)上就是一個(gè)for循環(huán))。
 •將所有結(jié)果返回一個(gè)list。
 •如果參數(shù)很多,則對(duì)么個(gè)參數(shù)并行執(zhí)行function。
 
例如:

復(fù)制代碼 代碼如下:

>>> lst1 = [1,2,3,4,5]
>>> lst2 = [6,7,8,9,0]
>>> map(lambda x,y: x+y, lst1,lst2)     #將兩個(gè)列表中的對(duì)應(yīng)項(xiàng)加起來(lái),并返回一個(gè)結(jié)果列表
[7, 9, 11, 13, 5]

 請(qǐng)看官注意了,上面這個(gè)例子如果用for循環(huán)來(lái)寫(xiě),還不是很難,如果擴(kuò)展一下,下面的例子用for來(lái)改寫(xiě),就要小心了:

復(fù)制代碼 代碼如下:

>>> lst1 = [1,2,3,4,5]
>>> lst2 = [6,7,8,9,0]
>>> lst3 = [7,8,9,2,1]
>>> map(lambda x,y,z: x+y+z, lst1,lst2,lst3)
[14, 17, 20, 15, 6]

 這才顯示出map的簡(jiǎn)潔優(yōu)雅。

預(yù)告:下一講詳解reduce和filter

相關(guān)文章

  • python定時(shí)截屏實(shí)現(xiàn)

    python定時(shí)截屏實(shí)現(xiàn)

    這篇文章主要介紹了python定時(shí)截屏實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • scrapy爬蟲(chóng)完整實(shí)例

    scrapy爬蟲(chóng)完整實(shí)例

    這篇文章主要介紹了scrapy爬蟲(chóng)完整實(shí)例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • pymysql的簡(jiǎn)單封裝代碼實(shí)例

    pymysql的簡(jiǎn)單封裝代碼實(shí)例

    這篇文章主要介紹了pymysql的簡(jiǎn)單封裝代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 淺談python numpy中nonzero()的用法

    淺談python numpy中nonzero()的用法

    下面小編就為大家分享一篇淺談python numpy中nonzero()的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python數(shù)據(jù)類型之列表和元組的方法實(shí)例詳解

    Python數(shù)據(jù)類型之列表和元組的方法實(shí)例詳解

    這篇文章主要介紹了Python數(shù)據(jù)類型之列表和元組的相關(guān)知識(shí),列表是一組有序項(xiàng)目的集合 ,可變的數(shù)據(jù)類型可 進(jìn)行增刪改查,本文通過(guò)實(shí)例文字相結(jié)合的形式給大家介紹的非常詳細(xì) ,需要的朋友可以參考下
    2019-07-07
  • python實(shí)現(xiàn)彈窗祝福效果

    python實(shí)現(xiàn)彈窗祝福效果

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)彈窗祝福效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Python Excel vlookup函數(shù)實(shí)現(xiàn)過(guò)程解析

    Python Excel vlookup函數(shù)實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了Python Excel vlookup函數(shù)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python?Ajax爬蟲(chóng)案例分享

    Python?Ajax爬蟲(chóng)案例分享

    這篇文章主要介紹了Python?Ajax爬蟲(chóng)案例分享,文章會(huì)從街拍鏈接里面爬取圖片結(jié)構(gòu),下面文章對(duì)正在學(xué)習(xí)的你有一定的幫助,需要的小伙伴可以參考一下
    2022-02-02
  • python通過(guò)索引遍歷列表的方法

    python通過(guò)索引遍歷列表的方法

    這篇文章主要介紹了python通過(guò)索引遍歷列表的方法,實(shí)例分析了Python遍歷列表的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05
  • Python實(shí)現(xiàn)將內(nèi)容寫(xiě)入文件的五種方法總結(jié)

    Python實(shí)現(xiàn)將內(nèi)容寫(xiě)入文件的五種方法總結(jié)

    本篇帶你詳細(xì)看一下python將內(nèi)容寫(xiě)入文件的方法以及細(xì)節(jié),主要包括write()方法、writelines()?方法、print()?函數(shù)、使用?csv?模塊、使用?json?模塊,需要的可以參考一下
    2023-04-04

最新評(píng)論