社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

生信菜鸟团 • 5 年前 • 995 次点击  

大 热҈热҈热 天最适合在家学习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
 
995 次点击