zoukankan      html  css  js  c++  java
  • 函数的参数传递

    直接指定参数名的方法就不介绍了,更加灵活的行参方式用的更多。

     func(*args) 方式是把参数作为 tuple 传入函数内部。而 func(**kargs) 则是把参数以键值对字典的形式传入。

    在变量前加上星号前缀(*),调用时的参数会存储在一个 tuple(元组)对象中,赋值给形参。在函数内部,需要对参数进行处理时,只要对这个 tuple 类型的形参(这里是 args)进行操作就可以了。因此,函数在定义时并不需要指明参数个数,就可以处理任意参数个数的情况。

    不过有一点需要注意,tuple 是有序的,所以 args 中元素的顺序受到赋值时的影响。如:

    def printAll(*args):

    for i in args:

    print i,

    print

    调用:

    printAll(1,2,3)

    printAll(3,2,1)

    输出:

    1 2 3

    3 2 1 

    虽然3个参数在总体上是相同的,但由于调用的顺序不一样,结果也是不同的。

    字典是无序的,所以在输出的时候,并不一定按照提供参数的顺序。同样在调用时,参数的顺序无所谓,只要对应合适的形参名就可以了。于是,采用这种参数传递的方法,可以不受参数数量、位置的限制。

    示例:

    def printAll(**kargs):

       for k in kargs:

       print k, ':', kargs[k] 

    printAll(a=1, b=2, c=3)

    printAll(x=4, y=5) 

    输出:

    a : 1

    c : 3

    b : 2

    y : 5

    x : 4

    Python 的函数调用方式非常灵活,前面所说的几种参数调用方式,可以混合在一起使用。

    在混合使用时,首先要注意函数的写法,必须遵守:

    带有默认值的形参(arg=)须在无默认值的形参(arg)之后;

    元组参数(*args)须在带有默认值的形参(arg=)之后;

    字典参数(**kargs)须在元组参数(*args)之后。

    无默认值的形参>有默认值的形参>元组参数(*args)>字典参数(**kargs)

    可以省略某种类型的参数,但仍需保证此顺序规则。

    调用时也需要遵守:

    指定参数名称的参数要在无指定参数名称的参数之后;

    不可以重复传递,即按顺序提供某参数之后,又指定名称传递。

    而在函数被调用时,参数的传递过程为:

    1.按顺序把无指定参数的实参赋值给形参;

    2.把指定参数名称(arg=v)的实参赋值给对应的形参;

    3.将多余的无指定参数的实参打包成一个 tuple 传递给元组参数(*args);

    4.将多余的指定参数名的实参打包成一个 dict 传递给字典参数(**kargs)。

  • 相关阅读:
    2018CodeM复赛
    poj3683
    bzoj3991
    bzoj2809
    bzoj1001
    bzoj1412
    计蒜之道2018复赛
    HDU2255
    bzoj1010
    bzoj2006
  • 原文地址:https://www.cnblogs.com/youyuan-wang/p/6616108.html
Copyright © 2011-2022 走看看