中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python函數對象的名稱空間和作用域怎么使用

發布時間:2023-05-05 17:16:25 來源:億速云 閱讀:91 作者:iii 欄目:開發技術

這篇文章主要講解了“Python函數對象的名稱空間和作用域怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python函數對象的名稱空間和作用域怎么使用”吧!

1.函數對象

(1)函數對象的引用

一個函數對象的形成是先定義一個函數,然后寫入函數體,最后把這個函數賦值給一個變量,也就是函數的對象,然后我們可以去通過這個函數變量來實現函數相應的功能。(先賦值,再調用)

示例1:

#定義一個函數對象fun
def fun():
    print('hello word',end=' ')
    print('wwww')
fun()  #直接調用這個函數對象

這種寫法是最直接的,沒有返回值。

示例2:

def fun():
    print('ww')
    return 123
kun = fun()
print(kun,type(kun))
#輸出結果:ww
#         123 <class 'int'>

這個寫法是定義了一個kun在變量,作為fun函數的對象,我們可以去通過這個對象去處理這個函數的返回值。

示例3:

def fun():
    return 123
kun = fun
print(kun,type(kun))
#輸出結果:<function fun at 0x00000154828AD280> <class 'function'>

這里我沒有加上()所以輸出結果是fun這個變量的地址,

示例4:

def fun():
    return 123
kun = fun
print(kun(),type(kun))
#輸出結果:123 <class 'function'>

這里先定義一個kun變量為fun的函數對象,下面如果要去調用這個函數的話就必須加上括號,如果沒有括號那這個對象只是函數的地址。

(2)函數可以放到序列里面

函數的返回值是一種變量類型,同時序列可以儲存變量,所以函數是可以放到序列里面去

這里就以列表為例子:

def fun():
    return '牛馬'
kun = fun
li=[1,5,kun]
print(li)
print(li[2]())
#輸出結果:[1, 5, <function fun at 0x000001BFB1ABD280>]
#         牛馬

(3)函數可以作為參數 , 傳遞給另一個函數

示例:

def fun():
    return '牛馬'
def ff(st):
    print(f'我是{st}')
ff(fun())
#輸出結果:我是牛馬

(4)函數可以作為另一個函數的返回值

def ff():
    print('我愛你')
    return 520
def fun():
        return ff()
a=fun()
print(a,type(a))
#輸出結果:我愛你
#          520 <class 'int'>

這里是fun函數返回值為ff函數,實際上是經歷過了fun函數的功能,然后再次經歷ff函數的功能,最后返回的是ff函數的520,故a的結果是520

2.名稱空間

數據的名稱是儲存到棧區,而數據的內容是儲存到堆區,當我們要去使用數據的內容時,我們可以通過數據的名稱來直接去表示數據的內容,也就是通過棧區去找到堆區的東西,然后在堆區拿出來去使用。棧區和堆區是有對應關系的。

1.內建名稱空間
    生命周期:會隨著Python啟動而生成,程序關閉會摧毀
    保存的數據:內置函數(input,print....)
    生成順序:程序里最先生成的
2.全局名稱空間
    生命周期:會隨著Python啟動而生成,程序關閉會摧毀
    保存的數據:函數名,變量名
    生成順序:在內建名稱空間的后面
3.局部名稱空間
    生命周期:隨著函數的調用而生成,函數調用接受后就關閉
    保存的數據:函數內定義的名字
    生成順序:隨著函數的調用而生成

所以,我們定義的函數是屬于局部名稱空間,當函數被調用完成了之后就會被銷毀,里面變量儲存到的棧堆區都會被銷毀

3.作用域

(1)作用域的理解

作用域實際上就是變量的作用范圍,之前我們學了C語言都知道,有全局變量和局部變量,比如在for循環里面,里面的變量是一種局部變量,我們如果在主函數外面去定義一個變量,那就是全局變量。Python也是一樣的道理,變量也是有相應的作用域。而變量的作用域是由定義的位置決定的

全局變量與局部變量的名字相同的時候,實質上是兩個不同的變量, 其棧堆區是完全不一樣的!所以我們不可以通過局部來改變全局變量,否則就報錯

示例1:

#定義一個全局變量a
a=15
def fun():
    a=999
    print('hhh')
fun()
print(a)
#輸出結果:15

因為函數是放到棧堆區,當函數調用完成了之后返回一個值,這個函數已經被銷毀了,那么里面的變量也會與之銷毀,所以不會影響到全局變量,故a的值還是15

