python cookbook学习笔记十四:函数(1)
来源:互联网 发布:阿里云怎么监控 编辑:程序博客网 时间:2024/05/16 12:01
接受任意数量参数的函数. 当传入函数的参数个数很多的时候,在函数定义的时候不需要为每一个参数定义一个变量,可以用*rest的方式来包含多余的参数。
如下面的代码,*rest包含了2,3,4这3个参数。且可以迭代访问。在这个例子中,rest其实就是其他位置参数组成的一个元组
def avg(first,*rest): for i in rest: print i average=(first+sum(rest))/(1+len(rest)) print average
avg(1,2,3,4)
如果我们需要传递带关键字的参数:可以用下面的方法。当采用**attr的时候,attr其实是一个包含所有被传入进来的关键字参数的字典
def avg(first,**attr): for item in attr.items(): print item,attr[item[0]]
avg(1,size='large',quantity=0)
得到的结果如下:
E:\python2.7.11\python.exe E:/py_prj/python_cookbook.py
('quantity', 0) 0
('size', 'large') large
如果想强制让某些参数用关键字参数传递,可以将强制关键字参数放到*参数后面或者单个的*后面
Lambda:
在C语言中,对于一些短小的实现。可以不用函数而是写一个宏的方式来实现。
比如#define M(y) y*y+3*y 那么M(5)最终的结果就是5*5+3*5=40
在python中也有类似的实现,这就是lambada。代码如下,这就是实现了一个加法的lambda
add=lambda x,y:x+yprint add(3,4)
再来看下面的这个例子:
我们想对name中的名字按照姓来进行排序。在sorted中指定key值也就是排序的依据。在这里用lambda name:name.split()[-1].lower()的方式将每个名字的姓提取出来,然后在赋值给key
name=['David Beazley','Brains Jones','Raymond Hettinger','Ned Batchelder']ret=sorted(name,key=lambda name:name.split()[-1].lower())print ret
来看一个比较有意思的例子:
x=10a=lambda y:y+xx=20b=lambda y:y+x
print a(10)print b(10)
上面的代码a(10)和b(10)的值是多少,20和30?直观上是对的,但是实际上结果却是30和30. 为什么会这样呢。我们来单步运行下:
首先运行了a=lambday:y+x 后,对应的x=10
在运行了b=lambda y:y+x后,对应的x=20
此时执行到print a(10)。这个时候跳转到a=lambda y:y+x 此时的x=20,因此a(10)就等于20+10=30
从这上面的例子可以看出,尽管我们在lambda之前定义了x的值。但是最终的值并不是定义的时候就绑定,而是在实际lambda运行时才开始绑定。而在lambda实际运行也就是print a(10)的时候,x的值已经被赋值成了20.
如果想让参数在lambda定义的时候就固定,需要在定义的时候就设置参数的值
a=lambda y,x=x:y+x
在lambda中设置x=x,这样就将x的值绑定成了10这个值。
这个在列表推导的时候特别容易出错。如下面的代码。我们期望得到的是0,1,2,3,4
fun=[lambda x:x+n for n in range(5)]for f in fun: print f(0)
但是最终的结果却是4,4,4,4,4. 原因和之前的一样,n在被调用的时候被为4。
改成如下代码,n的值就可以每次都被绑定了。
fun=[lambda x,n=n:x+n for n in range(5)]
partial使用:
如果函数的参数值太多,partial可以固定一个或多个参数的值,在调用的时候可以减少调用的参数个数。如下面的代码。固定d=3,在调用的时候只需要设置a,b,c的值
def spam(a,b,c,d): print a,b,c,d
s1=partial(spam,d=3)s1(0,1,2)
来看一个实际的例子,假设你有一个点的列表来表示(x,y)坐标元组。你可以使用下面的函数来实现
points=[(1,2),(3,4),(5,6),(7,6)]
def distance(p1,p2): x1,y1=p1 x2,y2=p2 return math.hypot(x2-x1,y2-y1)
但是如果我们想计算到某个基点的距离,并基于这个距离来进行排序。该如何操作呢。之前我们讲了lambda的用法。我们可以用lambda来实现,代码如下
points=[(1,2),(3,4),(5,6),(7,6)]pt=(4,3)ret=sorted(points,key=lambda points: math.hypot(pt[0]-points[0],pt[1]-points[1]))print ret
用lambda实现稍显冗余。Partial可以精简下代码。在这里我们将distance的第二个参数p2固定为pt。这样在调用的时候其实就不
ret=sorted(points,key=partial(distance,pt))print ret
这样在调用的时候其实就是下面的样式:
distance((1,2),(4,3))
distance((3,4),(4,3))
distance((5,6),(4,3))
distance((7,6),(4,3))
阅读全文
0 0
- python cookbook学习笔记十四:函数(1)
- python cookbook 学习笔记--1
- Python cookbook进阶学习-函数
- Python cookbook 学习笔记一
- [pyhton]python cookbook学习笔记
- python-cookbook学习笔记一
- python-cookbook学习笔记二
- python-cookbook学习笔记三
- python-cookbook学习笔记四
- python-cookbook学习笔记五
- python-cookbook学习笔记六
- python-cookbook学习笔记七
- python-cookbook学习笔记十一
- python技巧(2):--python cookbook学习笔记
- python技巧(3)--python cookbook学习笔记
- python技巧(4)----python cookbook学习笔记
- python cookbook学习笔记十五:回调函数(1)
- python cookbook学习笔记十六:类和对象(1)
- 欢迎使用CSDN-markdown编辑器
- mysql 修改root密码和开启远程访问
- 剑指Offer-24
- 支持向量机讲解
- The event in requested index is outdated and cleared (the requested history has been cleared ) 问题和修复
- python cookbook学习笔记十四:函数(1)
- Python数据分析与挖掘实战(开发流程及常用库安装)
- linux sed 批量替换字符串
- CentOS 7下安装Python3.5
- 什么是工程师文化?
- UNIX ftp命令
- spring boot 官方文档翻译之 集成redis
- 怎么解决浏览器的兼容
- elasticsearch5.3.0安装sql插件