zoukankan      html  css  js  c++  java
  • Python一等函数

    一等对象

    一等对象的定义:

      (1)在运行时创建

      (2)能赋值给变量或数据结构中的元素

      (3)能作为参数传给函数

      (4)能作为函数的返回结果

    ▲ Python中,整数、字符串和字典、函数都是一等对象。

    ▲ 函数的__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函数)

    匿名函数:

      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)
    

      

  • 相关阅读:
    MySQL 获得当前日期时间 函数
    Jquery 将表单序列化为Json对象
    Eclipse远程调试(远程服务器端监听)
    使用Eclipse进行远程调控
    Java基础教程(3)--回顾HelloWorld
    Java基础教程(2)--Java开发环境
    Java基础教程(1)--概述
    4.9上机
    4.2上机
    第四周作业
  • 原文地址:https://www.cnblogs.com/5poi/p/11184898.html
Copyright © 2011-2022 走看看