使用 yield 调用函数不输出答案

Calling on function with yield not outputting answer

我正在尝试使用 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()

当我 运行 我目前所拥有的并打印新字典 self.substrings 时,函数 get_all_substrings 的所有值是:

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

我知道这与产量有关,但搜索无法帮助我修复它。

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 一个迭代器

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)]

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

如果要存成self.substrings[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_all_substring() 的唯一用例,您绝对不需要生成器。所以你可以简单地删除 yield 键和 return 一个数组。