python自定义函数参数_小议Python中自定义函数的可变参数的使用及注意点

Python的可变参数有两种,一种是列表类型,一种是字典类型。列表类型类似 C 中的可变参数,定义方式为

1

2

3

def test_list_param(*args) :

for argin args :

print arg

其中 args 是一个 tuple。

字典类型的可变参数:

1

2

3

def test_dict_param(**args) :

for k, vin args.iteritems() :

print k, v

其中 args 是一个 dictionary

可以分别传递 tuple 和 dictionary 给相应的可变参数,格式如下

1

2

3

4

a= (1,2,3)

b= {"a":1,"b":2,"msg":"hello"}

test_list_param(*a)

test_dict_param(**b)

带默认参数的函数

函数的带默认值参数能够很大程度上方便我们使用:一般情况下可以省略传参使用参数的默认值,也可以主动传参;调用的时候也不用在意参数的顺序方便使用,并且直接、显式;甚至还能用来当作魔法值,做一些逻辑上的控制。

但是由于python的默认值参数只会在函数定义处被解析一次,此后每次调用函数的时候,默认值参数都会是这个值了。碰到一些不可变的数据类型比如:整型,字符串,元祖之类的还好,但如果碰到可变类型的数据比如数组的话,就会有发生一些意想不到的事情。

让我们举一个简单的例子说明一下:

1

2

3

4

5

6

7

8

9

10

def add_to(num, target=[]):

target.append(num)

print id(target), target

add_to(1)

# Output: 39003656, [1]

add_to(2)

# Output: 39003656, [1, 2]

add_to(3)

# Output: 39003656, [1, 2, 3]

很显然如果你是想每次调用函数都能得到一个新的包含期望结果的数组,肯定不能如愿了。函数add_to的参数target在函数第一次被解析的时候会被赋值成空的数组,因为只会被解析一次,以后每次调用的时候都会在这个target变量的基础上进行操作,变量的id值也完全一样。想要得到预期的结果,可以为这种可变数据类型的参数指定一个None来表示空值:

1

2

3

4

a= (1,2,3)

b= {"a":1,"b":2,"msg":"hello"}

test_list_param(*a)

test_dict_param(**b)

在python的世界里,参数是按标识符传递(粗暴点解释就是按引用传递的),你需要担心的是参数的类型是否是可变的:

1

2

3

4

5

6

7

8

9

10

11

12

13

>>>def test(param1, param2):

...print id(param1),id(param2)

... param1+= 1

... param2+= 1

...print id(param1),id(param2)

...

>>> var1= 1

>>> var2= 2

>>>print id(var1),id(var2)

36862728 36862704

>>> test(var1, var2)

36862728 36862704

36862704 36862680

可变的数据类型,函数局部作用域里面的任何改变会保留在数据上;不可变的数据类型,发生的任何改变都只会体现在新生成的局部变量上,如同上面的列子中所示的效果,读者可以对比一下。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值