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