一等對象的定義:python
(1)在運行時建立數據結構
(2)能賦值給變量或數據結構中的元素函數
(3)能做爲參數傳給函數ui
(4)能做爲函數的返回結果spa
▲ Python中,整數、字符串和字典、函數都是一等對象。code
▲ 函數的__doc__屬性用於生成對象的幫助文本。用於help(function1)命令輸出內容協程
def function1(num): ''' return n! ''' return 1 if n<2 else n * function1(n-1)
>>> funtion1.__doc__
' return n! '
高階函數:對象
接受函數爲參數,或者把函數做爲結果返回的函數是高階函數。(map函數、sorted函數、filter函數、reduce函數)blog
匿名函數:字符串
lambda函數的定義體只能使用純表達式。不能賦值,也不能使用while和try等python語句。
在參數列表中最適合使用匿名函數。
可調用對象:
除了用戶定義的函數,調用運算符()還能夠引用到其餘對象上。能夠使用內置的callable()函數判斷對象可否調用。
7種可調用對象:
用戶定義的函數,def語句或lambda表達式建立。
內置函數:C語言實現的函數,len等
內置方法:C語言實現的方法,dict.get
方法:在類的定義體中定義的函數
類:調用類時會運行類的__new__方法建立一個實例,而後運行__init__方法,初始化實例,最後把實例返回給調用方。
類的實例:若是類定義了__call__方法,那麼它的實例能夠做爲函數調用。
生成器函數:使用yield關鍵字的函數或方法。調用生成器函數返回的是生成器對象。生成器函數還能夠做爲協程。
函數的參數處理機制:
函數對象有個__defaults__屬性,值是一個元組,保存着位置參數和關鍵字參數的默認值。
僅限關鍵字參數的默認值保存在__kwdefaults__屬性中。
參數名稱在__code__.co_varnames 中,同時裏面還保存了函數定義體中建立的局部變量。
因此參數名稱是前N個字符。N的值經過__code__.co_argcount 獲取。所以要從後向前掃描才能把參數和默認值對應起來。
def tag(name,max_len=80,mix_len=0,*content,cls=None,**kwargs): a = 0 >>> print(tag.__defaults__) (80, 0) >>> print(tag.__kwdefaults__) {'cls': None} >>> print(tag.__code__.co_varnames) ('name', 'max_len', 'mix_len', 'cls', 'content', 'kwargs', 'a') >>> print(tag.__code__.co_argcount) 3
inspcet模塊
inspect.signature函數返回一個inspect.Signature對象,它有一個parameters屬性和return_annotation屬性。
parameters屬性裏是一個有序映射,把參數名和inspect.Paramter對象對應起來。
每一個Paramter屬性也有本身的屬性(如name、default、和kind)inspect_empty表示沒有默認值
inspect.Signature對象有一個bind方法,能夠任意個參數綁定到簽名】、中的形參上。
使用這個方法在調用函數前驗證參數。
import inspect sig = inspect.signature(tag) my_tag = { 'name':'Wu', 'max_len':50, 'min_len':10, 'cls':'cls_1', 'img':'k:/', } v_args = sig.bind(**my_tag) for name,value in v_args.arguments.items() #v_args.arguments一個OrderedDict對象 print(name, '=' value) >>> del my_tag['name'] >>> bound_args = sig.bind(**my_tag) Traceback (most recent call last):
... TypeError: missing a required argument: 'name'
函數註解:
爲函數聲明中的參數和返回值附加元數據。
函數聲明中的各個參數能夠再:以後增長註解表達式。若是參數有默認值,註解放在參數名和 = 號之間。
若是想註解返回值,在)和函數聲明:之間添加 -> 和一個表達式。表達式能夠是任何類型。(經常使用int,str和字符串)
>>> def f(ham: str, eggs: str = 'eggs') -> str:
註解以字典形式存儲在函數的__annotations__屬性中
>>> sig =inspect.signature(tag) >>> sig.return_annotation <class 'str'> >>> for param in sig.paramters.values(): print(param.annotation) print(param.name) print(param.default)