Python一等函數

 

一等對象

一等對象的定義: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)
相關文章
相關標籤/搜索