目录
一、常用工具函数集合
1.map函数
2.lambda去制作匿名函数
3.zip()用法(一个拆开粘合的小工具)
4.reduce()实现简单递归
5.打包解包的星星 *
6.filter()过滤器
7.sorted()排序小能手
二、解决实际的生物学问题
1.计算序列中的CG含量orACTG的各自的数量以及占比
2.计算序列长度
3.截取序列的前10个碱基以及ASCII码
4.如何将一整行的fastq文件开始用python处理
5.计算序列的平均值、标准偏差、中位数、最大值、最小值
map(function, iterable, ...)
将列表里的元素一个一个去执行fun(),非常方便nice
def sq(x):
return x*x
map(sq,[y for y in range(10)])
map(lambda x: x*x,[y for y in range(10)])
def与lambda都可以实现函数的功能,而且lambda更简洁而且 不用去想名字 /(ㄒoㄒ)/~~
sequences = ["ACGGACT", "GGACTTA", "GTACGGT"]
list(map(lambda pos: "".join(pos), zip(*sequences)))
输出结果:['AGG', 'CGT', 'GAA', 'GCC', 'ATG', 'CTG', 'TAT']
reduce的工作过程是 :在迭代序列的过程中,首先把 前两个元素(只能两个)传给 函数,函数加工后,然后把 得到的结果和第三个元素 作为两个参数传给函数参数, 函数加工后得到的结果又和第四个元素 作为两个参数传给函数参数,依次类推。
# 定义函数
def f(x,y):
return x*y
# 定义序列,含1~10的元素
items = range(1,11)
# 使用reduce方法
result = reduce(f,items)
print(result)
应用:将序列片段拼接
reduce(lambda a, b: a + b, sequences)
list(filter(lambda s: gc_perc(s) < 0.5, sequences))
上例是筛选出CG含量小于0.5的序列
sorted(sequences, key=gc_perc)
['GGACTTA', 'ACGGACT', 'GTACGGT']
默认是由小到大,若想倒序排列↓
sorted(sequences, key=gc_perc,reverse=True)
也可以用list.sort() 勿忘括号
int
__abs__,__add__,__and__,__bool__,__ceil__,__class__,__delattr__,__dir__,__divmod__,__doc__,__eq__,__float__,__floor__,__floordiv__,__format__,__ge__,__getattribute__,__getnewargs__,__gt__,__hash__,__index__,__init__,__init_subclass__,__int__,__invert__,__le__,__lshift__,__lt__,__mod__,__mul__,__ne__,__neg__,__new__,__or__,__pos__,__pow__,__radd__,__rand__,__rdivmod__,__reduce__,__reduce_ex__,__repr__,__rfloordiv__,__rlshift__,__rmod__,__rmul__,__ror__,__round__,__rpow__,__rrshift__,__rshift__,__rsub__,__rtruediv__,__rxor__,__setattr__,__sizeof__,__str__,__sub__,__subclasshook__,__truediv__,__trunc__,__xor__
str
__add__,__class__,__contains__,__delattr__,__dir__,__doc__,__eq__,__format__,__ge__,__getattribute__,__getitem__,__getnewargs__,__gt__,__hash__,__init__,__init_subclass__,__iter__,__le__,__len__,__lt__,__mod__,__mul__,__ne__,__new__,__reduce__,__reduce_ex__,__repr__,__rmod__,__rmul__,__setattr__,__sizeof__,__str__,__subclasshook__,capitalize,casefold,center,count,encode,endswith,expandtabs,find,format,format_map,index,isalnum,isalpha,isascii,isdecimal,isdigit,isidentifier,islower,isnumeric,isprintable,isspace,istitle,isupper,join,ljust,lower,lstrip,maketrans,partition,removeprefix,removesuffix,replace,rfind,rindex,rjust,rpartition,rsplit,rstrip,split,splitlines,startswith,strip,swapcase,title,translate,upper,zfill
list
__add__,__class__,__class_getitem__,__contains__,__delattr__,__delitem__,__dir__,__doc__,__eq__,__format__,__ge__,__getattribute__,__getitem__,__gt__,__hash__,__iadd__,__imul__,__init__,__init_subclass__,__iter__,__le__,__len__,__lt__,__mul__,__ne__,__new__,__reduce__,__reduce_ex__,__repr__,__reversed__,__rmul__,__setattr__,__setitem__,__sizeof__,__str__,__subclasshook__,append,clear,copy,count,extend,index,insert,pop,remove,reverse,sort
timeit 我滴计时器
CG含量函数如下
def gc_perc(s):
s = s.upper()
assert all(ch in {'A', 'C', 'G', 'T'} for ch in s), "DNA sequence should include only A, C, G, T"
gc_count = s.count('G') + s.count('C')
return gc_count / len(s)
若想算A的含量或个数(随便改改就好了捏)
#A的含量
def a_perc(s):
s = s.upper()
assert all(ch in {'A', 'C', 'G', 'T'} for ch in s), "DNA sequence should include only A, C, G, T"
a_count = s.count('A')
return a_count / len(s)
a_perc("ACCGATTACA")
#A的个数
def a_perc(s):
s = s.upper()
assert all(ch in {'A', 'C', 'G', 'T'} for ch in s), "DNA sequence should include only A, C, G, T"
a_count = s.count('A')
return a_count
a_perc("ACCGATTACA")
#AGCT所有的含量捏
def all_perc(s):
s = s.upper()
assert all(ch in {'A', 'C', 'G', 'T'} for ch in s), "DNA sequence should include only A, C, G, T"
a_count = s.count('A')
g_count = s.count('G')
c_count = s.count('C')
t_count = s.count('T')
return [a_count, g_count, c_count, t_count]
all_perc("ACCGATTACA")
还可以加上map一起用捏~( ̄▽ ̄)~*
sequences = ["ACGGACT", "GGACTTA", "GTACGGT"]
map(gc_perc, sequences)
list(map(lambda s: len(s), sequences))
import sys
fo = open("sample.fastq", "r")
line_num=0
for line in (fo):
line_num+=1
if line_num % 4 ==1 :
print(line.strip())
elif line_num % 4 == 2:
print(line.strip()[0:10])
elif line_num % 4 == 3:
print(line.strip())
elif line_num % 4 == 0:
print(line.strip()[0:10])
#将行转化成一个list
f = open("sample.fastq", "r")
ls=[]
line_num=0
for line in f:
line_num+=1
if line_num==4:
ls.append(line.replace('\n',''))
#试验一下print(ls)
#将list分割
sample= []
for i in ls:
for j in i: # 每个元素分割成多个元素
sample.append(j)
#试验一下print(sample)
#acs码转化
asca=[]
for i in sample:
asca.append(ord(i))
#试验一下print(asca)
反正学会open()、以及for line in file是关键
#计算平均值
numofjianji=0
zongzhiliang=0
for i in asca:
zongzhiliang+=i
numofjianji+=1
print('平均值为:')
print(zongzhiliang//numofjianji)
#计算标准偏差
import math
yigeshu=0
for i in asca:
yigeshu+=(i-(zongzhiliang//numofjianji))*(i-(zongzhiliang//numofjianji))
yigeshu=yigeshu//(numofjianji-1)
print('标准偏差为:')
print(math.sqrt(yigeshu))
#计算中位数
asca.sort()
if numofjianji%2==0:
print('中位数为:')
print((asca[numofjianji//2]+asca[numofjianji//2+1])//2)
else:
print('中位数为:')
print(asca[(numofjianji+1)//2])
#计算最大值
print('最大值为:')
print(asca[numofjianji-1])
#计算最小值
print('最小值为:')
print(asca[0])
4和5是一整套的,只有弄对了4,5就简单的编程 = =