问题描述
|
编写一个函数,该函数以要读取的文件名作为参数,返回文件中存在的偶数个数。
我已经尝试过,请尝试一些帮助。它不返回偶数。
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)
解决方法
@Ergwun已经指出了代码中的问题。这是另一个解决方案:
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))
,您没有说文件的格式是什么。根据您的尝试,我假设您的文件每行仅包含一个整数。
这是您的函数存在的一些问题:
您正在将参数传递给名为l
的函数,但未使用它。您应该使用它作为要打开的文件的名称,而不是硬编码“ 3”。
您正在将整个文件读入一个名为num
的变量,然后甚至不使用该变量。读完整个文件后,您的for循环中没有剩下要迭代的内容了。
您的“ 5”循环将文件的各行作为字符串进行迭代。您需要先将线转换为整数,然后再测试该线是否可被二整除。
在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
...
更新(以解决您的评论):
assertEqual
是unittest
模块提供的TestCase
类的方法。
如果要编写单元测试,则应在测试用例中从TestCase
派生的类中调用assertEqual
。
如果您只想对单元测试进行断言,则可以编写:
assert counteven(\'even.txt\') == 2,\' Number of even numbers must be 2\'