要看懂列表解析,首先要知道几个定义,第一个是python的解释器,虽然大多数时候,我们都将python当作一门编程语言来看待,实际上,python也是一个名为解释器的软件包,解释器是一种能让其他程序运行起来的程序,如果你写了一段代码,让python解释器读取程序,并且按着命令执行,得出结果,实际上,解释器是代码雨计算机硬件之间的软件逻辑层,计算机上安装的python程序就是一个解释器和一些基本的库,例如os,sys模块,是最基本的包。值得一提的是在python的解释器里面运行。第二个是迭代器(iterate),迭代器是一种对象,它可以用来遍历标准模版库容器中的所以或者部分元素,例如对列表进行迭代,是最基本的迭代,列表就是一个可迭代对象,
先看看这两个例子:
手动构建一个表达式结果的列表:
list1=[1,2,3,4,5,6,7]
list2=[]
for i in list1:
list2.append(i +10)
print list2
在方括号内:
list1=[1,2,3,4,5,6,7]
list2=[x + 10 for x in list1]
print list2
这两个简单的例子主要是想让大家知道,手动构建与在方括号内运算方式的区别,手动for 循环进行遍历是常规的python代码进行列表的遍历,而在方括号遍历是以C语言的速度来执行的,往往速度会快很多,一般可以快一倍左右,我们生物信息数据往往比较大,优化脚本可以提高速度,便于提高工作效率。
接下来我们看下,几个比较典型的函数:
第一个是zip函数:我们直接用例子来理解zip函数
zip([1,2],[3,4])
[(1,3],(2,4)]
zip解析输入的所有列表,一次按照位置输出组成的元组,最后形成一个列表,类似于二维数组的列表
值得一提的是在python3中zip将不是直接返回一个列表,而是直接生成一个迭代器,如果要生成一个列表,必须要用list()将返回的迭代器强制变成一个列表
然后看看map函数
这个函数比较实用,我们也用一个例子来解释它:
map(abs,[1,-1,-2])
[1,1,2]
map将根据abs函数对列表中的每个数值依次处理,然后放回一个新的列表
同样的,在python3中,map将返回一个迭代器,而不是列表。同样需要用list()将其强制转换成列表
filter函数也是一样的:
filter(bool,[’spam’,’’,’ni’])
[’spam’,’ni’]
对于传入的函数返回true的每一项都返回
再来说下迭代器相关的:
手动迭代器和内置函数的迭代器的不同:
在python3.X中手动迭代器定义给多个变量时,各个变量会记住其各自的位置,但是内置函数生成的迭代器,例如前面讲的map,zip,和filter自定生成的迭代器,不能定义给多个变量,即不能支持相同结果上的多个活跃的迭代器来句两个例子说明吧
第一个是手动迭代器:
R= range(3)
I1 = iter(R)
I2 = iter(R)
next(I1)
0
next(I2)
0
这两个迭代器是相同的,但是他们各自独立,迭代的时候会记住各自的位置
再看看内置函数返回的迭代器:
filter(bool,[’spam’,’’,’ni’])
<filter object at Ox0269C6D0> # python3.X中filter返还的是一个迭代器
R = filter(bool,[’spam’,’’,’ni’])
I1= iter(R)
I2=iter(R)
next(I1)
0
next(I2)
1
这个内置函数生成的迭代器不支持相同结果上的多个活跃的迭代器
同样的zip和map,也不支持,至于为什么会这样的更改,我想等我学到后面会了解到
By milkcookie
FAFU