2011-04-14 3 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 вы вернете первое четное число, а не считаете все четные числа. Вам необходимо создать переменную 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 является метод класса TestCase, предоставляемый модулем unittest. Если вы пишете единичный тест, то assertEqual следует вызывать в тестовом примере в классе, производном от TestCase.

Если вы просто хотите, чтобы сделать утверждение о находящейся модульном тестировании вы можете написать:

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

спасибо, ребята, за помощь. – user493989

+0

привет, я попытался сделать это до того, как предложил Ergwun, и assertEquals не работает должным образом, и я скопировал и вставил решения 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 ваше решение работает, чтобы напечатать его, не работая для assertequals. – user493989

Смежные вопросы