最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python3 中作為一等對(duì)象的函數(shù)解析

 更新時(shí)間:2019年12月11日 08:28:17   作者:StarryLand  
這篇文章主要介紹了Python3 中作為一等對(duì)象的函數(shù),本文通過實(shí)例代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Python3 函數(shù)

函數(shù)是組織好的,可重復(fù)使用的,用來實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。

函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。你已經(jīng)知道Python提供了許多內(nèi)建函數(shù),比如print()。但你也可以自己創(chuàng)建函數(shù),這被叫做用戶自定義函數(shù)。

在 Python 語言中,函數(shù)與整數(shù)、字符串、字典等基本數(shù)據(jù)類型一樣,都是 一等對(duì)象 。所謂一等對(duì)象,即滿足如下三個(gè)條件:

  • 在運(yùn)行時(shí)創(chuàng)建
  • 能賦值給變量
  • 能作為函數(shù)的參數(shù)或返回值

以下 IDLE 中的代碼即在運(yùn)行時(shí)創(chuàng)建了函數(shù) factorial :

>>> def factorial(n):
...   '''calculates n!'''
...   return 1 if n < 2 else n * factorial(n-1)
...
>>> factorial(5)
120
>>> factorial.__doc__
'calculates n!'
>>> type(factorial)
<class 'function'>
>>> fact = factorial
>>> fact
<function factorial at 0x7f55bc771c10>
>>> fact(5)
120
>>> list(map(fact, range(10)))
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

從輸出中可以看出, factorial 是 function 類的實(shí)例對(duì)象, __doc__ 是 factorial 對(duì)象眾多屬性中的一個(gè)。

可以把 factorial 函數(shù)賦值給變量 fact ,通過 fact 變量調(diào)用 factorial 函數(shù)。還可以把 factorial 作為參數(shù)傳遞給 map 函數(shù)。

這些行為表現(xiàn)了函數(shù)作為一等對(duì)象的特性。

一、高階函數(shù)

接受函數(shù)作為參數(shù),或者把函數(shù)作為返回值的函數(shù)即為 高階函數(shù) 。

如內(nèi)置用于排序的 sorted 函數(shù),它的 key 參數(shù)用于傳入一個(gè)函數(shù),在需要排序的每個(gè)元素上執(zhí)行特定的操作。如根據(jù)單詞長度對(duì)多個(gè)字符串進(jìn)行排序:

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

任何單參數(shù)的函數(shù)都可以作為 key 的值傳給 sorted 函數(shù),如把單詞反向拼寫作為排序條件:

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

map、filter 與 reduce

函數(shù)式編程語言通常會(huì)提供 map 、 filter 和 reduce 三個(gè)高階函數(shù)或者實(shí)現(xiàn)了類似功能的函數(shù)。Python3 中的列表推導(dǎo)和生成器即具有 map 和 filter 函數(shù)的功能。

參考如下示例:

>>> def fact(n):
...   return 1 if n < 2 else n * fact(n-1)
...
>>> list(map(fact, range(6)))
[1, 1, 2, 6, 24, 120]
>>> [fact(n) for n in range(6)]
[1, 1, 2, 6, 24, 120]
>>> list(map(fact, filter(lambda n: n % 2, range(6))))
[1, 6, 120]
>>> [fact(n) for n in range(6) if n % 2]
[1, 6, 120]

通過列表推導(dǎo)可以完成與 map 或 filter 函數(shù)類似的工作,且可讀性更高,也避免了使用 lambda 表達(dá)式。

reduce 在 Python2 中是內(nèi)置函數(shù),但在 Python3 中被移到了 functools 模塊中。 reduce 可以把某個(gè)操作連續(xù)地應(yīng)用到某個(gè)序列上,累計(jì)所有的結(jié)果,把產(chǎn)生的一系列值規(guī)約成一個(gè)值。因此常用于求和計(jì)算,但內(nèi)置的 sum 函數(shù)在可讀性和性能方面更優(yōu)。

>>> from functools import reduce
>>> from operator import add
>>> reduce(add, range(101))
5050
>>> sum(range(101))
5050

