成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python開發(fā)第四篇--函數(shù)

lemanli / 1899人閱讀

摘要:第一種情況打印結(jié)果為第二種打印結(jié)果為因?yàn)槿绻J(rèn)參數(shù)是一個(gè)可變的數(shù)據(jù)類型,那么他在內(nèi)存中永遠(yuǎn)是一個(gè)。

名稱空間與作用域

1.變量儲(chǔ)存在一個(gè)內(nèi)存空間中
2.當(dāng)程序運(yùn)行的時(shí)候代碼從上到下依次執(zhí)行,它會(huì)將變量與值的關(guān)系存儲(chǔ)在一個(gè)空間中,這個(gè)空間叫名稱空間,命名空間,全局名稱空間
3.當(dāng)程序遇到函數(shù)時(shí),它會(huì)將函數(shù)名存在內(nèi)存中,函數(shù)體漠不關(guān)心
4.當(dāng)程序執(zhí)行的時(shí)候,內(nèi)存會(huì)臨時(shí)開辟一個(gè)空間,存放函數(shù)體里的代碼(變量,代碼等)
5.函數(shù)外面訪問不到臨時(shí)空間的內(nèi)容,隨著函數(shù)執(zhí)行完畢,臨時(shí)名稱空間會(huì)被釋放掉,向這個(gè)臨時(shí)開辟的空間也叫臨時(shí)名稱空間,也叫局部名稱空間

python名稱空間分為三種:
1.內(nèi)置名稱空間
2.全局名稱空間
3.局部名稱空間

按照作用域分為兩種:

全局作用域

1.內(nèi)置名稱空間
2.全局名稱空間

局部作用域

1.局部名稱空間

加載順序
內(nèi)置名稱空間---全局名稱空間(當(dāng)程序執(zhí)行時(shí))---局部名稱空間(函數(shù)調(diào)用時(shí))

取值順序
局部名稱空間(函數(shù)調(diào)用時(shí))---全局名稱空間(當(dāng)程序執(zhí)行時(shí))---內(nèi)置名稱空間
注:取值順序是單向不可逆的

  1.取值又叫引用,局部名稱空間可以臨時(shí)像全局名稱空間引用,但是無法修改
  2.取值是從小到大取值LEGB
      - L=最里層的局部作用域
      - E=父親級別的局部作用域
      - G=全局作用域中的全局名稱空間
      - B=全局作用域中的內(nèi)置名稱空間

內(nèi)置函數(shù)globals和locals的方法:

globles

   globales返回一個(gè)字典,字典里的內(nèi)容是全局名稱空間的內(nèi)容

locals

   locals返回一個(gè)字典,當(dāng)前位置的所有變量(看locals的位置是否在函數(shù)體里還是在全局里)

#1.
print(globals())
print(locals())
#打印結(jié)果:
{"__name__": "__main__", "__doc__": None, "__package__": None, "__loader__": <_frozen_importlib_external.SourceFileLoader object at 0x004DB4B0>, "__spec__": None, "__annotations__": {}, "__builtins__": , "__file__": "E:/python/day04/1.py", "__cached__": None}
{"__name__": "__main__", "__doc__": None, "__package__": None, "__loader__": <_frozen_importlib_external.SourceFileLoader object at 0x004DB4B0>, "__spec__": None, "__annotations__": {}, "__builtins__": , "__file__": "E:/python/day04/1.py", "__cached__": None}
#2.
def func():
    a = 12
    b = 20
    print(locals())
    print(globals())
func()
#打印結(jié)果:
{"b": 20, "a": 12}
{"__name__": "__main__", "__doc__": None, "__package__": None, "__loader__": <_frozen_importlib_external.SourceFileLoader object at 0x0044B4B0>, "__spec__": None, "__annotations__": {}, "__builtins__": , "__file__": "E:/python/day04/1.py", "__cached__": None, "func": }

