- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
def getrows(c):
return \
sum( # суммируем по категориям
map(
lambda category:
sum( # суммируем по itemid
map(
lambda itemidset:
sum( # суммируем по itemstring
map(
lambda itemstring:
map(
lambda info:
transaction(category, itemstring, info),
itemidset[itemstring].values()
),
itemidset.keys()
),
[]),
c[category].values()
),
[]
),
("completedAuctions", "failedAuctions", "completedBidsBuyouts")
),
[]
)
Залез в свой старый скрипт, генерирующий отчеты, думал кое-что подправить...
Увидел одну из функций (эту) и решил лучше забить тут что-то править хД
Причины такого ужаса - наверно отсутствие явной типизации в питоне и средств рефакторинга (rename variable, extract method, ...) в "IDE"
Но от этого просто десткий восторг наступает. Запишите в одну строчку.
Это что-то из http://www.nestor.minsk.by/sr/2006/02/sr60201.html, только очень красиво.
Это сейчас чтоб хоть как-то разобраться что происходит - отформатировал.
Кстати помогло, нужное исправление сделал и рефакторить не пришлось. В конце концов это не ПО а скрипт=)
Ох, недаром лямбду собирались выпилить.
Интересно, к чему относится этот код?
> Интересно, к чему относится этот код?
Есть такая игра - WoW, в нем есть аукцион.
Есть такой аддон - http://auctioneeraddon.com/ , для анализа цен на игровом рынке и ведения логов торговли.
А я писал скрипт для внеигрового анализа "базы данных" этого аддона и представления html отчета по торговле своих персонажей, с графиками, топами и т.д.
1) Лямбда в Питоне не нужна. Есть удобнее средства. Более 90% случаев использования лямбды можно записать более ясно и понятно с помощью list comprehensions или yield (вот ещё добавят yield from (PEP 380) и будет вообще хорошо). Остальное делается с помощью локальных или глобальных именованных функций. Или готовых кирпичиков operator.
2) Лямбда в Питоне убога. Допускаются только простые выражения, ничего серьёзного. И не может быть, учитывая особенности питоновского синтаксиса. Вот лямбды, предлагаемые для C++ и Java лишены этого недостатка.
Насколько стар этот скрипт -- точнее, версия питона, под которую он был написан? Лет пять назад альтернатив было куда меньше, чем сейчас. Если на чем-то глаз и спотыкается -- то на пустых листах [] в качестве второго аргумента map и sum.
Python 2.5 или 2.6, не помню какой тогда у меня стоял.
А там суммируются списки, и так как по умолчанию он суммирует с 0, то пришлось указать стартовое значение []. Хотя вероятно такое суммирование не эффективно (в памяти создаётся много временных списков), но пока не нашёл стандартной функции для объединения произвольного количества списков.
А так?
Но это квадратичная сложность, для линейной я уже нашёл itertools.chain
http://stackoverflow.com/questions/716477/join-list-of-lists-in-python
или
Код делает то же самое, что у меня, но намного красивее. И видимо эффективнее, так как у меня там форсировалось вычисление списков в sum.
Как-то не пришло в голову использовать ни множественный for в list comprehensions, ни yield, хотя знал о них.
Нет, милейший, проблема в другом...