示例2:

#定義一個全局變量a
a=15
def fun():
    a=999
    return a
 
print(fun())
print(a)
#輸出結果:999
#         15

這個函數調用完成了之后就返回一個值,這個值函數內部的功能的值,但是并沒有對這個函數以外的值進行修改,所以a的結果還是15,而函數的返回值是999

示例3:

b=15
def fun():
    b=b+99
fun()
print(b)
#輸出結果:系統報錯

因為b是一個全局變量,而函數里面的b是一個重新定義的局部變量,所以我們不可以去直接修改這個局部變量b,因為這個b是沒有初始數值的,而且類型也未定,所以無法進行運算處理

對比

b=15
def fun():
    b=0
    b+=99
    print(b)
fun()
print(b)
#輸出結果:99 15

對于這個而言,我給了函數里面b一個初始化值,所以可以進行運算處理,但這個b與外部全局變量的b是完全不相同,是兩個不同的變量

(2)作用域的轉換

在C語言中我們可以去設置靜態變量(static),從而使得這個變量可以在函數進行修改,同樣Python中可以利用關鍵字去修改變量的作用域,把局部變量作用到全局變量,或者把全局變量作用降級為局部

1.global 關鍵字 (局部變全局)

在函數中,變量是這個函數的局部變量,只僅僅作用到函數內部,我們對這個變量進行修改是不會影響外面的變量的,如果把這個局部變量轉換為全局變量的話,那么這變量就可以在函數里面進行修改,而且還可以影響到外部,當新定義global的變量名字與之前已有的變量名字出現重復的話,新的變量內容會把之前的給覆蓋掉,而且新的全局變量也可以在函數內部進行修改,從而影響全局。

注意事項:這個關鍵字是作用到全局變量,這個全局變量的棧堆區不會被銷毀

b=15
def fun():
    b=123
fun()
print(b)
#函數里面的b與外面的b是不同性質的!!!
#輸出結果:15

對比

b=15
def fun():
    global b
    b=123
fun()
print(b)
#輸出結果:123

重新定義了一個global后,此時這個b已經是一個新的全局變量因為前面已經有了一個全局變量b,所以這個新的全局變量會因為名字相同會把之前的全局變量b給直接覆蓋掉(類似于類型相同且名字相同的文件會被新的給覆蓋),故輸出結果是新的全局變量b的結果:123

2.nonlocal 關鍵字 (全局變局部)

功能:降權,全局變成局部

前面講到過,已知一個全局變量,但是我不可以在函數里面對這個全局變量進行修改,而且函數里面的變量都是新的變量,既是跟外面的全局變量名字一模一樣,但是其儲存的棧堆區是完全不同的,那么當我想去通過一個局部函數來修改這個全局變量的話,這時候我就可以通過nonlocal關鍵字來進行 降維處理 。

注意事項:這個關鍵字是作用于嵌套函數的外部變量(相較于內部函數,外部函數是“全局”),這個變量的棧堆區會被銷毀

def fun():
    w=99
    def fun1():
        w=100
    fun1()
    return w
print(fun())
#輸出結果:99

VS

def fun():
    w=99
    def fun1():
        nonlocal w
        w=100
    fun1()
    return w
print(fun())
#輸出結果:100

這里,可以看出,w=99相對應fun1()是一個全局變量,而fun1()內部的w相對應fun()是一個局部變量,當我用nonlocal關鍵字去定義了fun()的變量w之后,這個w變量已經是屬于fun1()函數內部的變量,這時候我們可以去修改這個w的值,從而去影響外部函數,最后w的返回值也就是被修改后的100

感謝各位的閱讀,以上就是“Python函數對象的名稱空間和作用域怎么使用”的內容了,經過本文的學習后,相信大家對Python函數對象的名稱空間和作用域怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

松溪县| 横山县| 区。| 阜阳市| 安龙县| 海口市| 昌都县| 河曲县| 文水县| 博爱县| 页游| 米易县| 钦州市| 新竹市| 永安市| 静安区| 丁青县| 平原县| 融水| 上虞市| 扎囊县| 民乐县| 巴彦淖尔市| 通州市| 仙居县| 平度市| 大埔县| 秭归县| 忻城县| 澄迈县| 武山县| 彭阳县| 嵩明县| 阳山县| 新沂市| 庆元县| 苗栗县| 平原县| 包头市| 南漳县| 甘德县|