Python学习日志——自定义函数、匿名函数
自定义函数
自定义函数时,申明一下内容是一个函数,用def。
具有一个参数的函数语法如下:
def 函数名(参数):
......(内容)
return (返回值)
调用时 变量=函数名(参数)当没有参数时,括号中不写参数,但是括号一定要有!!!
匿名函数
lambda为申明匿名函数,格式如下:
lambda 参数:返回值
现在有一个匿名函数并对其调用
1 f=lambda x:x*x
2 print f(2)
输出
4
匿名函数同样可以有多个参数
1 f=lambda y,x:x*y
2 print f(2,3)
输出
6
匿名函数的用法主要是在一些简单的不需要反复调用的简单计算上。
在这里用filter函数做一个例子。
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。(此内摘自菜鸟教程)
例子如下:
过滤掉序列中的奇数
1 l=filter(lambda x:x%2==0,[5,69,86,33,14,5,26])
2 print l
输出:
[86, 14, 26]
可见用匿名函数之后,语句可以简洁得多。
返回值重点内容:
当函数中return 后面没有返回值时,默认返回None。要是在使用时,不需要获得函数返回值时,可以不用将变量复制函数返回值。
函数的返回值可以不局限为单个元素,因为Python中本身时弱数据类型,返回值本身就没有限定。
现在自定义一个函数,这函数有两个参数,比较两个参数的大小,获得更大的一位数,并返回其差值。
1 def getBigger(x, y): 2 if x > y: 3 return x - y, x 4 elif y > x: 5 return y - x, y 6 else: 7 return 0, x 8 9 10 value, bigger = getBigger(6, 7) 11 print (value) 12 print (bigger)
输出:
1
7
这就是两个返回值的情况,用逗号','隔开变量,便能对各变量赋值。
实际上只要返回值能对应上被赋值的变量,大部分情况下便能被赋值。(似乎是依据数据类型中某个属性和函数?)
(python本身就可以一次对多个变量进行赋值操作,比如:a,b=c,d)
修改如下:
1 def getBigger(x, y): 2 if x > y: 3 return x - y, x 4 elif y > x: 5 return y - x, y 6 else: 7 return 0, x 8 9 10
11 t = getBigger(6, 7) 12 print (t)
输出:
(1, 7)
即将返回的两个元素变为一个元组再赋予变量。
(可对不同数量的变量赋值各种函数返回值,测试规律,本人目前尚未了解其规律。似乎是依据数据类型中的一些属性和方法?)
若赋值给变量时,变量过多,则会报错
对于匿名函数来说 不能像def申明的函数一样通过return 关键字返回用逗号隔开的多个值
现在做一个测试:
1 f=lambda x,y:x/y,x*y
2 print f(4,6)
执行会报错,若是上述代码在python便宜工具中也会有错误的提示。
可见匿名函数不能返回多个值。但是可以通过一些其他手段来返回多个值,比如把多个需要的返回值放在一个列表中,这样就可以返回“多个”值,需要注意的是,匿名函数这时候同样是返回一个值,只是是列表而已
将上一段错误的代码修改如下:
1 f=lambda x,y:[x/y,x*y]
2 print f(4,6)
输出:
[0, 24]
再做一次修改
1 f=lambda x,y:[x/y,x*y]
2 x,y= f(4,6)
3 print x,y
输出:
0 24
可见。对于匿名函数序列型返回值,接受的多个变量不需要变为序列或者一个变量作为序列来接受返回值,只需要多个变量用逗号隔开,且能对对应上序列元素,便可以接受序列元素值。
对于赋值的规则同上述自定义函数一样,这点本身与函数似乎并没有多大关系,本身Python赋值规则便是如此。
待续!
posted on 2018-03-26 22:48 SaltFishYe 阅读(290) 评论(0) 编辑 收藏 举报