- 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"
KoirN 27.10.2010 23:59 # 0
seonull 28.10.2010 05:38 # 0
user654321 28.10.2010 06:49 # +8
Altravert 01.11.2010 08:28 # +3
Но от этого просто десткий восторг наступает. Запишите в одну строчку.
Это что-то из http://www.nestor.minsk.by/sr/2006/02/sr60201.html, только очень красиво.
burdakovd 01.11.2010 13:57 # +1
Это сейчас чтоб хоть как-то разобраться что происходит - отформатировал.
Кстати помогло, нужное исправление сделал и рефакторить не пришлось. В конце концов это не ПО а скрипт=)
burdakovd 01.11.2010 13:57 # +2
Altravert 02.11.2010 07:08 # 0
gegMOPO4 30.11.2010 20:20 # +1
Ох, недаром лямбду собирались выпилить.
Интересно, к чему относится этот код?
burdakovd 30.11.2010 22:09 # 0
> Интересно, к чему относится этот код?
Есть такая игра - WoW, в нем есть аукцион.
Есть такой аддон - http://auctioneeraddon.com/ , для анализа цен на игровом рынке и ведения логов торговли.
А я писал скрипт для внеигрового анализа "базы данных" этого аддона и представления html отчета по торговле своих персонажей, с графиками, топами и т.д.
gegMOPO4 30.11.2010 23:11 # −1
1) Лямбда в Питоне не нужна. Есть удобнее средства. Более 90% случаев использования лямбды можно записать более ясно и понятно с помощью list comprehensions или yield (вот ещё добавят yield from (PEP 380) и будет вообще хорошо). Остальное делается с помощью локальных или глобальных именованных функций. Или готовых кирпичиков operator.
2) Лямбда в Питоне убога. Допускаются только простые выражения, ничего серьёзного. И не может быть, учитывая особенности питоновского синтаксиса. Вот лямбды, предлагаемые для C++ и Java лишены этого недостатка.
krushi 03.11.2010 10:46 # 0
Насколько стар этот скрипт -- точнее, версия питона, под которую он был написан? Лет пять назад альтернатив было куда меньше, чем сейчас. Если на чем-то глаз и спотыкается -- то на пустых листах [] в качестве второго аргумента map и sum.
burdakovd 03.11.2010 14:37 # 0
Python 2.5 или 2.6, не помню какой тогда у меня стоял.
А там суммируются списки, и так как по умолчанию он суммирует с 0, то пришлось указать стартовое значение []. Хотя вероятно такое суммирование не эффективно (в памяти создаётся много временных списков), но пока не нашёл стандартной функции для объединения произвольного количества списков.
krushi 03.11.2010 14:55 # +1
А так?
burdakovd 03.11.2010 16:04 # 0
Но это квадратичная сложность, для линейной я уже нашёл itertools.chain
http://stackoverflow.com/questions/716477/join-list-of-lists-in-python
gegMOPO4 30.11.2010 19:51 # +3
или
burdakovd 30.11.2010 21:42 # 0
Код делает то же самое, что у меня, но намного красивее. И видимо эффективнее, так как у меня там форсировалось вычисление списков в sum.
Как-то не пришло в голову использовать ни множественный for в list comprehensions, ни yield, хотя знал о них.
TheHamstertamer 28.10.2011 19:59 # 0
Нет, милейший, проблема в другом...