關(guān)鍵字global和nonlocal的方法:

global
1.global可以引用全局變量,并且改變?nèi)肿兞?br> 2.在局部作用域聲明一個(gè)全局變量

nonlocal
1.不能操作全局變量
2.在局部作用域中,對父級作用域(或者更外層作用域非全局作用域)的變量進(jìn)行引用和修改,并且引用的哪層,從那層及以下此變量全部發(fā)生改變。

注:對于可變的數(shù)據(jù)類型list,dict,set,不用引用global,nonlocal
注:如果默認(rèn)參數(shù)是一個(gè)可變的數(shù)據(jù)類型,那么他在內(nèi)存中永遠(yuǎn)是一個(gè)。

#1.第一種情況:
def extendList(val,list=[]):
    list.append(val)
    return list
list1 = extendList(10)
print("list1=%s"%list1)  # [10,]
list2 = extendList(123,[])
print("list2=%s"%list2)  # [123,]
list3 = extendList("a")
print("list3=%s"%list3)  #[10,"a"]
打印結(jié)果為:
list1=[10]
list2=[123]
list3=[10, "a"]
#2.第二種:
def extendList(val,list=[]):
    list.append(val)
    return list
list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList("a")
print("list1=%s"%list1)
print("list2=%s"%list2)
print("list3=%s"%list3)
打印結(jié)果為:
list1=[10, "a"]
list2=[123]
list3=[10, "a"]
因?yàn)椋喝绻J(rèn)參數(shù)是一個(gè)可變的數(shù)據(jù)類型,那么他在內(nèi)存中永遠(yuǎn)是一個(gè)。

1.global實(shí)例:

def func():
    global a
    a = 3
func()
print(a)
#打印結(jié)果為:3
count = 1
def search():
    global count
    count = 2
search()
print(count)
#打印結(jié)果為2

2.nonloacl實(shí)例:

def add_b():
    b = 42
    def do_global():
        b = 10
        print(b)
        def dd_nonlocal():
            nonlocal b
            b = b + 20
            print(b)
        dd_nonlocal()  #30
        print(b) #30
    do_global()   #10
    print(b)
add_b()
#打印結(jié)果為:
10
30
30
42
函數(shù)

函數(shù)的嵌套與調(diào)用:

#函數(shù)的嵌套
def max2(x,y):
    m  = x if x>y else y
    return m
def max4(a,b,c,d):
    res1 = max2(a,b)
    res2 = max2(res1,c)
    res3 = max2(res2,d)
    return res3
#函數(shù)的調(diào)用
max4(1,2,3,4)

函數(shù)名的本質(zhì)
1.打印函數(shù)名

def func():
    print("in func")
f = func
print(f)
#打印結(jié)果為:
為一塊內(nèi)存地址
2.函數(shù)名可以作為容器類數(shù)據(jù)的元素
def func1():
    print(111)
def func2():
    print(222)
def func3():
    print(333)
l1 = [func1, func2, func3]
for i in l1:
    i()
#打印結(jié)果為:
111
222
333
3.函數(shù)名可以作為函數(shù)的參數(shù)
def func1():
    print(111)
def func2(x):
    print(x)
    x()
    print(222)
func2(func1)
#打印結(jié)果為:

111
222
4.函數(shù)名可以作為函數(shù)的返回值
def func1():
    return 111
def func2(x):  # x = func1
    print(222)
    return x
ret = func2(func1)  # func1
print(ret())
print(ret)
#打印結(jié)果為:
222
111

總結(jié):
函數(shù)名的應(yīng)用,第一類對象

  - 函數(shù)名打印的出來的是個(gè)內(nèi)存地址,加()號就可以運(yùn)行
  - 函數(shù)名可以作為容器類型內(nèi)的元素
  - 函數(shù)名可以作為傳遞的參數(shù)
  - 函數(shù)名可以作為函數(shù)的返回值,return把值給函數(shù)的執(zhí)行者

