2011-04-14 62 views
0

編寫一個以參數形式存在的函數,讀取的文件名返回文件中存在的偶數的數量。使用Python計算文件中的偶數

我已經嘗試過,請嘗試一下幫助。它不會返回偶數。

def counteven(l): 
    infile = open('even.txt', 'r') 
    num = infile.read() 
    for i in infile: 
     if (i %2!=0): 
      return i 

    infile.close() 

assertEqual(counteven('even.txt'),2) 

回答

1

你不說什麼格式的文件。根據你的嘗試,我假設你的文件在每一行只包含一個整數。

下面是一些與你的函數的問題:

  • 你傳入的參數叫做l的功能,但不使用它。您應該使用它作爲要打開的文件的名稱,而不是硬編碼'even.txt'
  • 您正在將整個文件讀入名爲num的變量,然後甚至不使用該變量。讀完整個文件後,在for循環中沒有什麼可以迭代的了。
  • 您的for循環以字符串形式遍歷文件的行。在測試之前,您需要將行轉換爲整數,如果它可以被二整除。
  • for循環中,您將返回找到的第一個偶數,而不是計算所有偶數。您需要在循環之前創建一個計數變量,並在每次找到偶數時在循環中遞增,然後在循環完成後返回計數。

如果你解決這些問題,你的函數應該是這個樣子:

def counteven(filename): 
    countOfEvenNumbers = 0 
    infile = open(filename, 'r') 
    for line in infile: 
    number = int(line) 
    if (number %2 == 0): 
     countOfEvenNumbers+= 1 
    infile.close() 
    return countOfEvenNumbers 

...

UPDATE(解決您的評論):

assertEqual是由unittest模塊提供的TestCase類的方法。 如果您正在編寫單元測試,則應在TestCase派生類中的測試用例中調用assertEqual

如果你只是想使ouside單元測試的斷言,你可以寫:

assert counteven('even.txt') == 2, ' Number of even numbers must be 2' 
+0

感謝傢伙的幫助。 – user493989 2011-04-16 19:14:27

+0

您好我曾嘗試之前的方式Ergwun建議和assertEquals工作不正常,我jst複製和粘貼Ergwun的解決方案assertEqual仍然不工作jst像我最初做我的。 – user493989 2011-04-16 19:58:50

+0

請參閱我的更新尋址assertEqual。 – Ergwun 2011-04-18 02:48:03

2

@Ergwun pointed out已經在你的代碼的問題。這是另一種解決方案:

def counteven(integers): 
    return sum(1 for n in integers if n % 2 == 0) 

with open('even.txt') as f: 
    numbers = (int(line) for line in f) 
    print(counteven(numbers)) 
+0

JF您的解決方案可用於打印bt,它不適用於assertequals。 – user493989 2011-04-16 19:59:44