国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[零基礎學python]大話題小函數(1)

xiguadada / 2107人閱讀

摘要:開篇就要提到一個大的話題編程范型。例如,在面向對象編程中,程序員認為程序是一系列相互作用的對象,而在函數式編程中一個程序會被看作是一個無狀態的函數計算的串行。

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

  

編程范型或編程范式(英語:Programming paradigm),(范即模范之意,范式即模式、方法),是一類典型的編程風格,是指從事軟件工程的一類典型的風格(可以對照方法學)。如:函數式編程、程序編程、面向對象編程、指令式編程等等為不同的編程范型。

  

編程范型提供了(同時決定了)程序員對程序執行的看法。例如,在面向對象編程中,程序員認為程序是一系列相互作用的對象,而在函數式編程中一個程序會被看作是一個無狀態的函數計算的串行。

  

正如軟件工程中不同的群體會提倡不同的“方法學”一樣,不同的編程語言也會提倡不同的“編程范型”。一些語言是專門為某個特定的范型設計的(如Smalltalk和Java支持面向對象編程,而Haskell和Scheme則支持函數式編程),同時還有另一些語言支持多種范型(如Ruby、Common Lisp、Python和Oz)。

  

編程范型和編程語言之間的關系可能十分復雜,由于一個編程語言可以支持多種范型。例如,C++設計時,支持過程化編程、面向對象編程以及泛型編程。然而,設計師和程序員們要考慮如何使用這些范型元素來構建一個程序。一個人可以用C++寫出一個完全過程化的程序,另一個人也可以用C++寫出一個純粹的面向對象程序,甚至還有人可以寫出雜揉了兩種范型的程序。

不管看官是初學者還是老油條,都建議將上面這段話認真讀完,不管理解還是不理解,總能有點感覺的。

這里推薦一篇文章,這篇文章來自網絡:《主要的編程范型》

扯了不少編程范型,今天本講要講什么呢?今天要介紹幾個python中的小函數,這幾個函數都是從函數式編程借鑒過來的,它們就是:

filter、map、reduce、lambda、yield

有了它們,最大的好處是程序更簡潔;沒有它們,程序也可以用別的方式實現,只不過麻煩一些罷了。所以,還是能用則用之吧。

lambda

lambda函數,是一個只用一行就能解決問題的函數,聽著是多么誘人呀??聪旅娴睦樱?/p>

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

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

在這個例子中,add()只是一個中間操作。當然,上面的例子完全可以用別的方式實現。比如:

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

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

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

>>> 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就相當于add(x),請看官對應一下,這一行lambda x:x+3就完成add(x)的三行(還是兩行?),特別是最后返回值。還可以寫這樣的例子:

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

通過上面例子,總結一下lambda函數的使用方法:

在lambda后面直接跟變量

變量后面是冒號

冒號后面是表達式,表達式計算結果就是本函數的返回值

為了簡明扼要,用一個式子表示是必要的:

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

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

就lambda而言,它并沒有給程序帶來性能上的提升,它帶來的是代碼的簡潔。比如,要打印一個list,里面依次是某個數字的1次方,二次方,三次方,四次方。用lambda可以這樣做:

>>> 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做為一個單行的函數,在編程實踐中,可以選擇使用。根據我的經驗,盡量少用,因為它或許更多地是為減少單行函數的定義而存在的。

map

先看一個例子,還是上面講述lambda的時候第一個例子,用map也能夠實現:

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

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

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

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

在應用中,map的所能實現的,也可以用別的方式實現。比如:

>>> 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 ]     #這個我最喜歡了,一般情況下速度足夠快,而且可讀性強
[1, 4, 9, 16, 25]

條條大路通羅馬,以上方法,在編程中,自己根據需要來選用啦。

在以上感性認識的基礎上,在來瀏覽有關map()的官方說明,能夠更明白一些。

  

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.

理解要點:

對iterable中的每個元素,依次應用function的方法(函數)(這本質上就是一個for循環)。

將所有結果返回一個list。

如果參數很多,則對么個參數并行執行function。

例如:

>>> lst1 = [1,2,3,4,5]
>>> lst2 = [6,7,8,9,0]
>>> map(lambda x,y: x+y, lst1,lst2)     #將兩個列表中的對應項加起來,并返回一個結果列表
[7, 9, 11, 13, 5]

請看官注意了,上面這個例子如果用for循環來寫,還不是很難,如果擴展一下,下面的例子用for來改寫,就要小心了:

>>> 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的簡潔優雅。

預告:下一講詳解reduce和filter

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37360.html

相關文章

  • [基礎python]話題函數(2)

    摘要:上一講和本講的標題是大話題小函數,所謂大話題,就是這些函數如果溯源,都會找到聽起來更高大上的東西。是提出的一個軟件架構,用于大規模數據集大于的并行運算。 上一講和本講的標題是大話題小函數,所謂大話題,就是這些函數如果溯源,都會找到聽起來更高大上的東西。這種思維方式絕對我堅定地繼承了中華民族的優良傳統的。自從天朝的臣民看到英國人開始踢足球,一直到現在所謂某國勃起了,都一直在試圖論證足球起...

    leejan97 評論0 收藏0
  • [基礎python]玩轉字符串(3)

    摘要:字符串是一個很長的話題,縱然現在開始第三部分,但是也不能完全說盡。字符串就是一個話題中心。也就是和是指向同一個字符。字符串截取有了編號,不僅僅能夠找出某個字符,還能在字符串中取出一部分來。 字符串是一個很長的話題,縱然現在開始第三部分,但是也不能完全說盡。因為字符串是自然語言中最復雜的東西,也是承載功能最多的,計算機高級語言編程,要解決自然語言中的問題,讓自然語言中完成的事情在計算機上...

    Cc_2011 評論0 收藏0
  • [基礎Python]有容乃的list(4)

    摘要:要研究清楚一些函數特別是內置函數的功能,建議看官首先要明白內置函數名稱的含義。前面提到的內置函數得到的結果,就是一個排好序的。至此,有關的基本操作的內置函數,就差不多了。 list的話題的確不少,而且,在編程中,用途也非常多。 有看官可能要問了,如果要生成一個list,除了要把元素一個一個寫上之外,有沒有能夠讓計算機自己按照某個規律生成list的方法呢? 如果你提出了這個問題,充分...

    YanceyOfficial 評論0 收藏0
  • [基礎python]啰嗦的除法

    摘要:補充一個資料,供有興趣的朋友閱讀浮點數算法爭議和限制說明以上除法規則,是針對,在中,將和等同起來了。比如下面的例子不啰嗦了,實驗一個注意了,引用了一個模塊之后,再做除法,就不管什么情況,都是得到浮點數的結果了。 除法啰嗦的,不僅是python。 整數除以整數 看官請在啟動idle之后,練習下面的運算: >>> 2/5 0 >>> 2.0/5 0.4 >>> 2/5.0 0.4 >...

    james 評論0 收藏0
  • [基礎Python]做一個游戲

    摘要:在講述有關的時候,提到做游戲的事情后來這個事情一直沒有接續?,F在就是開始做那個游戲的時候了。游戲過程描述程序運行起來,隨機在某個范圍內選擇一個整數。我們現在做一個很小的程序,也是這樣來做。這個游戲還沒有完呢,即使用了循環,后面還會繼續。 在講述有關list的時候,提到做游戲的事情,后來這個事情一直沒有接續。不是忘記了,是在想在哪個階段做最合適。經過一段時間學習,看官已經不是純粹小白了,...

    idisfkj 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<