閉包函數(shù)

  - 內(nèi)層函數(shù)對外層函數(shù)非全局變量的引用,就叫做閉包
  - 判斷是否是閉包:__closure__
  - 如果python解釋器遇到了閉包,他有個(gè)機(jī)制,這個(gè)閉包不會(huì)隨著函數(shù)的結(jié)束而釋放
  - 裝飾器@語法糖,裝飾器放在需要裝飾的函數(shù)的上邊,利用的就是閉包函數(shù)

裝飾器:

#測試func1函數(shù)的執(zhí)行時(shí)間
def timmer(f):
    def inner(*args,**kwargs):
        start_time = time.time()
        ret = f(*args,**kwargs)
        end_time = time.time()
        print("此函數(shù)的執(zhí)行效率%s" % (end_time - start_time))
        return ret
    return inner
@timmer
def func1():
    time.sleep(0.3)
    print("非常復(fù)雜......")
func1()
#格式為:
def wrapper(f):
    def inner(*args,**kwargs):
        """被裝飾函數(shù)執(zhí)行之前的操作"""
        ret = f(*args,**kwargs)
        """被裝飾函數(shù)執(zhí)行之后的操作"""
        return ret
    return inner
# 裝飾器 本質(zhì)就是閉包
# 裝飾器根本作用:在不影響原函數(shù)執(zhí)行的基礎(chǔ)上,增加一些額外的功能登錄認(rèn)證,打印日志等等。

內(nèi)褲可以用來遮羞,但是到了冬天它沒法為我們防風(fēng)御寒,聰明的人們發(fā)明了長褲,有了長褲后寶寶再也不冷了,裝飾器就像我們這里說的長褲,在不影響內(nèi)褲作用的前提下,給我們的身子提供了保暖的功效。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41777.html

相關(guān)文章

  • 用十種編程語言開發(fā)計(jì)算器應(yīng)用-四篇-Kotlin

    用十種編程語言開發(fā)計(jì)算器應(yīng)用 C語言C#(windows桌面軟件)Swift (ios應(yīng)用)pythonDart(Flutter應(yīng)用,跨平臺(tái),適用安卓、ios、mac、windows、web)Java(安卓App)Kotlin (安卓App)Js+Html+Vue(H5應(yīng)用)微信小程序抖音小程序 安卓Kotlin語言版 開發(fā)工具 Android Studio 如何下載 工程截圖 關(guān)鍵代碼文...

    gclove 評論0 收藏0
  • 工具集核心教程 | 四篇: Velocity模板引擎入門到進(jìn)階

    摘要:是一個(gè)基于的模板引擎。模板中未被定義的變量將被認(rèn)為是一個(gè)字符串。公眾號回復(fù)全棧,領(lǐng)取前端,,產(chǎn)品經(jīng)理,微信小程序,等資源合集大放送。公眾號回復(fù)面試,領(lǐng)取面試實(shí)戰(zhàn)學(xué)習(xí)資源。 Velocity是一個(gè)基于java的模板引擎(template engine)。它允許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象。 當(dāng)Velocity應(yīng)用于web...

    leon 評論0 收藏0
  • React Fiber源碼分析 四篇(歸納總結(jié))

    摘要:為什么網(wǎng)頁性能會(huì)變高要回答這個(gè)問題,需要回頭看是單線程的知識(shí)點(diǎn)。在分析的過程中,發(fā)現(xiàn)了的源碼中使用了很多鏈?zhǔn)浇Y(jié)構(gòu),回調(diào)鏈,任務(wù)鏈等,這個(gè)主要是為了增刪時(shí)性能比較高 系列文章 React Fiber源碼分析 第一篇 React Fiber源碼分析 第二篇(同步模式) React Fiber源碼分析 第三篇(異步狀態(tài)) React Fiber源碼分析 第四篇(歸納總結(jié)) 前言 Rea...

    jsdt 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<