日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 把函数视作对象

發布時間:2025/1/21 python 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 把函数视作对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一等函數

在 Python 中,函數是一等對象。一等對象需要具備以下幾個條件:

1.在運行時創建
2.能賦值給變量或者數據結構中的元素
3.能作為參數傳遞給函數
4.能作為函數的返回值

在 Python 中,整數、字符串、字典以及所有的函數都是一等對象,接下來我們來看把函數作為對象的實際應用。

把函數視作對象

首先我們通過一個簡單的示例來說明函數為什么是對象。

>>> def myFunc(n): ... '''return n!''' ... return n*n ... >>> myFunc(5) 25 >>> myFunc.__doc__ 'return n!' >>> type(myFunc) <class 'function'> >>>

首先,我們直接在控制臺創建一個函數。
然后通過函數調用__doc__屬性,而__doc__就是函數對象中眾多屬性的其中一個。
然后通過 type(myFunc)查看函數類型,它是 function 類的一個實例。

由以上示例可以看出函數其實就是一個對象。

OK,接下來再通過一個示例來展示函數對象的”一等“本性。

>>> fun = myFunc >>> fun <function myFunc at 0x1015a2268> >>> fun(5) 25 >>> map(fun,range(5)) <map object at 0x10177a550> >>> list(map(fun,range(5))) [0, 1, 4, 9, 16] >>>

這個示例中,通過別的名稱使用函數,再把函數作為參數傳遞。
我們把 myFunc函數賦值給變量 fun,然后通過變量名來調用,還能把它當做參數傳遞給 map 函數,map 函數返回一個可迭代的對象,里面的元素是把第一個參數(一個函數)應用到第二個參數(一個可迭代對象,這里是 range(5))中各個元素上得到結果。

有了一等函數,就可以使用函數式風格編程了。函數式編程的特點之是使用高階函數。

高階函數

高階函數的定義:接收函數為參數,或者把函數作為結果返回的函數。
比如 map函數就是一個高階函數。另外,內置函數 sorted 也是,可選的 key 參數用于提供一個函數,它會應用到各個元素上進行排序。

來看一下 sorted 函數的簡單示例:

>>> fruits = ['strawberry','fig','apple','cherry'] >>> sorted(fruits,key = len) ['fig', 'apple', 'cherry', 'strawberry'] >>>

任何單參數函數都能作為 key 參數的值。
在看個示例,為了創建押韻詞典,可以把各個單詞反過來拼寫,然后進行排序。

示例:根據反向拼寫給一個單詞列表進行排序

>>> fruits = ['strawberry','fig','apple','cherry','raspberry'] >>> def reverse(word): ... return word[::-1] ... >>> reverse('testing') 'gnitset' >>> sorted(fruits,key=reverse) ['apple', 'fig', 'raspberry', 'strawberry', 'cherry'] >>>

注意,以上示例中列表的單詞并沒有變,只是把反向拼寫當做排序條件。

在函數式編程中,最熟知的高階函數有 map、filter、reduce,不過多數使用場景下都有更好的替代品。

map、filter與reduce的現代替代品

函數式編程通常會提供map、filter與reduce三個高階函數,在 Python3中,map 和 filter 還是內置函數,但是由于引入了列表推導和生成器表達式,它們變得不那么重要了??梢允褂昧斜硗茖Щ蛏善鞅磉_式完全具有可以用來替代這兩個函數,并且更易于閱讀。

接下來看看如何用列表式推導來替代 map 和 filter

>>> list(map(fun,range(6))) [0, 1, 4, 9, 16, 25] >>> [fun(n) for n in range(6)] [0, 1, 4, 9, 16, 25]>>> list(map(fun,filter(lambda n:n%2,range(6)))) [1, 9, 25] >>> [fun(n) for n in range(6) if n%2] [1, 9, 25] >>>

Python3中,map 和 filter 返回生成器(一種迭代器),因此現在它們的直接替代品是生成器表達式。filter 的作用是用于過濾列表,上面使用量 Lambda 表達式,其可閱讀性相對來說沒有列表推導的高。

接下來看看 reduce,在 Python2中,reduce 是內置函數,但是在 Python3中放到 functools 模塊中了,這個函數最常用于求和,但是從 Python2.3起,求和函數可以使用內置的 sum 函數,在可讀性和性能方面,有了很大的改善。

示例:使用 reduce 和sum 計算和

>>> from functools import reduce >>> from operator import add >>> reduce(add,range(100)) 4950 >>> sum(range(100)) 4950 >>>

以上可以看到,使用 reduce 求和需要導入和創建求和函數,但是使用 sum 就不用,非常簡單。
sum 和 reduce 的通用思想是把某個操作連續應用到序列的元素上,并累計之前的結果,把一系列值歸約成一個值。

此外,all 和 any 也是內置的歸約函數。

1.all(iterable)
如果iterable的每個元素都是真值,返回 True,all([])返回 True
2.any(iterable)
如果iterable中有元素是真值,就返回 True,any([])返回 False


本文參考:《流暢的 Python》.
《流暢的 Python》電子書高清中文版下載地址,在這里

總結

以上是生活随笔為你收集整理的Python 把函数视作对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。