Python for Everybody 第 11 章练习 2 'float' 对象不可调用

Python for Everybody Chapter 11 Exercise 2 'float' object is not callable

所以这是我的问题

练习 2:编写一个程序来查找以下形式的行: 新版本:39772
使用正则表达式和 findall() 方法从每一行中提取数字。计算数字的平均值并将平均值打印为整数。
输入 file:mbox.txt
38549
输入file:mbox-short.txt
39756

代码:

import re

rev = []

fname = input('Enter file: ')
try:
    fhand = open(fname)
except FileNotFoundError:
    print('File cannot be opened: ', fname)
    exit()


for line in fhand:
    line = line.rstrip()
    rev_temp = re.findall('^New Revision: ([0.0-9.0]+)', line)
    if not rev_temp:
        for val in rev_temp:
            val = float(val)            # Convert the strings to floats
            rev = rev + [val]           # Concats new values

rev_sum = sum(rev)
count = float(len(rev))
rev_ave = rev_sum / count

print(rev_ave)

这是输出

Enter file: mbox-short.txt
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-58-c4c50e707989> in <module>
     19             rev = rev + [val]           # Concats new values
     20 
---> 21 rev_sum = sum(rev)
     22 count = float*(len(rev))
     23 rev_ave = rev_sum / count

TypeError: 'float' object is not callable

为什么?

我认为您在某处无意中用一个名称相同的 sum 变量覆盖了内置 sum。寻找:

sum = <some float value>

据我所知,您使用的方法似乎没有正确处理使用匹配模式找到的行。相反,它仅在数字不存在时才尝试对其进行处理,这就是为什么您会收到“除以零”错误的原因。

但是,我们可以修改您的代码,改为查看所有匹配项的所有匹配字符串,并将这些已解析的数字附加为浮点数。然后从那里,你的求和和平均工作正常,没有错误。

import re

rev = []

fname = input('Enter file: ')
try:
    fhand = open(fname)
except FileNotFoundError:
    print('File cannot be opened: ', fname)
    exit()

for line in fhand:
    line = line.rstrip()
    #print(line)
    rev_temp = re.findall('^New Revision: ([0.0-9.0]+)', line)
    for x in rev_temp:
        rev.append(float(x))


rev_sum = sum(rev)
count = float(len(rev))
rev_ave = int(rev_sum / count)
print(fname, ':', rev_ave)

我得到以下文件名:

mbox.txt : 38549
mbox-short.txt : 39756

我从以下来源获取文件名:
https://www.py4e.com/code3/mbox.txt
https://www.py4e.com/code3/mbox-short.txt