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)
相关文章
相关标签/搜索