Функция summer вполне работоспособна, но ее можно обобщить еще больше — сделав номера колонок ключами словаря, а не смещениями в списке, можно вообще избавиться от необходимости использовать номера колонок. Помимо того, что словари позволяют ассоциировать данные с описательными метками, а не с числовыми позициями, они часто оказываются более гибкими, чем списки, особенно когда число колонок в файле не является фиксированным. Например, предположим, что необходимо вычислить суммы колонок данных в текстовом файле, когда число колонок заранее неизвестно или оно не является фиксированным:
C:\…\PP4E\Lang> python
>>> print(open(‘table4.txt’).read())
001.1 002.2 003.3
010.1 020.2 030.3 040.4
100.1 200.2 300.3
В этой ситуации нет возможности заранее определить список сумм фиксированной длины, потому что количество колонок в разных строках может отличаться. Операция разбиения по пробельным символам извлекает колонки, а функция float преобразует их в числа, но список фиксированного размера не так-то просто приспособить для хранения сумм (по крайней мере, без дополнительного программного кода, управляющего его размером). Здесь удобнее использовать словари, потому что появляется возможность использовать позиции колонок в качестве ключей, вместо абсолютных смещений в списке. Это решение демонстрируется в следующем листинге интерактивного сеанса (определение функции находится также в файле summer3.py в пакете примеров):
> >> sums = {}
> >> for line in open(‘table4.txt’):
… cols = [float(col) for col in line.split()]
… for pos, val in enumerate(cols):
… sums[pos] = sums.get(pos, 0.0) + val
…
> >> for key in sorted(sums):
… print(key, ‘=’, sums[key])
…
0 = 111.3
1 = 222.6
2 = 333.9
3 = 40.4
>>> sums
{0: 111.3, 1: 222.6, 2: 333.90000000000003, 3: 40.4}
Интересно отметить, что в этом программном коде используются инструменты, которыми Python обрастал с годами, — итераторы файлов и словарей, генераторы, метод dict.get, встроенные функции enumerate и sorted отсутствовали в Python в первые годы его развития. Похожие примеры можно найти в главе 9, в обсуждении механизма библиотеки tkinter компоновки по сетке, где для работы с таблицами также используется функция eval. Логика вычисления сумм, реализованная в той главе, является вариацией на эту же тему — она получает количество колонок из первой строки в файле с данными и выполняет суммирование для отображения в графическом интерфейсе.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011