Если вы пытаетесь получить количество слов в файле, f.read()
имеет больше смысла, чем f.readlines()
, поскольку устраняет необходимость суммировать построчное число. Вы получаете весь файл в чанке и затем можете разбить его на пустое пространство, используя split
без аргументов.
>>> with open("foo.py") as f:
... len(f.read().split())
...
1530
Если вы действительно хотите использовать readlines
, проще избежать functools.reduce
в любом случае и sum
длины split
строк (sum
- очень краткая операция сокращения на итерируемой, которая избавляет от отвлекающего накопителя):
>>> with open("foo.py") as f:
... sum(len(x.split()) for x in f.readlines())
...
1530
Хорошей практикой является использование with
менеджер контекста, поэтому ваш ресурс автоматически закрывается. Используйте пробелы вокруг всех операторов, чтобы код был читабельным.
Что касается работы functools.reduce
: он принимает лямбду, которая принимает аккумулятор в качестве первого аргумента и текущий элемент в качестве второго. Второй аргумент functools.reduce
является итеративным, а третий инициализирует аккумулятор. Оставляя это поле пустым, вы устанавливаете значение первого элемента в итерируемом - вероятно, не то, что вам нужно, поскольку идея состоит в том, чтобы выполнить числовое суммирование с помощью аккумулятора.
Вы можете использовать
>>> with open("foo.py") as f:
... ft.reduce(lambda acc, line: len(line.split()) + acc, f.readlines(), 0)
...
1530
но это кажется мне довольно рубиново-голдбергским способом решения проблемы.