2011-04-14 11 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ループはファイルの行を文字列として反復処理します。 2で割り切れるかどうかをテストする前に、行を整数に変換する必要があります。
  • ループの内部では、すべての偶数を数えるのではなく、最初に見つかった偶数を返します。ループの前にcount変数を作成し、偶数が見つかるたびにループをインクリメントし、ループが完了した後にカウントを戻す必要があります。

あなたはこれらの問題を解決する場合は、あなたの関数は次のようなものになります。

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から派生したクラスのテストケースでassertEqualを呼び出す必要があります。

あなたは単にあなたが書くことができますユニットテストのouside主張したい場合は、次のコード内の

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

助けてくれてありがとう。 – user493989

+0

こんにちは私はErgwunの提案する前にそれをしようとしてassertEqualsが正常に動作していないと私はjstコピーし、Ergwunのソリューションを貼り付けassertEqualは私が最初に鉱山のようにjstを動作していません。 – user493989

+0

私の更新アドレスassertEqualを参照してください。 – Ergwun

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あなたのソリューションは、asserttequalsのために働いていないbtを表示するように動作します。 – user493989

関連する問題