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

淺談python函數(shù)之作用域(python3.5)

 更新時(shí)間:2017年10月27日 08:54:53   作者:Wadirum  
下面小編就為大家?guī)?lái)一篇淺談python函數(shù)之作用域(python3.5)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

1 基本概念

1.1 命名空間 (namespace)

命名空間是變量名到對(duì)象的映射(name -> obj)。目前大多數(shù)的命名空間以類(lèi)似于python字典的形式實(shí)現(xiàn),實(shí)現(xiàn)形式在未來(lái)可能發(fā)生變化。命名空間舉例:內(nèi)置變量(內(nèi)置函數(shù)abs, 內(nèi)置的異常等),模塊中的全局變量,函數(shù)調(diào)用時(shí)的局部變量。在某種意義上講,對(duì)象的屬性也形成一個(gè)命名空間。重要的是,不同的命名空間中的變量沒(méi)有任何關(guān)聯(lián),兩個(gè)不同的命名空間中可以包含相同的變量名。

命名空間有不同的創(chuàng)建時(shí)間和生命周期:

•內(nèi)置變量命名空間在python解釋器啟動(dòng)時(shí)創(chuàng)建,并且在解釋器運(yùn)行期間永遠(yuǎn)不會(huì)被刪除;

•一個(gè)模塊的命名空間在模塊被導(dǎo)入時(shí)創(chuàng)建,并且到解釋器退出會(huì)一直存在;

•函數(shù)的本地(局部)命名空間在函數(shù)調(diào)用時(shí)創(chuàng)建,函數(shù)退出時(shí)刪除;

•解釋器頂層執(zhí)行的語(yǔ)句都是 __main__ 模塊的組成部分,它們有自己的命名空間。

注:內(nèi)置變量實(shí)際上同樣是以模塊的形式存在,模塊名為 builtins 。

1.2 作用域 (scope)

作用域是Python程序中可以直接訪問(wèn)一個(gè)命名空間內(nèi)變量的文本區(qū)域,可直接訪問(wèn)即命名空間內(nèi)的變量在該文本區(qū)域內(nèi)可見(jiàn)、可引用。

•本地(局部)作用域:函數(shù)或者類(lèi)的內(nèi)部

•全局作用域:整個(gè)程序的運(yùn)行環(huán)境。

全局作用域中無(wú)法直接訪問(wèn)本地作用域中定義的變量:

def func1():
 name = 1

print(func1) # <function func1 at 0x101a03d08>
print(name)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# NameError: name 'name' is not defined

本地作用域中的變量定義:

•在python中,變量賦值即定義。在局部作用域內(nèi)被賦值的變量,除非由 global 或者 nonlocal 聲明,否則全部為局部變量,函數(shù)調(diào)用時(shí)存在于函數(shù)命名空間。

•global var : 聲明變量 var 為全局變量,它所有的引用和賦值都在模塊的命名空間進(jìn)行。

•nonlocal var : 將外層函數(shù)命名空間中的變量 var 綁定到本地作用域,使其在本地作用域可重新賦值。如果變量沒(méi)有被聲明為 nonlocal,這些變量在本地作用域僅可讀,嘗試給變量賦值則會(huì)在本地命名空間創(chuàng)建一個(gè)同名變量。

nonlocal聲明的變量在上層函數(shù)中必須存在,否則報(bào)錯(cuò):

test = 'global variable'

def scope_test():
 def inner():
  nonlocal test
  print(test)

scope_test() # SyntaxError: no binding for nonlocal 'test' found

2 示例

2.1 本地作用域中變量的搜索遵守LEGB規(guī)則

1.L-Local(function):函數(shù)或類(lèi)的命名空間,其中的變量稱為本地變量

2.E-Enclosing function locals:外層函數(shù)的命名空間(例如closure),包含被聲明為non-local的變量

3.G-Global(module):函數(shù)定義所在模塊的命名空間,其中的變量稱為全局變量

4.B-Builtin(Python):Python內(nèi)置模塊的名字空間

