python 函數(shù)的本質(zhì)理解

對于習(xí)慣了Java等面向?qū)ο笳Z言,可能會對其任何對象都可以用類來表示已經(jīng)習(xí)慣,但是python語言的靈活多變可能讓你感到很不習(xí)慣,對于很多騷操作很感到吃驚(:

但是其實實際上是不能真正的理解python中的一切皆對象的概念,當(dāng)你真正理解其概念后,你才會明白原來python的強大

python 中函數(shù)與類都是對象

python 中函數(shù)和類,甚至是模塊都是對象,函數(shù)大部分情況下可以作為類來用,而且都是第一類對象,什么是第一類對象?

第一類對象的通用特性:

  • 可作為值傳遞,賦值給另一個對象;
  • 可以作為元素添加到集合對象中;
  • 可以作為參數(shù)傳遞給其他函數(shù);
  • 可以作為函數(shù)的返回值。

函數(shù)賦值給變量,通過變量就可以調(diào)用

def f1(str):
  return len(str)
# 函數(shù)賦值給變量,通過變量就可以調(diào)用 
temp=f1
print temp('hello')

注意這里是值傳遞,即使刪除f1,也可以通過temp調(diào)用該函數(shù)

def f1(str):
  return len(str)
# 函數(shù)賦值給變量,通過變量就可以調(diào)用 
temp=f1
del f1
print temp('hello')

作為元素添加到集合中

def f2(str1,str2):
   return str1+str2
# 作為元素添加到集合中
a=[]
a.append(f1)
a.append(f2)
print a[0]('hello')
print a[1]('hello','world')

作為參數(shù)

def func(f,str):
  return f(str)

print func(f1,'hello')

作為函數(shù)的返回值

def mutiply(x,y):
  reutrn x*y
def sub(x,y):return x-y
def func2(i):if i==1: return mutiplyelse:return sub
temp=func2(2)
print temp(2,4)

使用函數(shù)的對象特性

已經(jīng)知道函數(shù)就是對象.因此,對象:

  • 可以賦值給一個變量
  • 可以在其他函數(shù)里定義

賦值在前面已經(jīng)提到了,函數(shù)可以賦值給任意的變量,當(dāng)作變量來使用,同時還可以在函數(shù)里定義另一個函數(shù)

def getTalk(kind="shout"):

    # 在函數(shù)里定義一個函數(shù)
    def shout(word="yes"):
        return word.capitalize()+"!"

    def whisper(word="yes") :
        return word.lower()+"...";

    # 返回一個函數(shù)
    if kind == "shout":
        # 這里不用"()",我們不是要調(diào)用函數(shù)
        # 只是返回函數(shù)對象
        return shout
    else:
        return whisper

# 怎么用這個特性呢?

# 把函數(shù)賦值給變量
talk = getTalk()

# 可以看到"talk"是一個函數(shù)對象
print talk
# 輸出 : <function shout at 0xb7ea817c>

# 函數(shù)返回的是對象:
print talk()
# 輸出 : Yes!

# 不嫌麻煩你也可以這么用
print getTalk("whisper")()
# 輸出 : yes...

這里要注意賦值時括號的使用,括號表示調(diào)用函數(shù),而賦值時時不需要調(diào)用函數(shù)的,
talk = getTalk(),這里是把第一層函數(shù)賦值給了talk,,所以調(diào)用時可以talk()調(diào)用,當(dāng)然也可以直接 talk=getTalk,調(diào)用時talk()()來調(diào)用

那么這個特性也就行成了函數(shù)的嵌套與閉包

嵌套與閉包

函數(shù)的嵌套

def fun1():
    def fun2():
        def fun3():
            print("Hello world!")
        return fun3
    return fun2
a=fun1()
# a()
fun1()()()

Hello world!

函數(shù)的閉包

閉包函數(shù)就是函數(shù)可以讀取到與自己不是一個作用域的局部變量

1.必須有一個內(nèi)嵌函數(shù)
2.內(nèi)嵌函數(shù)必須引用外部函數(shù)中的變量
3.外部函數(shù)的返回值必須是內(nèi)嵌函數(shù)

def fun1(x):
    def fun2(y):
        print(x+y)
    return fun2
fun1(2)(3)
5

裝飾器,匿名函數(shù),map函數(shù)等都是函數(shù)的變體,都是通過這些基本特性來實現(xiàn)的

其次,Python中的函數(shù)是最高等級的對象,而不僅僅是一小段代碼.

一個函數(shù)是一個被它自己定義而執(zhí)行的對象;默認參數(shù)是一種"成員數(shù)據(jù)",所以它們的狀態(tài)和其他對象一樣,會隨著每一次調(diào)用而改變.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 〇、前言 本文共108張圖,流量黨請慎重! 歷時1個半月,我把自己學(xué)習(xí)Python基礎(chǔ)知識的框架詳細梳理了一遍。 ...
    Raxxie閱讀 19,578評論 17 410
  • 包(lib)、模塊(module) 在Python中,存在包和模塊兩個常見概念。 模塊:編寫Python代碼的py...
    清清子衿木子水心閱讀 3,907評論 0 27
  • 今天和小朋友聊天,回憶起以前的工作,想起第一份工作,那時真是被老板洗腦成功了。早9點晚9點6天,完全不知道累,而且...
    Eille2018閱讀 206評論 0 0
  • 開學(xué)第一天,我們在軍訓(xùn)。今天天氣還不錯,不算怎么熱。在大學(xué)的軍訓(xùn),讓我不由的想起了高中的軍訓(xùn),好像還是昨天發(fā)生的似...
    殤樆閱讀 257評論 0 0
  • 一竿子插打底,大的當(dāng)面說關(guān)注到位,任何細節(jié)不放過,但對于個人發(fā)展來說有局限性,適當(dāng)處理就好,這個度很難把握。
    孫倩倩Rela閱讀 113評論 0 0

友情鏈接更多精彩內(nèi)容