成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入理解Python函數(shù),一切皆對(duì)象

開(kāi)發(fā) 前端
Python一切皆對(duì)象,函數(shù)也是對(duì)象,可以賦值給變量,也可以作為參數(shù)傳遞給函數(shù),也可以作為函數(shù)的返回值。

把函數(shù)賦值給變量

def say(text):
    print(text)

speak = say
speak('hello') # hello
del say
say('hello') # NameError: name 'say' is not defined
speak('hello') # hello

speak 只是這個(gè)函數(shù)對(duì)象的另一個(gè)名字,也就是說(shuō)你可以刪除原來(lái)的名字(say),仍然可以通過(guò) speak 調(diào)用這個(gè)函數(shù)。這就像普通的變量賦值一樣。請(qǐng)看下圖了解。

函數(shù)作為變量,存儲(chǔ)到數(shù)據(jù)結(jié)構(gòu)

正如我們?cè)诘谝还?jié)中了解到的,函數(shù)是 Python 中的對(duì)象,我們可以將它們存儲(chǔ)在數(shù)據(jù)結(jié)構(gòu)中,就像任何其他對(duì)象一樣。要訪問(wèn)存儲(chǔ)在其中的函數(shù)對(duì)象,假設(shè)列表的工作方式如下:

def say(text):
    print(text)


funcs = [say, str.lower, str.upper]
for func in funcs:
    print(func, "執(zhí)行返回值:", func("Hello"))
# 運(yùn)行結(jié)果:
# Hello
# <function say at 0x7f9b880c6320> 執(zhí)行返回值:None
# <method 'lower' of 'str' objects> 執(zhí)行返回值:hello
# <method 'upper' of 'str' objects> 執(zhí)行返回值:HELLO

函數(shù)作為參數(shù)傳遞

第一次聽(tīng)到這個(gè)詞,你會(huì)覺(jué)得很奇怪,但是你可以確定,函數(shù)也是一個(gè)對(duì)象,可以作為參數(shù)傳遞給另一個(gè)函數(shù)。

def sayUpper(text):
    print(text.upper())

def sayLower(text):
    print(text.lower())

def speak(text, func):
    func(text)

speak('Hello', sayUpper) # HELLO
speak('Hello', sayLower) # hello

上面的例子我們定義了兩個(gè)函數(shù),sayUpper 和 sayLower,然后調(diào)用 speak 函數(shù),將他們作為參數(shù)傳遞給 speak函數(shù)。

函數(shù)作為返回值

函數(shù)可以作為返回值,這個(gè)返回值就是一個(gè)函數(shù)。

def speaker(volume):
    def quiet(text):
        return text.lower()
    def loud(text):
        return text.upper()
    if volume < 20:
        return quiet
    else:
        return loud

s = speaker(10)
print(s('Hello')) # hello
S = speaker(30)
print(S('Hello')) # HELLO

上面的例子定義了一個(gè)函數(shù) speaker,它接受一個(gè)參數(shù) volume,如果 volume 小于 20,返回一個(gè)函數(shù) quiet,否則返回一個(gè)函數(shù) loud。執(zhí)行 speaker 函數(shù),我們傳入 10,它將返回一個(gè)函數(shù) quiet,執(zhí)行 speaker 函數(shù),我們傳入 30,它將返回一個(gè)函數(shù) loud。例子中s、S 變量都是函數(shù),它們都是 speaker 函數(shù)的返回值。

通過(guò)上面函數(shù)的性質(zhì):可以理解 python 裝飾器的本質(zhì)是一個(gè)函數(shù),它接受一個(gè)函數(shù)作為參數(shù),并返回一個(gè)函數(shù)。

像執(zhí)行函數(shù)一樣執(zhí)行對(duì)象

所有函數(shù)都是對(duì)象,但所有對(duì)象都不是函數(shù)。但是,可以將對(duì)象設(shè)置為可調(diào)用的,這允許將它們視為函數(shù)(在某些情況下)。為此,我們可以使用 __call__ 屬性。

class Subtrack:
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def __call__(self, x):
        return self.a - self.b - x

X = Subtrack(10, 5)
print(X(2)) # 3

上面的例子定義了一個(gè)類 Subtrack,它有兩個(gè)屬性a 和 b,并且定義了一個(gè)函數(shù) __call__,它可以將對(duì)象設(shè)置為可調(diào)用的。為此,我們可以使用 __call__ 屬性。X 是 Subtrack 類的實(shí)例,因?yàn)榇嬖赺_call__ 函數(shù),它可以像函數(shù)一樣被調(diào)用。需要主要并不是所有的類都有 __call__ 屬性。

總結(jié)

通過(guò)上面的學(xué)習(xí)你是否更熟悉了 Python 的函數(shù)了?

責(zé)任編輯:華軒 來(lái)源: 哈希編程
相關(guān)推薦

2020-04-08 12:50:29

Python編程語(yǔ)言開(kāi)發(fā)

2020-09-16 11:46:05

AI

2020-01-09 09:13:34

UnixLinux協(xié)議

2013-10-09 14:30:36

2019-06-14 14:58:58

虛擬文件系統(tǒng)Linux

2021-04-20 23:25:16

執(zhí)行函數(shù)變量

2024-03-28 08:24:01

球盒模型回溯

2019-11-05 10:03:08

callback回調(diào)函數(shù)javascript

2021-10-16 17:53:35

Go函數(shù)編程

2012-08-02 17:44:01

2024-06-24 09:00:00

2012-02-14 10:29:02

Java

2022-07-06 08:05:52

Java對(duì)象JVM

2010-06-01 15:25:27

JavaCLASSPATH

2016-12-08 15:36:59

HashMap數(shù)據(jù)結(jié)構(gòu)hash函數(shù)

2020-07-21 08:26:08

SpringSecurity過(guò)濾器

2021-10-14 06:27:41

Python函數(shù)開(kāi)發(fā)

2020-09-26 21:57:44

python變量開(kāi)發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一区二区三区日韩 | 欧美一级片在线观看 | 亚洲免费成人av | 国产成人精品一区二区三区在线 | 亚洲a在线观看 | 不卡av电影在线播放 | 国产日韩精品在线 | 午夜国产一级片 | 一区二区三区在线免费观看 | 少妇午夜一级艳片欧美精品 | 一区二区三区亚洲 | 国产精品精品久久久久久 | 久久综合伊人一区二区三 | 毛片网络 | 欧美2区| 国产成人精品久久久 | 国产精品美女www | 亚洲成人三级 | 欧美日产国产成人免费图片 | 色综合一区二区 | 国产91网址 | 久久com| 黄网站在线播放 | 午夜精品久久久久久久久久久久 | 久久亚洲国产精品 | 亚洲欧美日韩精品久久亚洲区 | 偷偷操视频 | 日本二区在线观看 | 国产成人久久久 | 免费簧片视频 | 天天色综网| 久久久国产一区二区三区 | 一区二区在线不卡 | 高清一区二区三区 | 成在线人视频免费视频 | 久久最新 | 久国久产久精永久网页 | av永久免费| 久久在线视频 | 精品美女视频在线观看免费软件 | 久久性色 |