python进阶语法,Python函数使用方法(高级用法)
Python支持函数式编程范式,函数还有更高级的玩法。首先,引入高阶函数的概念。所谓高阶函数,就是可以作为参数输入的函数。在python中,常用的高阶函数如下
mapfiltersorted
map的功能与for循环相同,它对集合中的每个元素进行操作。基本用法如下
#自定义功能
def add(x): return x 2
#用户定义的函数作为map的参数传入。
r=map(add,[1,2,3,4])
r
0x0086E628处的映射对象
列表(r)
[3, 4, 5, 6]
大家可以看到,map是一个函数,它的第一个参数也是一个函数,所以叫高阶函数。Map调用相应的函数来处理集合中的每个元素。注意它的返回值是一个map类型的对象,需要通过list函数展开成一个列表。
过滤器的功能是过滤,其用法如下
#自定义函数,返回值是逻辑值
def is_odd(x): return x % 2==0
.
r=滤波器(is_odd,[1,2,3,4])
r
0x0086E340处的过滤器对象
列表(r)
[2, 4]
可以看到,过滤器已经过滤掉了返回值为真的数据。
Sorted用于排序,其用法如下
def extract(x): return int(x[3:])
.
已排序([chr1 , chr12 , chr2],key=extract)
[chr1 , chr2 , chr12]
对染色体名称进行排序是一个典型的使用场景。在上面的代码中,首先按照key指定的函数对列表中的每个元素进行处理,即提取chr之后的字符并转换成整数。该函数将根据转换后的整数进行排序。至于数值,默认按照从小到大的顺序排列。去掉chr字符的干扰后,我们就可以安排想要的顺序了。
上面的代码中,自定义函数有一个共同点,就是逻辑非常简单,一行代码就搞定了。Python有一个更简单的方法来写这样的函数,叫做匿名函数,用法如下
r=map(x:x ^ 2,[1,2,3,4])
列表(r)
[3, 4, 5, 6]
已排序([chr1 , chr12 , chr2],key=lambda x : int(x[3:]))
[chr1 , chr2 , chr12]
顾名思义,匿名函数就是没有名字的函数。相反,它是由lambda关键字定义的,后面直接跟一个参数列表,后面跟一个冒号,再后面跟一个函数内部的操作语句。匿名函数只支持单个语句,返回值是语句处理后的值。Return不需要也不允许声明返回值。
函数除了可以作为参数,还可以作为返回值。典型的使用场景是递归调用。示例如下
#定义计算阶乘的函数
定义事实(n):
.如果n==1:返回1
.返回n *事实(n - 1)
.
事实(4)
24
事实(3)
6在上面的代码中,用户自定义阶乘函数的返回值就是函数本身,这样的函数称为递归函数。传统的思维方式倾向于通过循环来解决问题,而递归是高度抽象的。与循环方法相比,它的代码更加简洁。
除了递归,还有一个经典的使用场景,即闭包。闭包是函数的嵌套,如下例所示
def grep_file(搜索):
.def greper(文件名):
.如果在行中搜索,则返回[在打开的(文件名)中逐行]
.返回greper
上面代码定义的函数实现了linux下grep的一个简单版本,对文件中包含指定关键字的行进行过滤。形式上,这个函数分为两部分,第一部分是外设grep_file函数,第二部分是内部greper函数。当调用外部函数时,实际返回的是内部函数,调用如下
Grep_file(awk)(result.txt )闭包是函数式编程中重要的组件结构,它将面向流程的处理序列抽象为函数间的参数传递。python中闭包的一个典型应用是decorator,它在执行函数时动态添加函数,而不改变函数的定义。例子如下
导入功能工具
导入时间
导入操作系统
#定义装饰者
#打印函数被调用前的时间
定义日志(函数):
@functools.wraps(func)
定义包装(*args,**kw):
print(time . strftime( % Y-% M-% d % H:% M:% S ,time.localtime()))
返回函数(*args,**kw)
返回包装
#通过@ syntax将装饰器绑定到run_cmd函数
@日志
定义run_cmd(cmd):
操作系统(cmd)
上面的代码定义了一个log decorator,用于打印函数被调用的时间。您可以通过@ syntax将这个装饰器绑定到任何函数。
目标
—如果你喜欢,分享给你的朋友—
关注我们,解锁更多精彩内容!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。