利用python进行数据分析(六)
第3章 函数
3.2.4 匿名函数
匿名函数是一种通过单个语句生成函数的方式,其结果本身就是是返回值,不需要def定 和return返回,调用更加方便。匿名函数使用lambda
关键字定义,表达“我们声明一个匿名函数的意思”。
其通用的格式为:
<名称> = lambda <参数1 ... 参数n> : <表达式>
看如下例子:
>>>def short_function(x):
return x * 2
>>> short_function(5)
10
使用匿名函数则可以简化代码,可以写成:
>>>equiv = lambda x : x * 2
>>>equiv(5)
10
同时,匿名函数可以定义多个参数:
>>>function2 = lambda x, y, z : x + y + z
>>>function2(1, 2, 3)
6
匿名函数在数据分析中非常方便,因为在很多案例中数据变形函数都可以作为其他函数的参数,最常用的是将匿名函数作为sort
函数的key
,是数据排序更加符合我们的要求:
我们按字符串长短对列表中的字符串进行排序:
>>>strings = ['ds', 'ekja', 'poweak', 'dadioqj', 'pzqidade', 'osssssqknjd']
>>>strings.sort(key = lambda x : len(x))
>>>strings
['ds', 'ekja', 'poweak', 'dadioqj', 'pzqidade', 'osssssqknjd']
我们还可以按照字母的数量进行排序:
>>>strings = ['abbbb', 'abc', 'aaaaaaa', 'jkiu', 'poikpo', 'ossdqqknjd']
>>>strings.sort(key = lambda x : len(set(list(x))))
>>>strings
['aaaaaaa', 'abbbb', 'abc', 'jkiu', 'poikpo', 'ossdqqknjd']
通过将匿名函数传递给key
,我们可以做出更多的排序方式。
3.2.5 柯里化:部分参数应用
柯里化石计算机科学的术语,是以一位数学家的名字命名的,所以这个名字并没有明确的含义。它表示通过部分参数应用的方式从已有的函数中衍生出新的函数,看例子很容易理解。
有一个简单的将两个数字相加的函数:
>>>def add_numbers(x, y):
... return x + y
通过这个函数衍生出一个只有一个变量的新函数,add_five,给参数加上5:
add_five = lambda y : add_numbers(5, y)
这种情况下,第二个参数对于函数add_numbers就是柯里化了,相当于我们定义了一个新函数,而新函数调用了已存在的函数。
python中内建的functools
模块可以使用pratial
函数简化这种处理:
>>>from functools import partial
>>>add_six = partial(add_numbers, 6)
>>>add_six(7)
13
3.2.6 迭代器与生成器
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。我们使用的字符串、列表与元组都是可迭代对象。
在 Python 中,使用了yield
的函数被称为生成器(generator)
。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。而且在实际调用生成器时,只是生成了一个可迭代对象,只有真正请求生成器中的元素时,它才会执行代码。
我们通过例子来直观感受:
首先定义一个生成列表的普通函数:
>>>def c_list(n):
>>> return list(range(n))
#该函数可以直接使用
>>>c_list(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
如果使用yiled
生成一个生成器函数:
>>>def d_list(n):
>>> yield list(range(n))
#直接调用,返回的是一个生成器,代码没有立即执行
>>>d_list(10)
<generator object d_list at 0x00000194DAB03E58>
#打印生成器中的内容
>>>for x in d_list(10):
print(x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
注意到这里直接返回了一个列表,而我们知道如果对列表进行遍历的话,返回的应该是每个元素的值,这也说明了生成器并不是一个简单的可迭代列表形式。
因为生成器只有在具体访问的时候才会返回具体的值,所以生成器相对于迭代器的一大优点便是其占用空间小。
与列表推导式相对相应的是生成器表达式,只需要将列表解析式的中括号[]换成()即可。
gen = ( x ** 2 for x in range(100))
总的来数,生成器表达式是对内存空间的优化。他们不需要像方括号的列表解析一样,一次构造出整个结果列表。他们运行起来比列表解析式可能稍慢一些,因此他们对于非常大的结果集合运算是最优的选择。列表解析式最快,生成器表达式最省空间。
微生物基因组
上一节分享了关于寻找基因的内容,本节分享几个微生物基因组资源,一些可用于基因注释:
1, 蛋白直系同源簇(COG):全基因组蛋白的种类分类,每个COG由起源同一保守域单个蛋白质或并系同源蛋白群组成。
2,高质量自动和人工注释的微生物蛋白质组(HAMAP):可对微生物基因组测序产生的蛋白质序列进行自动注释。https://hamap.expasy.org/
3,京都基因和基因组百科全书(KEGG):可根据相互作用的分子或者基因组成信息途径。
4,微生物基因组数据库(MBGD):从不同方面为比较基因组学提供方便,如识别直系同源序列,收集并分析同源序列和蛋白膜体分析。http://mbgd.genome.ad.jp/
5,国立生物工程信息中心(NCBI)。
6,鲍森转运蛋白页(Paulsen Tranxporter Page):比较基因组间膜转运系统。http://www.membranetransport.org/transportDB2/index.html
7,RAST。也是注释基因组的。
本文地址:https://blog.csdn.net/liuninghua521/article/details/107237644