2016-09-15 35 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達到相同的:在'

​​
相關問題