def scope_test():
 def do_local():
  spam = "local spam"

 def do_nonlocal(): 
  nonlocal spam  # 遞歸向上尋找上層函數(shù)命名空間中的spam變量
  spam = "nonlocal spam"

 def do_global():
  global spam # 在全局變量中尋找spam變量,沒(méi)有則創(chuàng)建
  spam = "global spam"

 spam = "test spam"
 do_local()
 print("After local assignment:", spam) # 輸出本地變量 spam
 do_nonlocal()
 print("After nonlocal assignment:", spam)
 do_global()
 print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)

結(jié)果

<SPAN style="FONT-SIZE: 14px">1 After local assignment: test spam 
After nonlocal assignment: nonlocal spam 
After global assignment: nonlocal spam 
In global scope: global spam 
</SPAN>

2.2 閉包

閉包:在嵌套函數(shù)中,如果內(nèi)層函數(shù)引用了外層函數(shù)的變量,就形成了一個(gè)閉包。

自由變量:被引用的外層函數(shù)變量,稱為內(nèi)層函數(shù)的自由變量。

def fn():
  a = 1
  def closure():
    nonlocal a
    a += 1
    print(a)
  return closure

inner = fn() 
print(inner.__closure__)  # (<cell at 0x10240b408: int object at 0x100277bc0>,)
inner() # 2
inner() # 3

外層函數(shù)執(zhí)行完,其命名空間刪除。但是因?yàn)?a 是內(nèi)層函數(shù)的自由變量,所以變量 a 被保留,可以看作是 closure 函數(shù)對(duì)象的一個(gè)附加屬性。

3 靜態(tài)檢測(cè)

3.1 本地變量

python是在編譯def語(yǔ)句時(shí)靜態(tài)檢測(cè)其本地變量的。

a = 1
def local_test():
  a += 1
  print(a)
local_test()  # UnboundLocalError: local variable 'a' referenced before assignment

print(b)  # NameError: name 'b' is not defined

在編譯local_test函數(shù)時(shí),python就確定了變量 a 為函數(shù)的本地變量。所以在執(zhí)行 a += 1 是會(huì)直接在本地命名空間尋找變量a。

3.2 命名空間搜索鏈

name = "lzl"
 
def f1():
  print(name)
 
def f2():
  name = "eric"
  f1()
 
f2() # lzl

一個(gè)函數(shù)的變量搜索路徑是在它定義的時(shí)候決定的,不受它調(diào)用位置的影響。

f1定義在全局作用域中,其變量的搜索路徑為:本地命名空間 --> 模塊命名空間。所以最后的輸出結(jié)果為‘lzl'。

4 匿名函數(shù)

Python借助lambda關(guān)鍵字定義匿名函數(shù),格式如下:

lambda 參數(shù)列表: 表達(dá)式

lambda x: x + 1
# 函數(shù)功能類(lèi)型于下面的函數(shù)
def _(x):
  return x + 1

示例

下面一段代碼的輸出結(jié)果是什么:

li = [lambda :x for x in range(10)]
print(li[0]())

其等價(jià)形式:

def fn():
  return x 

li = []
for x in range(10):
  li.append(fn)
li[0]() # fn() -> 9,根據(jù)變量搜索規(guī)則,x在函數(shù)中沒(méi)有定義,在全局變量中查找

