函数小知识点(文档字符串,闭包等)
1 文檔字符串(Documentation Strings)
一般被稱為docstring,一款你應(yīng)當(dāng)使用的重要工具,它能夠幫助你更好地記錄程序并讓其更加易于理解。令人驚嘆的是,當(dāng)程序?qū)嶋H運(yùn)行時(shí),我們甚至可以通過一個(gè)函數(shù)來獲取文檔! Python 的??help()??函數(shù),它所做的便是獲取函數(shù)的??__doc__??屬性并以一種整潔的方式將其呈現(xiàn)給你。def print_max(x, y):'''Prints the maximum of two numbers.打印兩個(gè)數(shù)值中的最大數(shù)。The two values must be integers.這兩個(gè)數(shù)都應(yīng)該是整數(shù)''' #該函數(shù)的文檔字符串# 如果可能,將其轉(zhuǎn)換至整數(shù)類型x = int(x) y = int(y)if x > y:print(x, 'is maximum')else:print(y, 'is maximum')print_max(3, 5) print(print_max.__doc__) #通過使用函數(shù)的 __doc__ 屬性(屬于函數(shù)的名稱)來獲取函數(shù) print_max 的文檔字符串屬性。只消記住 Python 將所有東西都視為一個(gè)對(duì)象,這其中自然包括函數(shù)。---5 is maximum ---Prints the maximum of two numbers.打印兩個(gè)數(shù)值中的最大數(shù)。---The two values must be integers.這兩個(gè)數(shù)都應(yīng)該是整數(shù)
2 函數(shù)名的使用方法
(這玩意兒其實(shí)就是一個(gè)內(nèi)存地址,可以當(dāng)作變量來使用)
2.1 可以被當(dāng)做值或變量引用
def func():print(111)print(func) # <function func at 0x00000218A911AB70> --函數(shù)在內(nèi)存中的地址 f = func # 將其傳給變量f print(f) # <function func at 0x00000279A5A6AB70> f() # 111
?2.2?函數(shù)可以被當(dāng)做容器類型的元素存儲(chǔ)?
# 將其當(dāng)做容器存儲(chǔ)在列表中 def func1():print('func1')def func2():print('func2')def func3():print('func3')lis = [func1, func2, func3] lis[0]() # func1 lis[1]() # func2 lis[2]() # func3
2.3?可以當(dāng)做函數(shù)的參數(shù)和返回值
#當(dāng)做參數(shù)和返回值 def func1():print('func1')def func(argv):argv()return argv # func1作為返回值 f = func(func1) # func1作為參數(shù) f() # 輸出 func1 func1
3 閉包
閉包:?
在一個(gè)外函數(shù)中定義了一個(gè)內(nèi)函數(shù),內(nèi)函數(shù)里運(yùn)用了外函數(shù)的臨時(shí)變量,并且外函數(shù)的返回值是內(nèi)函數(shù)的引用。這樣就構(gòu)成了一個(gè)閉包。
內(nèi)層函數(shù),對(duì)外層函數(shù)(非全局)的變量的引用# 閉包函數(shù)的基本用法 def func():name = 'eva'def inner():print(name)return innerf = func() #這里不好理解,改用fun()()應(yīng)該好接受一點(diǎn),調(diào)用函數(shù)里面的內(nèi)嵌函數(shù) f() # eva
閉包函數(shù)的意義及應(yīng)用領(lǐng)域:
?閉包的意義:返回的函數(shù)對(duì)象,不僅僅是一個(gè)函數(shù)對(duì)象,在該函數(shù)外還包裹了一層作用域,這使得,該函數(shù)無論在何處調(diào)用,優(yōu)先使用自己外層包裹的作用域
應(yīng)用領(lǐng)域:延遲計(jì)算(原來我們是傳參,現(xiàn)在我們是包起來)
用法:
def multipliers():return [lambda x : i*x for i in range(4)]print [m(2) for m in multipliers()] output: # [6, 6, 6, 6]
如何輸出[0,2,4,6]呢?
def multipliers():# 添加了一個(gè)默認(rèn)參數(shù)i=ireturn [lambda x, i=i: i*x for i in range(4)]print [m(2) for m in multipliers()] output: # [0, 2, 4, 6]
?這里的multipliers就是一個(gè)閉包函數(shù)。Python的延遲綁定其實(shí)就是只有當(dāng)運(yùn)行嵌套函數(shù)的時(shí)候,才會(huì)引用外部變量i,不運(yùn)行的時(shí)候,并不是會(huì)去找i的值,這個(gè)就是第一個(gè)函數(shù),為什么輸出的結(jié)果是[6,6,6,6]的原因。
閉包在開發(fā)中的實(shí)際作用:
幫助開發(fā)者維護(hù)一個(gè)“私密”空間,用于為以后執(zhí)行提供數(shù)據(jù)。
def f1(a1,a2):def inner():ret = a1 + a3 return ret return innern1 = f1('安安','張三') # 內(nèi)存 a1=安安,a2=張三 n2 = f1('馬哥','小鮮肉') # 內(nèi)存 a1=馬哥,a2=小鮮肉 n3 = f1('渣渣輝','小李子') # 內(nèi)存 a1=渣渣輝,a2=小李子 n1()
3.1 檢測(cè)閉包函數(shù)的公共屬性:__closure__
# 閉包函數(shù) # 輸出結(jié)果如果有 cell 就是閉包函數(shù) def wrapper():name = '是閉包'def inner():print(name) # 是閉包 inner()print(inner.__closure__) # (<cell at 0x000001945CE07588: str object at 0x000001945CE06B70>,) wrapper()# 非閉包函數(shù) # 輸出結(jié)果如果是 None 就不是閉包函數(shù) name = '不是閉包' def wrapper():def inner():print(name) # 不是閉包 inner()print(inner.__closure__) # None wrapper()
3.2 帶有參數(shù)的閉包函數(shù)
#帶有參數(shù)的閉包函數(shù) def wrapper(a): #a是外部傳入的參數(shù)b = 10def inner():#在內(nèi)函數(shù)inner中 用到了外函數(shù)的臨時(shí)變量bprint(a + b) #20inner() #對(duì)inner函數(shù)進(jìn)行調(diào)用,這步必不可少 wrapper(10)
轉(zhuǎn)載于:https://www.cnblogs.com/LearningOnline/p/8457453.html
總結(jié)
以上是生活随笔為你收集整理的函数小知识点(文档字符串,闭包等)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Redfin SDE intern】跪
- 下一篇: 金牛座男人喜欢什么样的女生?