在python中,如何将print更改为在for循环中返回?

在python中,如何将print更改为在for循环中返回?,python,for-loop,printing,return,bioinformatics,Python,For Loop,Printing,Return,Bioinformatics,下面的代码正在执行我想要的大部分操作 我所需要的就是将打印实际上变成一个返回,这样我就可以将数据转储到我正在编写的另一个txt文件中(f2) (另外,打印字母所获得的间距不是我想要的,但我想稍后再处理。) 每次我将print替换为return时,它只是在初始文本文件(f1)的第一行之后停止读取 改为使用yield,并将函数视为生成器。这样,调用者就可以随心所欲地使用DNA2Prot函数生成的所有蛋白质,并从文件中读取,直到读取整个文件 def DNA2Prot(f1, f2='translate

下面的代码正在执行我想要的大部分操作

我所需要的就是将
打印
实际上变成一个
返回
,这样我就可以将数据转储到我正在编写的另一个txt文件中(
f2

(另外,
打印字母所获得的间距
不是我想要的,但我想稍后再处理。)

每次我将
print
替换为
return
时,它只是在初始文本文件(
f1
)的第一行之后停止读取


改为使用
yield
,并将函数视为生成器。这样,调用者就可以随心所欲地使用
DNA2Prot
函数生成的所有蛋白质,并从文件中读取,直到读取整个文件

def DNA2Prot(f1, f2='translated_fasta.txt'):
    # prefer using `with` to `open` and `close`
    with open(f1, 'r') as fin:
        for letters in fin: 
            if letters[0] != '>':
                seqs = letters
                codons = [ ]
                protein = ''
                for i in range(0, len(seqs), 3):
                    # no need for a try catch, because we can use `get`
                    # get will return None by default if the 
                    # specified `codon` does not appear in 
                    # `codon_table`
                    codon = seqs[i:i + 3]       
                    codons = codon_table.get(codon)
                    if codons:
                        protein += codons
                yield protein
            else:
                yield letters        
现在,您必须将
DNA2Prot
函数视为一个
迭代器

with open('/path/to/outfile', 'w') as f:
    for protein in DNA2Prot(f1):
        # do something with protein
        print protein

改为使用
yield
,并将函数视为生成器。这样,调用者就可以随心所欲地使用
DNA2Prot
函数生成的所有蛋白质,并从文件中读取,直到读取整个文件

def DNA2Prot(f1, f2='translated_fasta.txt'):
    # prefer using `with` to `open` and `close`
    with open(f1, 'r') as fin:
        for letters in fin: 
            if letters[0] != '>':
                seqs = letters
                codons = [ ]
                protein = ''
                for i in range(0, len(seqs), 3):
                    # no need for a try catch, because we can use `get`
                    # get will return None by default if the 
                    # specified `codon` does not appear in 
                    # `codon_table`
                    codon = seqs[i:i + 3]       
                    codons = codon_table.get(codon)
                    if codons:
                        protein += codons
                yield protein
            else:
                yield letters        
现在,您必须将
DNA2Prot
函数视为一个
迭代器

with open('/path/to/outfile', 'w') as f:
    for protein in DNA2Prot(f1):
        # do something with protein
        print protein

第一件事。当您使用return语句时,您是在告诉您的代码从return语句所在的点中断(即离开)。这意味着您的代码将从fin开始读取,移动到第二个,并且一旦完成(读取该行的所有字母),它将到达您的return语句并从DNA2prot函数中断

现在,当涉及到文件时,您可以做两件事。首先是使用打印功能将输出重定向到文件(不推荐)或正确打开文件并写入其中

关于第一个解决方案(假设您使用的是python 2.7),您只需执行以下操作:

from __future__ import print_function
当您想使用打印语句时,只需写下:

print(protein, file = fin).
但是,如果我是你,我会选择一种更优雅、更干净的解决方案,不依赖不必要的进口:

def DNA2Prot(f1, f2="translated_fasta.txt"):
with open (f1, 'r+') as fin, open(f2, 'w+') as fin2: #Using the "with-open" statement you don't need to close the file object
    for letters in fin:
        if letters[0]!=">":
            seqs=letters
            codons=[ ]
            protein=''
            for i in range(0,len(seqs),3):
                try:
                    codon=seqs[i:i+3]
                    codons=codon_table[codon]
                    protein=protein+codons
                except KeyError:
                     protein+=""
            f2.write(protein) # Write your data to the second file             

        else:
            f2.write(letters) 

第一件事。当您使用return语句时,您是在告诉您的代码从return语句所在的点中断(即离开)。这意味着您的代码将从fin开始读取,移动到第二个,并且一旦完成(读取该行的所有字母),它将到达您的return语句并从DNA2prot函数中断

现在,当涉及到文件时,您可以做两件事。首先是使用打印功能将输出重定向到文件(不推荐)或正确打开文件并写入其中

关于第一个解决方案(假设您使用的是python 2.7),您只需执行以下操作:

from __future__ import print_function
当您想使用打印语句时,只需写下:

print(protein, file = fin).
但是,如果我是你,我会选择一种更优雅、更干净的解决方案,不依赖不必要的进口:

def DNA2Prot(f1, f2="translated_fasta.txt"):
with open (f1, 'r+') as fin, open(f2, 'w+') as fin2: #Using the "with-open" statement you don't need to close the file object
    for letters in fin:
        if letters[0]!=">":
            seqs=letters
            codons=[ ]
            protein=''
            for i in range(0,len(seqs),3):
                try:
                    codon=seqs[i:i+3]
                    codons=codon_table[codon]
                    protein=protein+codons
                except KeyError:
                     protein+=""
            f2.write(protein) # Write your data to the second file             

        else:
            f2.write(letters) 

请修复缩进,在运算符、赋值周围添加空格。。。另外,粘贴一些示例数据,以便我们了解文件包含的内容考虑到有用的答案并接受作为答案,请查看您的代码在命中无效密码(实际上被跳过)后继续翻译。最好是崩溃或有一个完整的密码子表。请修复缩进,在运算符、赋值周围添加空格。。。另外,粘贴一些示例数据,以便我们了解文件包含的内容考虑到有用的答案并接受作为答案,请查看您的代码在命中无效密码(实际上被跳过)后继续翻译。最好是崩溃或者有一个完整的密码子表。