Python社区  »  Python

手把手带你学 Python3 | 元组拆包是个啥?

生信菜鸟团 • 8 月前 • 108 次点击  

大 热҈热҈热 天最适合在家学习python啦。这里是python学习笔记第四篇。

点推荐

如果还没有安装入门环境首选 pycharm ,可以参见 三剑客 PyCharm 小试

学习编程语言的起点绕不过语法基础,快速掌握规范代码可以参见 手把手带你学 Python3 | 编程基础与规范代码


上一期我们罗列了列表的几种用法,切片及截取都是非常常规的用法,在后面的使用中会经常碰到,建议经常查看哟。

手把手带你学 Python3 | 列表使用一文就够了


本期学习笔记,我们将来介绍元组:

元组定义

元组和我们上一期讲的列表很接近,只是元组定义了以后,包含的元素就不能修改,一般使用tuple = (obj,)来表示。且在计算过程中,元组的处理将比列表要快。

因此,如果要修改元组,我们只能通过变量进行重新赋值,不能进行元素的增删,否则会报错。

除了与列表类似的处理索引、截取、计算元组个数、最大值、最小值、长度、删除元组外,

len(tuple) 
tuple.count(obj)
max(tuple)
min(tuple)

元组也有自己的函数,比如:

1. 列表变元组,大家可以使用type()函数查看类型:

tuple('DNA')

tuple(['DNA','RNA','AA','peptide'])

2. 元组拼接,比较一下以下两种不同的方法所获得元组:

tuple1 = ('DNA'), (['DNA','RNA','AA','peptide'])

tuple2 =('DNA') + (['DNA','RNA','AA','peptide'])

3. 元组拆包

既然元组不能改变,因此可以把里面的值一对一的对应不同的变量,这个过程就称为拆包。举个例子:

