2016-09-15 102 views
1

所以基本上我正在写一个程序,我需要在一个文件中包含大写字母,可能或不可能由空白或新行分开,并返回一个生成器在文件中的字母。为什么我的生成器实现在Python中不正确?

例如:

Z FM 
TM CC 

将返回发生器的 “Z” 的输出, “F”, “M”, “T”, “M”, “C”, “C”

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

无论如何,这是我到目前为止。 ANYONE告诉我我错了哪里?

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

缩进是错误的,代码with'需要缩进,'dna'没有定义,应该是'sample'。 – TessellatingHeckler

+0

修正了它,虽然 –

回答

2

有许多与你的代码的问题:

  1. 你定义了错误的语法功能(def buildGen: < - 括号应该遵循)。

  2. 您对输出的描述意味着您需要处理空白字符。

下在你的榜样输出输出(假设你的文件是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')) 
+0

它们“*可以或不可以被换行符隔开*” - 如果它们不是,则'样本中的单词'将一次读取整个文件作为一行。 – TessellatingHeckler

+0

有没有一种方法可以做到这一点,并将内容保存到相同功能的列表中? –

+0

@TessellatingHeckler这是一个很好的观点。迭代开放(文件名)。无论有没有换行符,read()'都会起作用,但是,当然,这会加载所有内容(某种程度上会在某种程度上破坏生成器的用途)。 –

0

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

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

'def buildGen:'给出'SyntaxError:无效的语法'。 –

+0

这有些作用。有没有一种方法可以让它生成一个生成器并将内容保存到同一个方法中的列表中? –

-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 
+0

“*函数应该是一个生成器,所以它只会一次加载字母,而不是整个文件。*” - 'fp.read()'会一次加载整个文件。 – TessellatingHeckler

0

假设只有uppercase letters将被包含在输出和only load in letters at a time instead of the entire file达到相同的:在'

​​
相关问题