【发布时间】:2015-02-07 22:52:59
【问题描述】:
我正在尝试创建一个函数,该函数采用文件名并返回一个 2 元组,其中包含该程序中非空行的数量以及所有这些行的长度之和。这是我目前的程序:
def code_metric(file):
with open(file, 'r') as f:
lines = len(list(filter(lambda x: x.strip(), f)))
num_chars = sum(map(lambda l: len(re.sub('\s', '', l)), f))
return(lines, num_chars)
如果我这样做,我得到的结果是:
if __name__=="__main__":
print(code_metric('cmtest.py'))
是
(3, 0)
什么时候应该:
(3,85)
还有没有更好的方法来使用函数 map、filter 和 reduce 来找到行长度的总和?我为第一部分做了,但无法弄清楚后半部分。我对 python 有点陌生,所以任何帮助都会很棒。
这里是名为 cmtest.py 的测试文件:
import prompt,math
x = prompt.for_int('Enter x')
print(x,'!=',math.factorial(x),sep='')
First line has 18 characters (including white space)
Second line has 29 characters
Third line has 38 characters
[(1, 18), (1, 29), (1, 38)]
行数为 85 个字符,包括空格。对不起,我误读了这个问题。每行的总长度也应包括空格。
【问题讨论】:
-
你确定在数字符数时没有数行中的空格吗?
-
您正在执行两次迭代(每次打开文件并循环遍历行)-如果您想提高效率,为什么不将两个操作合并到一次迭代中?
-
@Aradmey- 我相当肯定。它只差 1。这就是为什么我似乎无法弄清楚为什么?我
-
@alfasin- 我不知道该怎么做。关于如何做的任何建议?
-
您正在计算所有非空格字符的字符。因此,如果有一些你没有看到的空白——最后是一个制表符或一个额外的 CR——你的计数可能不是你所期望的。在
for line in f:之后,您可以添加print(repr(line))以查看实际情况。 (PS:你可能对isspace方法感兴趣。)
标签: function python-3.x tuples lambda