Chinaunix首页 | 论坛 | 博客
  • 博客访问: 43690
  • 博文数量: 15
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 176
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-31 01:57
个人简介

资深码农

文章分类

全部博文(15)

文章存档

2016年(3)

2014年(12)

我的朋友

分类: Python/Ruby

2016-09-21 22:51:48

初学Python的同学看到类似下面这样的函数都会比较迷惑,估计很多人会想难不成python也有指针和指向指针的指针?

点击(此处)折叠或打开

  1. def f(a, *pargs, **kargs):
  2.     print(a, pargs, kargs)
实际上这是python的很重要的一个特性,即arbitrary arguments。当你需要一个函数支持任意多个参数的时候,你就会用到它。上面例子中的那个函数,python会把匹配上的参数作为一个tuple(元祖)来处理。可以像下面这样调用函数f,python会把1匹配给参数a,把3, 'abc', ('lls', 'pow')匹配给pargs,

点击(此处)折叠或打开

  1. f(1, 3, 'abc', ('lls', 'pow'), param1 = 'A')
打印出来结果如下,
(1, (3, 'abc', ('lls', 'pow')), {'param1': 'A'})
可以看出pargs被用tuple (3, 'abc', ('lls', 'pow'))赋值。
类似的,前面出现两个星号的kargs会被用字典匹配,即所有像param = x这种格式的传入参数会被转成dict赋值给给kargs。
需要注意的是,在定义函数的时候**kargs这种类型的参数必须放在最后(如果有的话),而*pargs这种类型的参数必须放在**kargs这种类型参数的前面,其他类型参数的后面。
比如下面这几种定义都是非法的,

点击(此处)折叠或打开

  1. def f(a, *b, c=6, **d):
  2.     pass
  3. def f(a, **b, *c):
  4.     pass
  5. def f(*a, **b, c):
  6.     pass
  7. def f(a, b, *c, **d, e):
  8.     pass
而下面这几种定义都是合法的

点击(此处)折叠或打开

  1. def f(a, **b):
  2.     pass
  3. def f(a, *b):
  4.     pass
  5. def f(*a, **b):
  6.     passs
  7. def f(**a):
  8.     pass
  9. def f(a, b=1, *c, **d):
  10.     pass
举一个实际一点的例子,写一个函数,输入任意多个数字作为参数,找到其中最大的一个,就可以利用我们提到的*pargs, 代码如下

点击(此处)折叠或打开

  1. def max(*pargs):
  2.     maxNum = pargs[0]
  3.     for i in pargs[1:]:
  4.         if i > maxNum:
  5.             maxNum = i
  6.     return maxNum

  7. print max(5, 3, 1, 43, 54, 23, 1, 2, 32)
结果打印54。


阅读(2021) | 评论(0) | 转发(0) |
1

上一篇:Python 学习笔记(二) 理解Python的Closure

下一篇:没有了

给主人留下些什么吧!~~