用yield调用函数不输出ans

2024-09-26 17:41:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用for循环从一组序列生成子字符串,这样就可以从每个序列中删除所有公共子字符串

我的代码:

class Unique():
    def __init__(self, seq = ''):
        self.head = head
        self.sequence = seq.replace('-','').replace('_','')
        self.original = {}
        self.substrings = {}



    def get_all_substrings(input_string):
        length = len(input_string)
        for i in range(length):
            for j in range(i + 1, length + 1):
                yield input_string[i:j]

    def sites(self):

        self.original[self.head] = self.sequence
        for key in self.original:
            self.substrings[key] = Unique.get_all_substrings(self.original[key])

#myReader.readFasta simply extracts the header and sequences which I'll be using
for head, seq in myReader.readFasta(): 
    myprog = Unique(seq)
    myprog.sites()

当我运行到目前为止所拥有的并打印新的dictionary self.substring时,函数get\u all\u substring的所有值是:

[<generator object Unique.get_all_substrings at 0x00000198A22C7258>]

我知道这与收益率有关,但搜索无法帮助我修复它


Tags: keyinselfforinputgetstringdef
2条回答

get\u all\u substring()是一个生成器。这意味着,如果您遍历它,它将生成值,但是您只调用它的方法

如果你想把它保存到self.substring[key] 你可以这样做

self.substrings[key] = list(Unique.get_all_substrings(self.original[key]))

或者

self.substrings[key] = [substr for substr in Unique.get_all_substrings(self.original[key])]

如果这是get\u all\u substring()的唯一用例,那么您肯定不需要生成器。因此,您只需删除yield键并返回一个数组

self.substrings[key] = list(Unique.get_all_substrings(self.original[key]))

必须迭代生成器才能获取其值(list这样做。。。但却破坏了发电机的某些功能)

strings = Unique.get_all_substrings(self.original[key])
print next(strings) # get the next one out of the generator
print next(strings) # and the next after that
for string in strings: # get the rest (skips first 2 since already consumed)
     print string

通常是如何与生成器交互的

如果您喜欢生成器的行为,可以只返回一个迭代器

return (  input_string[i:j] for i in range(length) for j in range(i + 1, length + 1))

或者一个列表,如果你想要的是一个列表

return [  input_string[i:j] for i in range(length) for j in range(i + 1, length + 1)]

相关问题 更多 >

    热门问题