尝试创建一个带有文件名的函数,它返回一个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来查找行长度的总和吗?我是在第一部分做到的,但无法弄清楚下半场。 AM有点像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个字符,包括空格。我道歉,我误读了这个问题。每行的总长度也应包括空格。
答案 0 :(得分:2)
一个相当简单的方法是构建一个生成器以去除尾随空格,然后enumerate
去除(起始值为1)filter
空白行,并将每行的长度相加反过来,例如:
def code_metric(filename):
line_count = char_count = 0
with open(filename) as fin:
stripped = (line.rstrip() for line in fin)
for line_count, line in enumerate(filter(None, stripped), 1):
char_count += len(line)
return line_count, char_count
print(code_metric('cmtest.py'))
# (3, 85)
答案 1 :(得分:1)
为了计算行数,这段代码可能更清晰:
with open(file) as f:
lines = len(file.readlines())
对于程序的第二部分,如果您只想计算非空字符,则忘记删除'\ t'和'\ n'。如果是这样的话
with open(file) as f:
num_chars = len(re.sub('\s', '', f.read()))
有些人建议你在一个循环中做两件事。这很好,但是如果你将它们分开,你可以将它们分成不同的功能,并以这种方式具有更多的可重用性。除非您处理大量文件(或执行此编码数百万次),否则在性能方面无关紧要。