python的函数参数传递

来源:互联网 发布:c语言左移一位 编辑:程序博客网 时间:2024/05/17 08:01

笔者今天重新学习了python中的参数传递,发现对于我这样的初学者而言,python中函数的调用虽然不难,但是还是很容易混淆一些事情,因此写下这篇博客自警,也希望可以帮助大多数的人~


参数介绍

首先进行函数参数的介绍,看下面的程序

def function(a,b,c,*x,**y):    print 'a=%s, b=%s, c=%s' % (a, b, c)    print 'x=', x    print 'y=', y

很简单的一个函数,但是确实已经包含的整个函数传递的精华,其中a, b, c这三个参数就不做介绍了,学过编程语言的都会很清楚这三个变量的,但是在python中,有两点需要特别注意,1:由于没有类型符的修饰,这三个参数可以”指向“任何对象;2:当调用函数的时候,需要对三个值进行赋值操作,一个没有赋值就会报错,但是这个注意事项可以通过默认参数解决,比如下面这样的声明:

def function(a = 1, b = 2, c = 3)

学过C++或者更高级语言的都会明白,这样的声明方式相当于给a, b, c赋予了默认值,这样在使用函数的时候,即使不进行赋值,也可以使用,但是需要注意的是,当你进行参数的传递时,如果传入“一个”list或者tuple的时候,这时候此list和tuple是会赋予给a这个变量的!例如下面的代码

def function(a = 1, b = 2, c = 3, *x, **y):    print 'a=%s, b=%s, c=%s' % (a, b, c)    print 'x=', x    print 'y=', yif __name__=='__main__':    function((1, 3, 4))>>>a=(1, 3, 4), b=2, c=3>>>x= ()>>>y= {}

可变参数

上面的分析与代码都只是为了让读者对python中的函数中参数传递有个大概的了解,其实今天真正想要讲解的是“可变参数”这个东西,也就是x这个变量。对于一个list或者tuple而言,如果想要赋值给可变参数,则必须要在该list或者tuple前加*号,告诉解释器这个list或者tuple是传递给可变参数的,例如下列代码:

def function(a, b, c, *x, **y):    print 'a=%s, b=%s, c=%s' % (a, b, c)    print 'x=', x    print 'y=', yif __name__=='__main__':    function(1, 2, 3, *(1, 3, 4))>>>a=1, b=2, c=3>>>x= (1, 3, 4)>>>y= {}

这个代码看起来还是比较简单的,就是先赋予a,b,c三个变量值,之后把一个匿名元组给x,这是最规范的写法了,但是有时候,在阅读代码的时候,也可能看到这样的写法

def function(a, b, c, *x, **y):    print 'a=%s, b=%s, c=%s' % (a, b, c)    print 'x=', x    print 'y=', yif __name__=='__main__':    function(*(1, 2, 3, 1, 3, 4))>>>a=1, b=2, c=3>>>x= (1, 3, 4)>>>y= {}

从上面的例子可以看出,在python中,普通的参数其实也可以看做可变参数的一部分,当传入一个list或者tuple时,解释器会先对普通的参数进行赋值,如果传入的可变参数中有剩余,则给“可变变量”,也就是x,因此如果上述的程序中传入*(1, 2, 3)的话,该输出中的x依旧没有值!


关键字参数

最后的关键字参数倒是很好理解,你必须传入一个字典,不管是匿名的还是真实的变量,前面必须加上**号,告诉解释器这是关键字参数,其实也不用太过担心,因为如果你赋值错误的话,编译器会立即告诉你这里有错误。


总结

在python中,默认变量其实是可变参数的一部分,在进行赋值的时候,可以“指向”任何一种类型,因此,如果你想十分明确的告诉解释器默认参数的值,最好还是用functoin(a=1,b=2,c=3)这种属性赋值的方式,因为这样的赋值是最为明确且最为清晰的。

1 0