tuple = ('DNA','RNA','AA','peptide')
D, R, A, P = ('DNA','RNA','AA','peptide'#完整拆包
D, _, A, P = ('DNA','RNA','AA','peptide'#部分拆包,_表示忽略对应位置元素
D, R, *rest = ('DNA','RNA','AA','peptide'#*rest代表多个对量,即省略对应位置的元素
D, *_, P = ('DNA','RNA','AA','peptide' #*也可以使用在中间,表示多个中间变量

备注1:变量的个数要与元组中包含的元素数量一致,不然会有报错。

ValueError: too many values to unpack (expected 2)

备注2:嵌套元组也是可以对应拆包的,比如大家可以尝试其贴入 pycharm中,然后输出各个变量看看对应的值。

D, R, (A, P) ='DNA','RNA',('AA','peptide')

小测试

这里贴一个选择题,大家可以将答案发在留言区,验证一下是否掌握了以上的概念~

?请问以下那边变量是元组类型:

a = (1)

b = [1]

c = ()

d = (1,1)

e = (1,[1,1])

f = (l,)


小测序2

既然元组具有不可变性及拆包,且存储空间小于列表,是否可以构建一个元组用于fa文件id与序列的一一对应,我们用以下测试文件:

less test.txt
>hsa_circ_00001
GTCCCACCCGAAAGATGCCCCCCAGCGCCAGTGCCGTGGACTTCTTCCAGCTCTTTGTCCCAGACAACGTCCTCAAGAACATGGTGGTGCAGACAAACATGTATGCCAAGAAGTTCCAGGAGCGGTTTGGGAGCGACGGAGCCTGGGTGGAGGTGACGCTGACGGAGATGAAGGCGTTCCTGGGCTACATGATCTCCACCAGCATCTCCCACTGCGAGTCCGTCCTCAGCATCTGGAGCGGAGGCTTCTACAGCAACCGCAGCCTCGCCCTCGTCATGAGCCAGGCCCGCTTCGAGAAGATCCTCAAGTACTTCCACGTCGTGGCCTTCCGCTCCAGCCAGACCACGCACGGGCTCTACAAGGTCCAGCCCTTCCTCGACTCCCTGCAGAACAGCTTCGACTCTGCCTTCAGGCCTTCCCAAACCCAGGTGCTACATGAACCCCTGATCGATGAGGATCCTGTATTCATTGCCACGTGCACAGAGCGGGAGCTGCGAAAGAGGAAAAAGCGGAAATTCAGCCTCTGGGTCAGACAATGTTCTTCCACTGGCTTCATCATCCAG
>hsa_circ_00002
GAAATTATCAGTTCATTGCCTAGCATAGTAAATGACAAATATGGAAGGAAGGTCCTATTGTACTTACTAAGCCCCAGAGATCCTGCACATACAGTACGAGAAATCATTGAAGTTCTGCAAAAAGGAGATGGAAATGCACACAGTAAGAAAGATACAGAGGTCCGCAGACGGGAGCTCCTAGAATCCATTTCTCCAGCTTTGTTAAGCTACCTGCAAGAACACGCCCAAGAAGTGGTGCTAGATAAGTCTGCGTGTGTGTTGGTGTCTGACATTCTGGGATCTGCCACTGGAGACGTTCAGCCTACCATGAATGCCATCGCCAGCTTGGCAGCAACAGGACTGCATCCTGGTGGCAAGGACGGAGAGCTTCACATTGCAGAACATCCTGCAGGACATCTAGTTCTGAAGTGGTTAATAGAGCAAGATAAAAAGATGAAAGAAAATGGGAGAGAAGGTTGTTTTGCAAAAACACTTGTAGAGCATGTTGGTATGAAGAACCTGAAGTCCTGGGCTAGTGTAAATCGAGGTGCCATTATTCTTTCTAGCCTCCTCCAGAGTTGTGACCTGGAAGTTGCAAACAAAGTCAAAGCTGCACTGAAAAGCTTGATTCCTACATTGGAAAAAACCAAAAGCACCAGCAAAGGAATAGAAATTCTACTTGAAAAACTGAGCACATAGGTGGAAAGAGTTAAGAGCAAGATGGAATGATTTTTTCTGTTCTCTGTTCTGTTTCCCAATGCAGAAAAGAAGGG
>hsa_circ_00003
ATGCCGAATATACCAACTCTCCTTTGGTACCTACATTCTGTACTCCTGGTTTGAAAATTCCATCTACAAAGAACAGCATAGCTTTG
>hsa_circ_00004
GTTTTACAAGATGAATTAGAAAACCGTTCTAATCAGGTGCGATGTGCAGAGAAAAAATTACAACACAAAGAATTGGAGTCACAGGAACAGATAACTTACATACGACAAGAATATGAAACAAAATTGAAAGGATTGATGCCAGCATCCCTAAGACAAGAACTTGAAGACACCATTTCCTCCCTAAAATCACAGGTTAATTTTCTGCAAAAGAGAGCTTCCATCCTTCAGGAAGAACTGACTACATATCAAGGCAGAAG
>hsa_circ_00005
ACACCATCCAGCACATGAGAGACAGCAAGCACATCGTCGTGTACCATCGAGGACGCTACTTCAAGGTCTGGCTCTACCATGATGGGCGGCTGCTGAAGCCCCGGGAGATGGAGCAGCAGATGCAGAGGATCCTGGACAATACCTCGGAGCCTCAGCCCGGGGAGGCCAGGCTGGCAGCCCTCACCGCAGGAGACAG

思路就是通过读文件将fa文件拆成两部分,然后构建元组拆包,实现ID对应序列查找:

import os
os.chdir('C:\\Users\\user\\desktop')
f = open('test.fa','rt')
f = f.readlines()

list_id = []
list_seq = []

for l in f:
    l = l.strip('\n')
    if l.startswith('>'):
        l = l.strip('>')
        l = vars(l)
        list_id.append(l)
    else:
        list_seq.append(l)

print(list_id)

------------Traceback (most recent call last):

  File "C:/Users/user/Desktop/tuple_test.py" , line 13in 
    l = vars(l)
TypeError: vars() argument must have __dict__ attribute

# 如果要定义变量要使用字典的

------------# 原思路实现拆包的类型如下,但是目前来说构建的ID无法转换为变量,因此拆包失败

hsa_circ_00001, hsa_circ_00002, hsa_circ_00003, hsa_circ_00004, hsa_circ_00005 = tuple(list_seq)

print(hsa_circ_00001)

------------
GTCCCACCCGAAAGATGCCCCCCAGCGCCAGTGCCGTGGACTTCTTCCAGCTCTTTGTCCCAGACAACGTCCTCAAGAACATGGTGGTGCAGACAAACATGTATGCCAAGAAGTTCCAGGAGCGGTTTGGGAGCGACGGAGCCTGGGTGGAGGTGACGCTGACGGAGATGAAGGCGTTCCTGGGCTACATGATCTCCACCAGCATCTCCCACTGCGAGTCCGTCCTCAGCATCTGGAGCGGAGGCTTCTACAGCAACCGCAGCCTCGCCCTCGTCATGAGCCAGGCCCGCTTCGAGAAGATCCTCAAGTACTTCCACGTCGTGGCCTTCCGCTCCAGCCAGACCACGCACGGGCTCTACAAGGTCCAGCCCTTCCTCGACTCCCTGCAGAACAGCTTCGACTCTGCCTTCAGGCCTTCCCAAACCCAGGTGCTACATGAACCCCTGATCGATGAGGATCCTGTATTCATTGCCACGTGCACAGAGCGGGAGCTGCGAAAGAGGAAAAAGCGGAAATTCAGCCTCTGGGTCAGACAATGTTCTTCCACTGGCTTCATCATCCAG

Process finished with exit code 0

(阵亡)。上述的不成功案例在shell里可以用一句代码实现:

$ grep hsa_circ_00001 -A 1 test.fa 
>hsa_circ_00001
GTCCCACCCGAAAGATGCCCCCCAGCGCCAGTGCCGTGGACTTCTTCCAGCTCTTTGTCCCAGACAACGTCCTCAAGAACATGGTGGTGCAGACAAACATGTATGCCAAGAAGTTCCAGGAGCGGTTTGGGAGCGACGGAGCCTGGGTGGAGGTGACGCTGACGGAGATGAAGGCGTTCCTGGGCTACATGATCTCCACCAGCATCTCCCACTGCGAGTCCGTCCTCAGCATCTGGAGCGGAGGCTTCTACAGCAACCGCAGCCTCGCCCTCGTCATGAGCCAGGCCCGCTTCGAGAAGATCCTCAAGTACTTCCACGTCGTGGCCTTCCGCTCCAGCCAGACCACGCACGGGCTCTACAAGGTCCAGCCCTTCCTCGACTCCCTGCAGAACAGCTTCGACTCTGCCTTCAGGCCTTCCCAAACCCAGGTGCTACATGAACCCCTGATCGATGAGGATCCTGTATTCATTGCCACGTGCACAGAGCGGGAGCTGCGAAAGAGGAAAAAGCGGAAATTCAGCCTCTGGGTCAGACAATGTTCTTCCACTGGCTTCATCATCCAG

关于shell的小技巧,推荐食用这篇文档~

Shell文本处理三剑客的使用小技巧

当然上述的报错也不是不可以解决的,只是要使用另一个数据类型 字典来操作,我们下期见。

小结

总体下来,list和tuple最大的差别就在于 Immutable上,这就带了更多安全性及性能优化,列表是相同类型的项目列表:文件,名称,对象,元组是不同类型对象的分组。如果进阶,还需多多实战,感受其中的魅力。如果有兴趣,可以搜搜 具名元组 的使用。


对啦,如果这篇推文对你有一点点的帮助,也请大家把点点 在看 动动小手 分享 给身边的小伙伴,如果有任何疑问都欢迎在留言区与我联系,你的反馈是我们写文莫大的动力,谢谢大噶:)

▼ 如果你生信基本技能已经入门,需要提高自己,请关注下面的生信技能树,看我们是如何完善生信技能,成为一个生信全栈工程师。

▼ 如果你是初学者,请关注下面的生信菜鸟团,了解生信基础名词,概念,扎实的打好基础,争取早日入门。

猜你喜欢:

热҈热】三剑客 PyCharm 小试

热҈编程基础与规范代码

热҈列表使用一文就够了

Shell文本处理三剑客使用小技巧 |awk grep sed +正则表达式

青蒿素科普贴

2019年五篇Cell文献阅读集锦

circRNA实验新更 - circRNA实验设计优化方案笔记

植物杂志 PP & PJ 都在用的研究思路

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/36470
 
108 次点击  
分享到微博