社区所有版块导航
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

python中的生成器和迭代器

生信修炼手册 • 5 年前 • 699 次点击  

欢迎关注”生信修炼手册”!
迭代是python中最常见的操作,比如遍历一个列表
>>> a = [1, 2, 3]>>> for i in a:...     print(i)...123

然而迭代却不仅仅是for循环那么简单,在python中,迭代可以称得上最强大的功能之一。首先来看下迭代器的概念, 迭代器本质是一个对象,用于遍历元素,从元素的第一个位置开始,遍历到最后一个位置,通过iter方法可以将普通的sequence对象转换为迭代器,用法如下

>>> b = iter(a)>>> b0x7f1032d02da0>>>> type(b)<class 'list_iterator'>

迭代器用于遍历元素,当然支持for循环,但是其更灵活的地方,在于使用next方法来手动遍历,用法如下

>>> next(b)1>>> next(b)2>>> next(b)3>>> next(b)Traceback (most recent call last):  File "", line 1, in <module>StopIteration

迭代器只会向前遍历,而且记住已经访问过的元素,所以next方法从第一个元素开始,一直访问到最后一个元素,如果元素全部访问完毕,再次调用会输出StopIteration错误。

next实现了元素的手动遍历,允许我们更加灵活的遍历元素,生物信息中典型的应用就是读取fastq文件,fastq文件每4行一个单位,通过next手动遍历,可以一次访问其中的4行,代码如下

def parse_fastq(fastq):    with open(fastq) as f:        try:            while 1:                symbol   = next(f)                sequence = next(f)                comment  = next(f)                quality  = next(f)                print(symbol + sequence + comment + quality)        except StopIteration:            pass
if __name__ == '__main__': parse_fastq('test.fq')

除了iter方法外,通过生成器也可以产生一个迭代器。生成器的形式是一个函数,通过yield关键字返回迭代的元素,用法如下

def parse_fastq(f):    try:        while 1:            symbol   = next(f)            sequence = next(f)            comment  = next(f)            quality  = next(f)            yield symbol, sequence, comment,  quality    except StopIteration:        pass
if __name__ == '__main__': with open('test.fq') as f: for seq in parse_fastq(f): symbol, sequence, comment, quality = seq print(sequence)

在生成器中,根据自己的目的将需要的元素通过yield关键字进行返回,将复杂的逻辑封装在生成器中,调用的代码将大大地简化。在实际开发中,针对不规则的文本,通过生成器提取自己需要的关键元素,是最常见的用法。

·end·

—如果喜欢,快分享给你的朋友们吧—



原创不易,欢迎收藏,点赞,转发!生信知识浩瀚如海,在生信学习的道路上,让我们一起并肩作战!
本公众号深耕耘生信领域多年,具有丰富的数据分析经验,致力于提供真正有价值的数据分析服务,擅长个性化分析,欢迎有需要的老师和同学前来咨询。
  更多精彩



  写在最后


转发本文至朋友圈,后台私信截图即可加入生信交流群,和小伙伴一起学习交流。


扫描下方二维码,关注我们,解锁更多精彩内容!


一个只分享干货的

生信公众号





Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/63438
 
699 次点击