二、匿名函數(shù)

可以使用 lambda 關(guān)鍵字在 Python 表達(dá)式內(nèi)創(chuàng)建匿名函數(shù)。

在函數(shù)的參數(shù)列表中最適合使用匿名函數(shù)。如前面的根據(jù)字符串反序后的結(jié)果對(duì)單詞列表進(jìn)行排序,可以使用 lambda 匿名函數(shù)替代傳入 sorted 的 reverse 函數(shù):

>>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']
>>> sorted(fruits, key=lambda word: word[::-1])
['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']

lambda 表達(dá)式 lambda words: words[::-1] 即等同于之前的 reverse 函數(shù):

def reverse(word):
   return word[::-1]

除了作為參數(shù)傳給某個(gè)高階函數(shù)外,Python 很少使用匿名函數(shù)。

三、可調(diào)用對(duì)象

除了用戶自定義的函數(shù),其他可調(diào)用對(duì)象也可以使用調(diào)用運(yùn)算符(即 () )。

Python 的數(shù)據(jù)模型中共包含 7 種可調(diào)用對(duì)象:

  • 用戶自定義函數(shù):使用 def 語句或 lambda 表達(dá)式創(chuàng)建的函數(shù)
  • 內(nèi)置函數(shù):由 C 語言(CPython)實(shí)現(xiàn)的函數(shù),如 len 或 time.strftime 等
  • 內(nèi)置方法:使用 C 語言實(shí)現(xiàn)的方法,如 dict.get
  • 方法:在類的定義體中定義的函數(shù)
  • 類:類在調(diào)用時(shí)會(huì)使用 __new__ 方法創(chuàng)建實(shí)例,然后運(yùn)行 __init__ 初始化實(shí)例,最后將實(shí)例返回給調(diào)用方。調(diào)用類相當(dāng)于調(diào)用函數(shù)。
  • 類的實(shí)例:如果類的定義中實(shí)現(xiàn)了 __call__ 方法,則其實(shí)例可以作為函數(shù)調(diào)用
  • 生成器:使用 yield 關(guān)鍵字的函數(shù)或方法。可以返回生成器對(duì)象。

使用內(nèi)置的 callable() 函數(shù)可以確認(rèn)對(duì)象是否可調(diào)用。

任何 Python 對(duì)象都可以表現(xiàn)得像函數(shù),只需實(shí)現(xiàn)該實(shí)例的 __call__ 方法。

如下面的 bingocall.py ,從列表中隨機(jī)取出一個(gè)元素:

import random
class BingoCage:
  def __init__(self, items):
    self._items = list(items)
    random.shuffle(self._items)
  def pick(self):
    try:
      return self._items.pop()
    except IndexError:
      raise LookupError('pick from empty BingoCage')
  def __call__(self):
    return self.pick()
bingo = BingoCage(range(50))
print(bingo.pick())
# => 38
print(bingo())
# => 22
print(callable(bingo))
# => True

bingo 是 BingoCage 類的一個(gè)實(shí)例,由于 BingoCage 類中實(shí)現(xiàn)了 __call__ 方法,則 bingo 對(duì)象是可調(diào)用的( bingo() )。

四、支持函數(shù)式編程的模塊

operator

在函數(shù)式編程中,經(jīng)常需要將算術(shù)運(yùn)算符當(dāng)作函數(shù)使用。如不使用遞歸計(jì)算階乘。

使用 reduce 和 lambda 表達(dá)式計(jì)算階乘:

>>> from functools import reduce
>>> def fact(n):
...   return reduce(lambda a, b: a*b, range(1, n+1))
...
>>> fact(5)
120

Python 中的 operator 為多個(gè)運(yùn)算符提供了對(duì)應(yīng)的函數(shù),可以避免寫 lambda a, b: a*b 這種匿名函數(shù)。

使用 reduce 和 operator.mul 計(jì)算階乘:

>>> from operator import mul
>>> from functools import reduce
>>> def fact(n):
...   return reduce(mul, range(1, n+1))
...
>>> fact(5)
120

