Python基础-参数魔法,*args,**kwags

最近在带着新成员一块儿学习《Python基础教程》这本书,看到参数魔法的时候
忽然感受好多术语真的不知道呀~html

Python参数:位置参数,关键字参数

常常看Python咱们确定常常看见,下面相似这样的代码python

def add(x,y):
    return x+y

# 1
add(1,2)
# 2
add(x=1,y=2)

上面的两段代码结果是同样,可是含义却不同app

  • 第一种叫作位置参数:即,add函数根据调用时参数传进来时候的位置来肯定谁是x,谁是y
  • 第二种叫作关键字参数:即,add函数根据调用时指定的参数对应值来肯定x,y;这时也能够写成add(y=2,x=1)

两种方法各有本身的用途函数

Python收集参数

咱们都应该知道在Python3(2不支持)在解压可迭代对象是有星号表达式
进行多个元素的不肯定解包post

  • 而后收集参数是什么呢?如名字所示,就是当参数个数不定时,咱们函数的定义,相似收集的方式,知足不定长参数需求
  • 这里就也用到了星号*,不过星号表达式在解压可迭代对象时生成的是个列表,收集参数则要看星号的数量来决定类型

下段代码运行所示:学习

_, *b, _ = ["hello", "world", "test", "ddd"]
print(b)


def test(*parameter1, **parameter2):
    print('parameter1=', parameter1)
    print('parameter2=', parameter2)


test("hello", "world", fo="a", ss="b")

iRMKts.png

如图片所示,code

  • 收集参数中使用一个星号,即“*”,会对调用时导入的位置参数进行‘收集’转为元祖
  • 收集参数中使用两个星号,即“**”,会对调用时导入的关键字参数进行“收集”转换为字典

此时你可能已经联想到了常常遇到的 args,*kwargs,后面会提到htm

“收集参数“反转

上面提到了收集参数,针对函数定义在参数位置利用*来进行不定参数的收集
同时,咱们也能够利用相似的‘逆运算’,进行代码编写
以下面代码:对象

test1 = ("hello", "world")


def test(parameter1, parameter2):
    print("1.", parameter1,)
    print("2.", parameter2)


test(*test1)

iRMUAJ.png

args,*kwargs

如上面收集参数所示,在Python中只是习惯默认定义args为位置参数收集参数
*
kwargs为关键字参数收集参数
他们之间的区别也如上所示,咱们何时会用到他们呢?blog

除了上面提到的例子,我从args and *kwargs? (duplicate)摘下几个🌰

子类化

class Foo(object):
    def __init__(self, value1, value2):
        # do something with the values
        print value1, value2

class MyFoo(Foo):
    def __init__(self, *args, **kwargs):
        # do something else, don't care about the args
        print 'myfoo'
        super(MyFoo, self).__init__(*args, **kwargs)

装饰器

def mydecorator( f ):
   @functools.wraps( f )
   def wrapper( *args, **kwargs ):
      print "Calling f", args, kwargs
      v = f( *args, **kwargs )
      print "f returned", v
      return v
   return wrapper

什么是装饰器?

PS:

注意收集参数顺序,位置参数必须在关键字参数以前 也就是说,*args和**kwargs同时出现时,*args必须位于前面

相关文章
相关标签/搜索