Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
def delta( listToDelta ):
result = []
lastItem = listToDelta[0]
for i, item in enumerate(listToDelta):
if i == 0:
result.append(item)
else:
result.append(item-lastItem)
lastItem = item
return result
l = [2, 4, 6, 9, 7]
print(l)
l = delta(l)
print(l)
Всеми любимый Дениска (автор некоторых прошлых ГК на питоне) пошёл на поправку и написал не такое вонючее говно.
Комментировать код до сих пор отказывается, но зато стал выбирать имена для переменных получше.
в остальном заметно С-(императивное) мышление. А такие языки, как Питон или Руби заставляют мыслить не операторами, а... "блоками", что ли... Всмысле, не КАК сделать, а ЧТО сделать 🙂
Нет, на пустом списке не упадет. Вернет `(NIL). Так устроены car, cdr и mapcar. Mapcar не мой, mapcar был задолго до меня.
Опыт C++0x показывает, что пусть уж лучше скобочки берут числом, чем разнообразием )
>>> # Результат выполнения авторского говнокода:
>>> print delta(l)
[2, 2, 2, 3, -2]
>>> # Как оптимально
>>> print [x2-x1 for x1, x2 in zip([0]+l, l+[0])][:-1]
[2, 2, 2, 3, -2]
>>> # Можно ещё так:
>>> from operator import sub
>>> print map(lambda x: -sub(*x), zip([0]+l, l+[0])[:-1])
[2, 2, 2, 3, -2]
>>> # Вот так делать не надо, мне было интересно поломать голову над использованием reduce:
>>> print reduce(lambda x,y: [y-x,y] if type(x)==int else x[:-1]+[-x.pop()+y,y],[0]+l)[:-1]
[2, 2, 2, 3, -2]
python-style - universal_function('delta-encode')
something{БЛОК™™™}
Понятно, какой язык приучает: а) думать, б) думать алгоритмами.
Опыт C++0x показывает, что пусть уж лучше скобочки берут числом, чем разнообразием )
или
Питон и только он.
>>> # Результат выполнения авторского говнокода:
>>> print delta(l)
[2, 2, 2, 3, -2]
>>> # Как оптимально
>>> print [x2-x1 for x1, x2 in zip([0]+l, l+[0])][:-1]
[2, 2, 2, 3, -2]
>>> # Можно ещё так:
>>> from operator import sub
>>> print map(lambda x: -sub(*x), zip([0]+l, l+[0])[:-1])
[2, 2, 2, 3, -2]
>>> # Вот так делать не надо, мне было интересно поломать голову над использованием reduce:
>>> print reduce(lambda x,y: [y-x,y] if type(x)==int else x[:-1]+[-x.pop()+y,y],[0]+l)[:-1]
[2, 2, 2, 3, -2]
Вот оперативно исправленные версии...
print [x-y for x,y in zip(l,[0]+l)]
from operator import sub
print map(lambda x: sub(*x), zip(l,[0]+l))
print reduce(lambda x,y: [y-x,y] if type(x)==int else x[:-1]+[-x.pop()+y,y],[0]+l)[:-1]
O(len(l))
Кто это? (Не отвечайте. Вопрос риторический.)