operator 模塊中還有一類 itemgetter 和 attrgetter 函數(shù),可以替代從序列中取出元素或讀取屬性的 lambda 表達(dá)式。

如根據(jù)元組中的第二個(gè)元素對(duì)多個(gè)元組進(jìn)行排序:

>>> metro_data = [
...   ('Tokyo', 'JP', 36.933, (35.689722, 139.691667)),
...   ('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),
...   ('Mexico City', 'MX', 20.142, (19.433333, -99.133333)),
...   ('New York-Newark', 'US', 20.104, (40.808611, -74.020386)),
...   ('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)),
... ]
>>> from operator import itemgetter
>>> for city in sorted(metro_data, key=itemgetter(1)):
...   print(city)
...
('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833))
('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889))
('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
('Mexico City', 'MX', 20.142, (19.433333, -99.133333))
('New York-Newark', 'US', 20.104, (40.808611, -74.020386))

如果把多個(gè)參數(shù)傳遞給 itemgetter ,則該函數(shù)會(huì)返回由提取的值構(gòu)成的元組:

>>> cc_name = itemgetter(1, 0)
>>> for city in metro_data:
...   print(cc_name(city))
...
('JP', 'Tokyo')
('IN', 'Delhi NCR')
('MX', 'Mexico City')
('US', 'New York-Newark')
('BR', 'Sao Paulo')

attrgetter 與 itemgetter 作用類似,可以根據(jù)名稱提取對(duì)象的屬性。

operator 模塊中還有一個(gè) methodcaller 函數(shù),可以用來在某個(gè)對(duì)象上調(diào)用由參數(shù)指定的方法。

>>> from operator import methodcaller
>>> s = 'The time has come'
>>> upcase = methodcaller('upper')
>>> upcase(s)
'THE TIME HAS COME'
>>> hiphenate = methodcaller('replace', ' ', '-')
>>> hiphenate(s)
'The-time-has-come'
functools.partial

高階函數(shù) functools.partial 用來 部分應(yīng)用 某個(gè)函數(shù)。即基于某個(gè)函數(shù)創(chuàng)建一個(gè)新的可調(diào)用對(duì)象,并把原函數(shù)的某些參數(shù)固定。

如使用 partial 把一個(gè)接受雙參數(shù)的函數(shù)改編成單參數(shù)的可調(diào)用對(duì)象:

>>> from operator import mul
>>> from functools import partial
>>> triple = partial(mul, 3)
>>> triple(7)
21
>>> list(map(triple, range(1, 10)))
[3, 6, 9, 12, 15, 18, 21, 24, 27]

partial() 函數(shù)返回一個(gè) functools.partial 對(duì)象,該對(duì)象提供對(duì)原函數(shù)的訪問和固定原函數(shù)參數(shù)的行為。

>>> def greeting(words, name):
...   return f'{words}, {name}!'
...
>>> from functools import partial
>>> greeting2 = partial(greeting, name='skitar')
>>> greeting2("what's up")
"what's up, skitar!"
>>> greeting2
functools.partial(<function greeting at 0x7f70f31788b0>, name='skitar')

總結(jié)

以上所述是小編給大家介紹的Python3 中作為一等對(duì)象的函數(shù)解析,希望對(duì)大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • python3+django2開發(fā)一個(gè)簡單的人員管理系統(tǒng)過程詳解

    python3+django2開發(fā)一個(gè)簡單的人員管理系統(tǒng)過程詳解

    這篇文章主要介紹了python3+django2開發(fā)一個(gè)簡單的人員管理系統(tǒng)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • tensorflow實(shí)現(xiàn)讀取模型中保存的值 tf.train.NewCheckpointReader

    tensorflow實(shí)現(xiàn)讀取模型中保存的值 tf.train.NewCheckpointReader

    今天小編就為大家分享一篇tensorflow實(shí)現(xiàn)讀取模型中保存的值 tf.train.NewCheckpointReader,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • pandas返回缺失值位置的方法實(shí)例教程

    pandas返回缺失值位置的方法實(shí)例教程

    當(dāng)我們用python進(jìn)行數(shù)據(jù)處理時(shí)會(huì)遇到很多缺失值,缺失值一般是由于我們所處理的數(shù)據(jù)本身的特性、當(dāng)初錄入的失誤或者其它原因?qū)е碌?下面這篇文章主要給大家介紹了關(guān)于pandas返回缺失值位置的方法,需要的朋友可以參考下
    2022-01-01
  • Python統(tǒng)計(jì)單詞出現(xiàn)的次數(shù)

    Python統(tǒng)計(jì)單詞出現(xiàn)的次數(shù)

    最近經(jīng)理交給我一項(xiàng)任務(wù),統(tǒng)計(jì)一個(gè)文件中每個(gè)單詞出現(xiàn)的次數(shù),列出出現(xiàn)頻率最多的5個(gè)單詞。本文給大家?guī)砹藀ython 統(tǒng)計(jì)單詞次數(shù)的思路解析,需要的朋友參考下吧
    2018-04-04
  • Django用數(shù)據(jù)庫表反向生成models類知識(shí)點(diǎn)詳解

    Django用數(shù)據(jù)庫表反向生成models類知識(shí)點(diǎn)詳解

    在本篇文章里小編給大家分享的是關(guān)于Django用數(shù)據(jù)庫表反向生成models類知識(shí)點(diǎn)內(nèi)容,需要的朋友們可以參考下。
    2020-03-03
  • 什么是Python中的順序表

    什么是Python中的順序表

    在本篇文章里小編給大家整理了一篇關(guān)于Python中順序表詳解的相關(guān)知識(shí)點(diǎn)以及實(shí)例內(nèi)容,需要的朋友們可以參考下。
    2020-06-06
  • 如何在Python中用好短路機(jī)制

    如何在Python中用好短路機(jī)制

    這篇文章主要介紹了如何在Python中用好短路機(jī)制,Python中的短路機(jī)制非常有用,跟很多其他編程語言中的短路機(jī)制作用類似,接下來讓我們通過幾個(gè)簡單的例子總結(jié)Python中可用的幾種短路機(jī)制,需要的朋友可以參考下
    2022-02-02
  • pytorch 查看cuda 版本方式

    pytorch 查看cuda 版本方式

    這篇文章主要介紹了pytorch 查看cuda 版本方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python打開指定網(wǎng)頁使用requests模塊爬蟲示例詳解

    Python打開指定網(wǎng)頁使用requests模塊爬蟲示例詳解

    這篇文章主要介紹了Python打開指定網(wǎng)頁使用requests模塊爬蟲的示例,Python?requests是一個(gè)常用的HTTP請求庫,可以方便地向網(wǎng)站發(fā)送HTTP請求,并獲取響應(yīng)結(jié)果,requests模塊比urllib模塊更簡潔,感興趣的朋友可以參考下
    2024-02-02
  • python?time模塊定時(shí)器由淺入深應(yīng)用實(shí)例

    python?time模塊定時(shí)器由淺入深應(yīng)用實(shí)例

    Python提供了多種實(shí)現(xiàn)定時(shí)任務(wù)的方法,從簡單到復(fù)雜,包括使用標(biāo)準(zhǔn)庫time模塊的基礎(chǔ)定時(shí),threading或asyncio模塊的多線程/異步定時(shí),以及第三方庫如APScheduler的高級(jí)定時(shí)任務(wù)調(diào)度
    2024-01-01

最新評(píng)論

贵州省| 房山区| 藁城市| 黄平县| 永吉县| 英吉沙县| 囊谦县| 沽源县| 甘孜| 武邑县| 米脂县| 莱西市| 民乐县| 工布江达县| 荣成市| 灌云县| 东明县| 上犹县| 延川县| 贡嘎县| 林口县| 罗定市| 琼中| 河西区| 惠安县| 许昌市| 红河县| 南平市| 奉新县| 新野县| 南汇区| 锡林郭勒盟| 新疆| 利川市| 英山县| 金寨县| 常州市| 斗六市| 大化| 陇川县| 安义县|