Py学习  »  Python

python中函数的进阶用法

生信修炼手册 • 3 年前 • 462 次点击  

欢迎关注”生信修炼手册”!

python支持函数式编程范式,对于函数,还有更加高级的玩法,首先介绍高阶函数的概念。所谓高阶函数,就是可以将函数作为参数输入的一种函数。在python中,常用的高阶函数有以下几种

  1. map

  2. filter

  3. sorted

map的作用和for循环一样,对集合中的每一个元素进行操作,基本用法如下
# 自定义函数>>def add(x): return x + 2# 自定义函数作为map的参数,传递进入>>> r = map(add, [1234])>>> r0x0086E628>>>> list(r)[3, 4, 5, 6]

可以看到,map是一个函数,其第一个参数也是一个函数,因此称map是高阶函数。map调用对应的函数,对集合中的每一个元素进行处理。需要注意的是,其返回值是一个map类型的对象,需要通过list函数将其展开为列表。

filter的作用就是进行筛选,用法如下

# 自定义函数,返回值为逻辑值>>def is_odd(x): return x % 2 == 0...>>>>>> r = filter(is_odd, [1234])>>> r0x0086E340>>>> list(r)[2, 4]

可以看出,filter筛选出了返回值为True的数据。

sorted的作用是排序,用法如下

>>def extract(x): return int(x[3:])...>>>>>> sorted(['chr1''chr12''chr2'], key = extract)['chr1', 'chr2', 'chr12']

对染色体名称进行排序,是一个典型的使用场景。上述代码中,首先根据key指定的函数对列表中的每一个元素进行处理,就是提取chr后面的字符,并转换成整数,函数会根据转换好的整数进行排序,对于数值,默认按照从小到大的顺序进行排列,去除了chr字符的干扰,就可以排列出我们想要的顺序。

在上面的代码中,自定义函数有一个共同点,就是逻辑都非常简单,一行代码就搞定了。对于这样的函数,python有一个更加简便的写法,称之为匿名函数,用法如下

>>> r = map(lambda x:x + 2, [1234])>>> list(r)[3456]>>> sorted(['chr1''chr12''chr2'], key = lambda x : int(x[3:]))['chr1', 'chr2', 'chr12']

顾名思义,匿名函数就是没有名称的函数,改用lambda关键词进行定义,后面直接跟参数列表,然后冒号,冒号后面是函数内部的操作语句。匿名函数仅支持单条语句,返回值就是该语句处理后的值,不需要也不可以用return来声明返回值。

除了将函数作为参数,函数也可以作为返回值,典型的使用场景是递归调用,示例如下

# 定义一个计算阶乘的函数>>> def fact(n):...     if n == 1return 1...     return n * fact(n - 1)...>>> fact(4)24


    
>>> fact(3)6

上述代码中,自定义的阶乘函数的返回值是函数本身,这样的函数称之为递归函数。传统的思维方式倾向于通过循环来解决问题,而递归则是一种高度抽象。相比循环的方式,其代码更加简洁。

除了递归,还有一个经典的使用场景就是闭包。闭包是函数的嵌套,示例如下

>>> def grep_file(search):...     def greper(file_name):...             return [line for line in open(file_name) if search in line]...     return greper

上述代码定义的函数,实现了linux下grep的简单版本,筛选文件中包含指定关键词的行。从形式上看,该函数分成了两部分,第一部分是外围的grep_file函数,第二部分是内部的greper函数。调用外部函数时,实际上返回的是内部的函数,其调用方式如下

>>> grep_file('awk')('result.txt')

闭包是函数式编程中一种重要的组成结构,将面向过程的处理顺序抽象化成函数之间的参数传递。闭包在python中的一个典型应用是装饰器,在不改变函数定义的前提下,在函数执行时动态增加功能,示例如下

import functoolsimport timeimport os
# 定义装饰器# 在函数调用前打印时间def log(func):    @functools.wraps(func)    def wrapper(*args, **kw):        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))        return func(*args, **kw) return wrapper
# 通过@语法将装饰器绑定到run_cmd函数上@logdef run_cmd(cmd):    os.system(cmd)

上述代码定义了一个log装饰器,作用是在函数调用时打印时间,可以通过@语法将这个装饰器绑定在任意一个函数上。

·end·

—如果喜欢,快分享给你的朋友们吧—



原创不易,欢迎收藏,点赞,转发!生信知识浩瀚如海,在生信学习的道路上,让我们一起并肩作战!
本公众号深耕耘生信领域多年,具有丰富的数据分析经验,致力于提供真正有价值的数据分析服务,擅长个性化分析,欢迎有需要的老师和同学前来咨询。
  更多精彩



  写在最后


转发本文至朋友圈,后台私信截图即可加入生信交流群,和小伙伴一起学习交流。


扫描下方二维码,关注我们,解锁更多精彩内容!


一个只分享干货的

生信公众号



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/62753
 
462 次点击