Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用lambda计算文件中的字数?_Python_Python 3.x_File_Lambda_Functools - Fatal编程技术网

Python 如何使用lambda计算文件中的字数?

Python 如何使用lambda计算文件中的字数?,python,python-3.x,file,lambda,functools,Python,Python 3.x,File,Lambda,Functools,我试图以一种非常规的方式使用reduce,lambda&readlines计算文件中的字数: import functools as ft f=open("test_file.txt") words=ft.reduce(lambda a,b:(len(a.split())+len(b.split())),f.readlines()) print(words) 当我试图拆分整数(索引)时,这会引发一个属性错误。如何让这段代码拆分由f.readlines()返回的iterable元素,并依次添加它

我试图以一种非常规的方式使用
reduce
lambda
&
readlines
计算文件中的字数:

import functools as ft
f=open("test_file.txt")
words=ft.reduce(lambda a,b:(len(a.split())+len(b.split())),f.readlines())
print(words)

当我试图拆分整数(索引)时,这会引发一个属性错误。如何让这段代码拆分由
f.readlines()
返回的iterable元素,并依次添加它们的长度(即,这些行中的字数)以最终计算文件中的总字数?

如果您试图获得文件中的字数,
f.read()
f.readlines()
更有意义,因为它避免了逐行计数求和的需要。将整个文件放在一个块中,然后可以使用
split
在空白处进行拆分,而无需参数

>>> with open("foo.py") as f:
...     len(f.read().split())
...
1530
如果你真的想使用
readlines
,就更容易避免使用
functools。在任何情况下都要减少
sum
拆分的
行的长度(
sum
是一个非常简洁的减少操作,在一个iterable上,它消除了分散注意力的累加器业务):

最好将
上下文管理器一起使用,这样您的资源就会自动关闭。在所有运算符周围使用空格,以便代码可读

至于让
functools.reduce
工作:它接受一个lambda,它接受累加器作为第一个参数,当前元素作为第二个参数。
functools.reduce
的第二个参数是iterable,第三个参数初始化累加器。将其保留为空会将其设置为iterable中第一项的值——可能不是您想要的值,因为这样做的目的是使用累加器执行数值求和

你可以用

>>> with open("foo.py") as f:
...     ft.reduce(lambda acc, line: len(line.split()) + acc, f.readlines(), 0)
...
1530

但这给我的印象是,这是一种相当鲁布的解决问题的方式。

或许可以阅读文档。然后写
lambda,b:a+len(b.split())
并在末尾添加一个初始值设定项
,0
>>> with open("foo.py") as f:
...     ft.reduce(lambda acc, line: len(line.split()) + acc, f.readlines(), 0)
...
1530