Форум сайта python.su
0
На одном форуме один чувак утверждает, что это быдлокод:
for i in range(len(lst)): do_something(lst[i])
Офлайн
103
maxim83632ДА!
На одном форуме один чувак утверждает, что это быдлокод:
for i in lst: do_something(i)
map(do_something, lst)
Отредактировано terabayt (Май 24, 2015 01:59:33)
Офлайн
39
maxim83632
Если Вам не нужны индексы (точнее нужны просто, чтобы получить элемент) и Вы не собираетесь их анализировать и с ними напрямую работать, то да. Этот код не есть гуд 
Отредактировано 4kpt_III (Май 24, 2015 02:03:07)
Офлайн
0
А если нужно изменять список?
Он объясняет, что это быдло код так:
Неприемлима потому что сама операция доступа по индексу очень дорогая. И чем больше индекс тем дороже операция и, следовательно, вся совокупность операций, то есть весь цикл for. Если бы мы оперировали массивом, то сложность этого цикла составляла бы O(n), но т.к. у нас список - сложность этого цикла равна O((1 + n) / 2 * n). Конечно, по правилам ТА мы можем просто убрать константы (мое имхо, так делать нельзя) и тогда получим O(n^2).
Отредактировано maxim83632 (Май 24, 2015 02:44:51)
Офлайн
39
Ну на самом деле в Вашем коде Вы не меняете список. Вы меняете его элемент
А если по-вопросу, то зависит от структуры “изменений”. Иногда это бывает удобно запихнуть в map или сделать генератором списков. Все зависит от задачи.
P.S. Не очень хорошей практикой считается изменение количества элементов списка в процессе работы с ним в цикле for. Хотя есть и исключения…
Отредактировано 4kpt_III (Май 24, 2015 02:44:28)
Офлайн
221
maxim83632
Для иллюстрации всего вышесказанного посмотрите на этот пример (только пример!):
>>> l = range(5) >>> l [0, 1, 2, 3, 4] >>> for i in l[::-1]: ... del i ... >>> l [0, 1, 2, 3, 4] >>> >>> for i in range(len(l))[::-1]: ... del l[i] ... >>> l []
Офлайн
0
Я дополнил предыдущий пост. Посмотрите пожалуйста. Меня интересует этот вопрос в ключе того, код работает быстро или медленно.
Офлайн
103
maxim83632
код работает быстро или медленно
>>> print timeit.timeit(""" ... lst = [i for i in range (10)] ... def do_something(a): ... a += 1 ... return a ... for i in range(len(lst)): ... do_something(lst[i]) ... """) 3.26911783218 >>> print timeit.timeit(""" ... lst = [i for i in range (10)] ... def do_something(a): ... a += 1 ... return a ... for i in lst: ... do_something(i) ... """) 2.92600512505 >>> print timeit.timeit(""" ... lst = [i for i in range (10)] ... def do_something(a): ... a += 1 ... return a ... map(do_something, lst) ... """) 3.20691108704
Отредактировано terabayt (Май 24, 2015 03:25:51)
Офлайн
857
maxim83632Доступ по индексу выполняется за O(1) - это просто берётся указатель на начало и к нему прибавляется смещение.
Он объясняет, что это быдло код так:Неприемлима потому что сама операция доступа по индексу очень дорогая. И чем больше индекс тем дороже операция
Офлайн
0
Всем спасибо за ответы и разъяснения 
Офлайн