Function python中计算非空行数和行长总和
我试图创建一个函数,该函数接受一个文件名,它返回一个2元组,其中包含该程序中的非空行数,以及所有这些行的长度之和。这是我目前的节目。我尝试了一下,得到了以下代码:Function python中计算非空行数和行长总和,function,python-3.x,functional-programming,tuples,Function,Python 3.x,Functional Programming,Tuples,我试图创建一个函数,该函数接受一个文件名,它返回一个2元组,其中包含该程序中的非空行数,以及所有这些行的长度之和。这是我目前的节目。我尝试了一下,得到了以下代码: def code_metric(file_name): with open(file_name) as f: lines = f.read().splitlines() char_count = sum(map(len,(map(str.strip,filter(None,lines)))))
def code_metric(file_name):
with open(file_name) as f:
lines = f.read().splitlines()
char_count = sum(map(len,(map(str.strip,filter(None,lines)))))
return len(lines), char_count
我应该使用函数映射、过滤和归约来实现这一点。我以前问过这个问题,并改进了我的答案,但它仍然给我一个错误。以下是问题先前版本的链接:
当我运行包含以下内容的文件cmtest.py时
import prompt,math
x = prompt.for_int('Enter x')
print(x,'!=',math.factorial(x),sep='')
结果应该是
(3,85)
但我一直得到:
(4,85)
(59, 2796)
要测试的另一个文件colltaz.py,例如:
结果应该是:
(73, 2856)
我一直得到:
(4,85)
(59, 2796)
以下是指向collatz.py文件的链接:
有人能帮我修改密码吗。我是python新手,任何帮助都会很好。试试以下方法:
def code_metric(file_name):
with open(file_name) as f:
lines = [line.rstrip() for line in f.readlines()]
nonblanklines = [line for line in lines if line]
return len(nonblanklines), sum(len(line) for line in nonblanklines)
示例:
>>> code_metric('collatz.py')
(73, 2856)
>>> code_metric('cmtest.py')
(3, 85)
讨论
仅通过删除行末尾的尾随换行符和尾随空格,我就能够实现collatz.py
的预期结果。这在本步骤中完成:
lines = [line.rstrip() for line in f.readlines()]
下一步是删除空白行:
nonblanklines = [line for line in lines if line]
len(nonblanklines)
sum(len(line) for line in nonblanklines)
我们要返回非空行数:
nonblanklines = [line for line in lines if line]
len(nonblanklines)
sum(len(line) for line in nonblanklines)
我们还希望返回非空行上的字符总数:
nonblanklines = [line for line in lines if line]
len(nonblanklines)
sum(len(line) for line in nonblanklines)
大文件的备用版本
此版本不需要一次将文件保存在内存中:
def code_metric2(file_name):
with open(file_name) as f:
lengths = [len(line) for line in (line.rstrip() for line in f.readlines()) if line]
return len(lengths), sum(lengths)
使用reduce
Python的创建者Guido van Rossum介绍了reduce
内置:
所以现在reduce()。这其实是我最讨厌的一个,
因为,除了一些涉及+或*,几乎每次
我看到一个reduce()调用带有一个非平凡的函数参数,我需要
拿起笔和纸,画出实际输入的内容
函数,然后才能理解reduce()应该做什么。所以
在我看来,reduce()的适用性仅限于
关联运算符,在所有其他情况下,最好写出
累加循环是显式的
因此,reduce
。不过,为了兼容性,它仍然可以在functools
模块中使用。下面的代码说明如何将reduce
用于此特定问题:
from functools import reduce
def code_metric3(file_name):
with open(file_name) as f:
lengths = [len(line) for line in (line.rstrip() for line in f.readlines()) if line]
return len(lengths), reduce(lambda x, y: x+y, lengths)
下面是另一个版本,它更多地使用了reduce
:
from functools import reduce
def code_metric4(file_name):
def fn(prior, line):
nlines, length = prior
line = line.rstrip()
if line:
nlines += 1
length += len(line)
return nlines, length
with open(file_name) as f:
nlines, length = reduce(fn, f.readlines(), (0, 0))
return nlines, length
@John1024-谢谢..它似乎适用于该特定文件,但不适用于任何其他文件。它总是给我错误的结果。@BoJaNgLeS请给我一个这样一个文件的例子,以及(a)你得到的输出和(b)你认为应该得到的输出。@BoJaNgLeS经过一些测试后,诀窍似乎是在进行计数之前从行中删除尾随的换行符和任何尾随空格。我已经用适用于这两个示例的代码更新了答案。@BoJaNgLeS我添加了一个部分,说明如何使用
reduce
。它还讨论了python3中reduce
的当前状态。@BoJaNgLeS我添加了另一个更高级使用reduce
的示例。