zoukankan      html  css  js  c++  java
  • 12装饰器及*args,**kwargs

    注:参数和返回值都是一个函数。

    1,无参数

    def decotare1(func):
        def wrapper():
            print("First")
            func()
        return wrapper    #注意,这里的wrapper没有打括号就证明是返回了函数体,而非函数运行结果。
    #无参数 @decotare1 def run(): print('run!') run() #结果: First run!

    2,有参数

    def decotare1(func):
        def wrapper(a,b):  #3
            print("First") 
            func(a,b)   #2
        return wrapper   
    
    #有参数,称为代码段1
    @decotare1
    def add(a,b):
        c = a + b
        print('结果:%s' %c)
    add(1,2)
    
    #结果:
    First
    结果:3

    为什么上述标黄?

    因为 add(1,2) 的运行就是代码段1的运行,代码段1相当于运行了“decotare1(add(a,b))“这个函数,而他返回了wrapper函数

    你的add(a,b)本身是带两个参数的,那么你返回的函数也应该带参数,所以#2和#3都带了参数。

    3,参数不确定的时候怎么办?

    from functools inport wraps #两个紫色的做固定用法,不会改变原来的意思
    #因为不佳两句紫色的那么函数名字会被改变。链接20分钟左右处。
    def decotare1(func):
      @wraps(func) def wrapper(
    *args,**kwargs): print("First") func(*args,**kwargs) return wrapper #无参数 @decotare1 def run(): print("Second") run() #1 #有参数 @decotare1 def add(a,b): c = a + b print('结果:%s' %c) add(1,2) #2

    上述代码对于无参数的run,和有参数的add来说都能直接调用,归功于:*args,**kwargs。

    这里详细介绍下*args,**kwargs:

    1,* 的意义
    def fun(a,b,c):
    ...     print a,b,c
    l = [1,2,3]
    >>>fun(*l)
    它拆开*后面的数列l的数值作为位置参数,并把这些位置参数传给函数’fun’来调用。
    注意:l与对应的fun函数中的参数个数对应。
    
    2,*args 的意义
    def fun(*args):
    ...     print args
    >>>fun()    #这个函数中可以带任意个参数。
    在这里,”args”是个元组。调用函数打印”args”时,他会打印元组中包含的所有数值。
    
    def fun(a,*args):
    ...     print args
    >>>fun()    #这个函数中也可以带任意个参数。
    
    3,** 的意义
    使用”**”调用函数,这种方式我们需要一个字典.
    注意:在函数调用中使用”*”,我们需要元组;在函数调用中使用”**”,我们需要字典。
    def fun(a, b, c):
    ...     print a, b, c
    >>> d={'b':5, 'c':7}
    >>> fun(1, **d)
    1 5 7
    但是:
    >>> d = {'a':7, 'b':3, 'c':8, 'd':90}
    >>> fun(**d)
    Traceback (most recent call last):出错了。
    fun(**d)等同于fun(a=7, b=3, d=90).传给函数”fun”想要的参数个数,但参数列表中并没有’d’,调用中’d’键值参数传给函数导致TypeError.
    
    4,**kwargs的意义
    用”**kwargs”定义函数,kwargs接收除常规参数列表职位的键值参数字典。在这里’kwargs’是个字典。所以字典就需要对应关系,比如fun里没C你传个C进去就没有用。
    def fun(a, **kwargs):
    ...     print a, kwargs
    此函数只用一个位置参数,因为常规参数列表中只有一个变量’a’.但是通过”**kwargs”,可以传多个键值参数。
    >>> fun(1, {'b':2, 'c':34})
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: fun() takes exactly 1 argument (2 given)
    正如错误提示,函数’fun’只需要一个位置参数,却给了两个。尽管’kwargs’接收键值参数作为一个字典,但你不能传一个字典作为位置参数给’kwargs’.你可以像下面那样调用:
    >>> fun(1, **{'b':2, 'c':34})
  • 相关阅读:
    Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能
    linux irq 自动探测
    gpio子系统和pinctrl子系统(下)
    gpio子系统和pinctrl子系统(中)
    gpio子系统和pinctrl子系统(上)
    linux驱动基础系列--linux spi驱动框架分析
    linux驱动基础系列--linux rtc子系统
    linux驱动基础系列--Linux I2c驱动分析
    camera驱动框架分析(上)
    camera驱动框架分析(中)
  • 原文地址:https://www.cnblogs.com/two-peanuts/p/10955274.html
Copyright © 2011-2022 走看看