python中的一等對象--函數

来源:https://www.cnblogs.com/sfencs-hcy/archive/2019/02/28/10454125.html
-Advertisement-
Play Games

一等對象 什麼是一等對象: 在運行時創建 能賦值給變數或數據結構中的元素 能作為參數傳遞給函數 能作為函數的返回結果 python中的字元串,列表什麼的都是一等對象,但對如果之前只是使用c++、java語言的人們來說python中的函數也是一等對象,那一定會有一點不可思議 接下來就介紹一下這個一等對 ...


一等對象

什麼是一等對象:

  • 在運行時創建

  • 能賦值給變數或數據結構中的元素

  • 能作為參數傳遞給函數

  • 能作為函數的返回結果

python中的字元串,列表什麼的都是一等對象,但對如果之前只是使用c++、java語言的人們來說python中的函數也是一等對象,那一定會有一點不可思議

接下來就介紹一下這個一等對象—函數

函數是一等對象

我們就馬上證明一下函數是一等對象:


def func():
    print('一等對象函數')

print(type(func)) #<class 'function'>

將上面定義的函數func的type列印出來為<class 'function'="">,可見函數func是類function的實例,也就是func是一個對象,對象肯定是在運行時創建的了。

接下來:


obj = func
obj() # 一等對象函數

把func賦給obj,在obj後加括弧執行,輸出“一等對象函數”,可見函數是可以賦值給變數的


def func():
    print('一等對象函數')

def func2(n):
    print(n)
    return n

print(func)
func2(func)()
"""
<function func at 0x0000021FED3EC268>
<function func at 0x0000021FED3EC268>
一等對象函數
"""

上面這段代碼同樣證實了函數可以作為參數傳遞給函數,同時返回值依然可以是函數,也可以向下麵這樣


def func():
    print('一等對象函數')

def func2(n):
    print(n)
    def func3():
        print('函數作為返回值')
    return func3

print(func)
func2(func)()
"""
<function func at 0x0000021FED3EC268>
<function func at 0x0000021FED3EC268>
函數作為返回值
"""

在函數中定義函數並返回

高階函數

函數作為一等對象的使用在python中其實很常見,舉個例子,內置函數sorted()


fruits = ['strawberry','apple','cherry','banana',' pineapple']
list = sorted(fruits,key=len)
print(list)
# ['apple', 'cherry', 'banana', 'strawberry', ' pineapple']

這種把函數作為參數或者返回值為函數的函數就叫做高階函數,顯然sorted()就是高階函數,這種高階函數在python中還有很多很多。

匿名函數

說道剛纔用到的sorted()函數,經常和他一起配合使用的就是匿名函數了

匿名函數顧名思義就是沒有名字,它通過lambda關鍵字創建,即建即用,節省了創建函數的時間,也叫做lambda表達式


fruits = ['strawberry','apple','cherry','banana',' pineapple']
list = sorted(fruits,key=lambda x:x[-1])
print(list)
# ['banana', 'apple', ' pineapple', 'strawberry', 'cherry']

上面的sorted()函數按照水果最後一位字元的順序排序,這裡並沒有什麼實際意義,只是使用lambda表達式的一個舉例。

可調用對象

函數是對象,函數名加括弧便是調用這個函數,那麼其他對象能否也變成像函數一樣可以加括弧調用呢

這是可以的,只需要在類中實現特殊方法call


class Fruit():
    def __init__(self,name):
        self.name = name

    def __call__(self, *args, **kwargs):
        print(self.name+' was called')

apple = Fruit('apple')
apple() # apple was called

call方法還可以添加任意的參數,和函數一樣。

對於一個對象可不可以被調用可以通過callable()函數判斷


print(callable(apple)) # True
print(callable(Fruit)) # True

能夠調用就會返回True。這裡我們發現Fruit同樣也可以調用,這是因為類同樣也是一個對象,Fruit也是一個實例,創造它的類也實現了call方法,這裡就不細說了。


參考《流暢的Python》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • PHP語言在Linux系統上運行的時候,需要在Linux系統上部署相應的Nginx、MySQL、PHP等環境,只有將這些環境參數都設置好,PHP相關應用程式才可正常運行,部署環境的方法有很多種,可手動模式下一個個軟體環境進行安裝,也可使用工具進行快速部署,此文以阿裡雲的Centos系統為例,介紹在C ...
  • 這一篇博客,還是接著說那些常見的反爬蟲措施以及我們的解決辦法。同樣的,如果對你有幫助的話,麻煩點一下推薦啦。 一、防盜鏈 這次我遇到的防盜鏈,除了前面說的Referer防盜鏈,還有Cookie防盜鏈和時間戳防盜鏈。Cookie防盜鏈常見於論壇、社區。當訪客請求一個資源的時候,他會檢查這個訪客的Coo ...
  • FPM(FastCGI Process Manager)是PHP FastCGI運行模式的一個進程管理器,從它的定義可以看出,FPM的核心功能是進程管理,那麼它用來管理什麼進程呢?這個問題就需要從FastCGI說起了。 FastCGI是Web伺服器(如:Nginx、Apache)和處理程式之間的一種 ...
  • 裝飾者模式 想看本系列前作的朋友可以點擊下麵鏈接哦。 一起去開心的購物吧——淺談觀察者模式 記一場精彩的籃球比賽——淺談策略模式 大家好,又跟大家見面啦,今天呢,我與大家分享一個新的Java設計模式——裝飾者模式。 首先,不能免俗的我們來看一下官方給的定義: 裝飾者模式動態地將責任附加到對象上。若要 ...
  • 一、前言說明 本機運行環境:系統環境Win10,運行環境Python3.6,運行工具Pycharm 需要Python的包有:pywifi 這是一種暴力破解wifi的模式,需要的時間比較長,本文主要提供一個破解思路 二、思路介紹 先生成一個密碼字典(此步驟也可以從網上下載字典) 迴圈用密碼字典的每個密 ...
  • 安裝 laravel(版本 5.8):這裡是全局安裝的, 也就是說在終端任何位置都可以執行下麵的命令進行安裝. 創建一個項目:安裝之後, 進入你存放所有項目的文件夾(我所有的項目都是在 site 文件夾): 然後新建一個項目, 名字可以自定義. 啟動服務:項目創建好了, 現在進入剛剛創建的項目的文件 ...
  • [TOC] python裝飾器初級 認識裝飾器 概念: 簡單地說: 原則 : 不修改被裝飾函數的源代碼 不修改被裝飾函數的調用方式 優點: 有助於讓我們的代碼更簡短,也更Pythonic(Python範兒 應用場景: 在項目迭代過程中,需要不停的為某一個功能(函數)新增或刪除某些小功能, 如果可復用 ...
  • 大一生活真 特麽 ”豐富多彩“ ,多彩到我要忙到哭泣,身為班長,很多班級的事情需要管理,也是,什麼東西都得體驗學一學,從學生會主席、團委團總支、社團社長都體驗過一番了,現在差個班長也沒試過,就來體驗了一番哈哈哈,其實這種精心服務一個班級的人還是很棒的一種感覺呢。思考思考最近的任務啊: (1)英語劇 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...