以上這篇淺談python函數(shù)之作用域(python3.5)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python模擬鼠標(biāo)點(diǎn)擊實(shí)現(xiàn)方法(將通過(guò)實(shí)例自動(dòng)化模擬在360瀏覽器中自動(dòng)搜索python)

    Python模擬鼠標(biāo)點(diǎn)擊實(shí)現(xiàn)方法(將通過(guò)實(shí)例自動(dòng)化模擬在360瀏覽器中自動(dòng)搜索python)

    這篇文章主要介紹了Python模擬鼠標(biāo)點(diǎn)擊實(shí)現(xiàn)方法(將通過(guò)實(shí)例自動(dòng)化模擬在360瀏覽器中自動(dòng)搜索python),需要的朋友可以參考下
    2017-08-08
  • python統(tǒng)計(jì)字符串中字母出現(xiàn)次數(shù)代碼實(shí)例

    python統(tǒng)計(jì)字符串中字母出現(xiàn)次數(shù)代碼實(shí)例

    這篇文章主要介紹了python統(tǒng)計(jì)字符串中字母出現(xiàn)次數(shù)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python的列表和元組詳情

    Python的列表和元組詳情

    這篇文章主要介紹了Python的列表和元組,列表和元組是python組常見(jiàn)的內(nèi)置內(nèi)省,下面文章我們講圍繞Python的列表和元組的相關(guān)資料展開(kāi)話題,感興趣的小伙伴以參考一下
    2021-10-10
  • 常用python爬蟲(chóng)庫(kù)介紹與簡(jiǎn)要說(shuō)明

    常用python爬蟲(chóng)庫(kù)介紹與簡(jiǎn)要說(shuō)明

    本文介紹了一些常用的python爬蟲(chóng)庫(kù)其中包括python網(wǎng)絡(luò)庫(kù),python網(wǎng)絡(luò)爬蟲(chóng)框架,python HTML解析,python文本處理,python 自然語(yǔ)言處理,python 瀏覽器模擬等各種常用的python庫(kù)
    2020-01-01
  • PyQt5使用QTimer實(shí)現(xiàn)電子時(shí)鐘

    PyQt5使用QTimer實(shí)現(xiàn)電子時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了PyQt5使用QTimer實(shí)現(xiàn)電子時(shí)鐘,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Django 聯(lián)表查詢操作方法

    Django 聯(lián)表查詢操作方法

    作為一個(gè)django使用的新手,在做練手項(xiàng)目中對(duì)聯(lián)表查詢感覺(jué)比較生疏,最近兩天整理了一些連表查詢應(yīng)用場(chǎng)景和使用方法以及無(wú)法使用django中ORM操作的原生查詢,對(duì)Django 聯(lián)表查詢操作感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • 20個(gè)常用Python運(yùn)維庫(kù)和模塊

    20個(gè)常用Python運(yùn)維庫(kù)和模塊

    本篇文章給大家整理了20個(gè)最常用Python運(yùn)維中用到的庫(kù)和模塊,希望我們整理的內(nèi)容對(duì)大家有所幫助。
    2018-02-02
  • Python StrEnum基本概念和使用場(chǎng)景分析

    Python StrEnum基本概念和使用場(chǎng)景分析

    StrEnum是Python枚舉家族的一個(gè)強(qiáng)大補(bǔ)充,特別適合處理字符串常量,它結(jié)合了枚舉的類(lèi)型安全性和字符串的靈活性,使得在許多場(chǎng)景下的編程變得更加簡(jiǎn)潔和安全,本文將介紹StrEnum的基本概念和使用場(chǎng)景,并通過(guò)示例代碼來(lái)展示它的實(shí)際應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • Pytorch中expand()的使用(擴(kuò)展某個(gè)維度)

    Pytorch中expand()的使用(擴(kuò)展某個(gè)維度)

    這篇文章主要介紹了Pytorch中expand()的使用(擴(kuò)展某個(gè)維度),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • PyTorch兩種安裝方法

    PyTorch兩種安裝方法

    這篇文章主要介紹了PyTorch兩種安裝方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評(píng)論

轮台县| 阿城市| 托克托县| 辽阳市| 济宁市| 广东省| 鞍山市| 台东市| 随州市| 津南区| 湄潭县| 富阳市| 樟树市| 临邑县| 平利县| 沅陵县| 西盟| 锡林浩特市| 招远市| 南涧| 台湾省| 塔河县| 蒙山县| 抚宁县| 合水县| 怀来县| 漠河县| 郎溪县| 驻马店市| 稻城县| 当阳市| 安国市| 沙湾县| 察哈| 祁阳县| 泸州市| 寿宁县| 新昌县| 铜山县| 黑水县| 内江市|