为什么Python中的生成器实现不正确?

时间:2016-09-15 05:33:50

标签: python generator

所以基本上我正在编写一个程序,我需要在其中包含一个包含大写字母的文件,这些文件可能会或可能不会被空格或新行分隔,并将生成器返回到文件中的字母。

例如:

Z FM
TM  CC

将返回一个输出为" Z"," F"," M"," T",&#34的发电机; M"" C"" C"

该函数应该是一个生成器,因此它一次只能加载字母而不是整个文件。

无论如何,这是我到目前为止所拥有的。有人告诉我哪里出错了?

def buildGen:
    with open(filename) as sample:
        for word in sample:
           for ch in word:
               yield ch

4 个答案:

答案 0 :(得分:2)

您的代码存在许多问题:

  1. 您使用错误的语法定义函数(def buildGen:< - 括号应该遵循)。

  2. 您对输出的描述意味着您需要解决空格字符。

  3. 以下输出示例中的输出(假设您的文件为stuff.txt):

    # Note `buildGen` takes now `filename`.
    def buildGen(filename): 
        with open(filename) as sample:
            for word in sample:
               for ch in word:
                   # Only yield non-whitespace.
                   if ch.strip():
                       yield ch
    
    print list(buildGen('stuff.txt'))
    

答案 1 :(得分:0)

您使用的是错误的缩进和错误的变量名称dna。你需要写这样的东西:

def buildGen:
    with open(filename) as sample:
        for line in sample.read().splitlines():
            for ch in line.split():
                yield ch

答案 2 :(得分:0)

假设输出中只包含uppercase letters only load in letters at a time instead of the entire file

def buildGen():
    with open(filename) as sample:
        while True:
            ch = sample.read(1)
            if ch:
                if 'A' <= ch <= 'Z':
                    yield ch
            else:
                break

答案 3 :(得分:-1)

你的逻辑是错误的,根据我的理解,你试图通过调用buildGen函数来读取文件并生成文件中的所有字母。

当您使用with语句时,它将每次关闭文件,并且您总是仅以第一行结束。另一点是你打开文件作为样本并使用dna本身会引发错误。

您可以使用此

实现相同目标
fp = open('sample.txt')
# generator for the data
data_generator = (c for c in fp.read())
for char in data_generator:
    print char


def read_chars(fp):
    for line in fp