欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

利用python进行数据分析(六)

程序员文章站 2022-06-15 12:30:15
第3章 函数3.2.4 匿名函数匿名函数是一种通过单个语句生成函数的方式,其结果本身就是是返回值,不需要def定 和return返回,调用更加方便。匿名函数使用lambda关键字定义,表达“我们声明一个匿名函数的意思”。其通用的格式为:<名称> = lambda <参数1 ... 参数n> : <表达式>看如下例子:>>>def short_function(x): return x * 2>>> s....

第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