python 函数的调用的时候参数的传递_Python之道–函数参数的传递

Pyhton版本:2.7

主机环境:Gentoo Linux with Kernel 3.4.36

1、参数的传递

参数的传递都是通过赋值给本地变量名实现的。

不可变参数是通过“值”来传递的:在函数内修改变量不会传递给外面的变量

可变对象是通过“指针”来传递的:在函数内修改变量会传递给外面的变量

这个和C语言类似。

看下面的例子:

a = 1

b = ["some",]

def changer(x,y):

x = 3

y[0] = "spam"

changer(a,b)

print a,b

数字是不可变对象,而列表是可变对象。运行结果如下:

1 ['spam']

自动传入对象的参数进行赋值的后果和运行一系列的简单的赋值语句是相同的。对于第一个参数x调用后的效果就像如下的过程:

a = 1

x = a

x = 2

print a

虽然x = 2运行之前x和a引用同一个对象,但是当x = 2修改x变量的时候会将x指向2对象。

打印出来的结果还是1。

如果想不改变可变对象,可以在调用的时候将可变变量进行赋值b的赋值可以使用changer(a,b[:])或者转换成远祖对象changer(a,tuple(b))

2、参数匹配

参数匹配有下面几种情况:位置、关键字、默认、可变参数、可变参数解包

2.1 位置参数是最常用的,也是最简单的,和其他语言函数调用是一样的

2.2 关键参数

def f(a,b,c):

return a,b,c

print f(b = 1,c = 2,a = 3)

这样就不用关系参数的位置了。如果是想位置参数和关键字混用,关键字参数必须在位置参数之后:

def f(a,b,c):

return a,b,c

print f(1,c = 2,b = 3)

但是像这样就不可以了:

def f(a,b,c):

return a,b,c

print f(1,c = 2,a = 3)

因为a参数已经通过位置自动赋值了参数。报错如下:

TypeError: f() got multiple values for keyword argument 'a'

2.3 默认参数

def f(a,b = 2,c = 3):

return a,b,c

print f(1)

print f(1,4)

print f(6,7,8)

运行结果:

(1, 2, 3)

(1, 4, 3)

(6, 7, 8)

2.4 任意参数

函数中*args可以支持任意数目的参数,**args支持将任意数目的关键词参数转换成字典

def min1(test,*args):

res = args[0]

for arg in args[1:]:

if arg < res:

res = arg

return res

def min2(first,*rest):

res = first

for arg in rest:

if arg < res:

res = arg

return res

def min3(*args):

tmp = list(args)

tmp.sort(reverse = False)

return tmp[0]

def f(a,**dargs):

return a,dargs

print f(1,b = 2,c = 3)

这个运行结果:(1, {'c': 3, 'b': 2})

2.5 解包参数

L = [3,4]

D = {'d':1,'c':2}

def f(a,b,c,d):

return a,b,c,d

print f(*L,**D)

输出结果:(3, 4, 2, 1)

下面这个例子:

def func1(a,b,c=3,d=4):

print a,b,c,d

func1(a,*(5,6))

输出结果:1 5 6 4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值