Удивительное дело в питоне - никакой демократии, сплошная диктатура! ``` for i in range(0,10): print i i=5 ``` Результат выполнения: ``` 0 1 2 3 4 5 6 7 8 9 ``` Т.е. переменную счётчика цикла нельзя менять! Причём никакой ошибки не выдаётся, полное ощущение, что всё работает, но нет. После анархии в перле и C это выглядит дико
2017-07-03 09:35:31

Участники:
@Shura - 15, @oxpa - 13, @kapsh - 4, @Renha - 3, @waterlaz - 1, @33 - 1

@Renha
в смысле? О_О ты же присваиваешь i после того как вывел, и до того как в новой итерации ей присвоится новое значение. Поменяй местами последние строчки и будет тебе 55555555555555555555
#2876274/1 2017-07-03 09:37:08
@Shura
будет, но цикл от этого бесконечным не становится. Т.е. логично, потому что range имеет внутренний счётчик и на каждый цикл его передаёт в i. Т.е. в циле for _нельзя_ поменять счётчик цикла. Т.е. for не числовой, а итерационный. Это немного непривычно.
#2876274/2 → /1 2017-07-03 09:39:36
@kapsh
Потому что здесь нет никакого счётчика цикла. Ты просто идёшь по списку, который вернул range.
#2876274/3 2017-07-03 09:48:49
@Shura
да. for не позволяет делать нумерованные счётчики. Только while, но там это надо делать вручную, и выглядит это костыльно. К этому надо просто привыкнуть
#2876274/4 → /3 2017-07-03 09:54:16
@kapsh
Нет, привыкнуть надо не использовать счётчики. Покажи код, в котором они тебе нужны - возможно, я более питонический способ подсказать смогу.
#2876274/5 → /4 2017-07-03 10:01:21
@Shura
сравнение элементов массива между собой
#2876274/6 → /5 2017-07-03 10:04:25
@oxpa
просто сравнение или с какой-то целью?
#2876274/7 → /6 2017-07-03 10:05:08
@Shura
с какой-то целью. Например если результат сравнения удовлетворяет, то положить элемент в другой массив Сейчас использую трюк с enumerate, который выдаёт индекс элемента, а дальше по-старинке - двумя вложенными циклами i,j
#2876274/8 → /7 2017-07-03 10:06:37
@oxpa
можно делать как >i = a[0] >for j in a[1:]: > if j dosmth(j) > i=j
#2876274/9 → /8 2017-07-03 10:08:12
@oxpa
ещё можно с извращениями. Как-нибудь: > b = [ i for i in a if any([j #2876274/10 → /8 2017-07-03 10:11:55
@Renha
A= [1,2,3] B= [5,4,3] C= [] for a,b in zip(A,B): _if a == b: __C.append(a)
#2876274/11 → /8 2017-07-03 10:12:27
@Shura
тут вообще голову сломаешь. При этом, если правильно понимаю, ломается массив a, потому что всё время слайсится.
#2876274/12 → /9 2017-07-03 10:12:27
@Shura
у тебя A и B разные массивы. По условиям - один
#2876274/13 → /11 2017-07-03 10:12:58
@oxpa
нет, "а" остаётся нетронутым. слайсы не изменяют исходный массив
#2876274/14 → /12 2017-07-03 10:13:16
@Renha
a, миспрочитал
#2876274/15 → /13 2017-07-03 10:13:18
@Shura
Сейчас у меня вот так: ``` while i < len(_lines)-1: l1=_lines[i] flag=0 for j in range(i+1,len(_lines)): do_smth(_lines[j]) i+=1 ``` Как и в любом другом языке. Просто вместо while нормальный, нумерованный цикл for смотрелся бы гармоничнее
#2876274/16 → /14 2017-07-03 10:16:15
@Shura
со слайсами надо попробовать, выглядит лучше моего франкенштейна
#2876274/17 → /9 2017-07-03 10:17:09
@oxpa
у тебя же не используется l1...
#2876274/18 → /16 2017-07-03 10:17:58
@Shura
на самом деле используется, просто покоцал для лучшей читаемости, когда сюда вставлял
#2876274/19 → /18 2017-07-03 10:19:04
@oxpa
давно бы показал как есть, мы бы предложили pythonic way для того же самого
#2876274/20 → /19 2017-07-03 10:19:35
@oxpa
ну или на пасту и в приват куда-нибудь, если светить не хочется
#2876274/21 → /20 2017-07-03 10:20:06
@Shura
там ничего секретного, просто очень большая простыня. Есть массив с линиями. Линии сравниваются между собой и если их концы рядом друг с другом и угол между линиями не большой, то линии объединяются в одну. Поэтому и нужно сравнение элементов одного массива между собой. Да собственно, пост был создан не с просьбой о помощи, а просто как заметка о питоне
#2876274/22 → /21 2017-07-03 10:24:33
@Shura
вот такое красиво, я бы применил, если бы функция сравнения элементов влезала в одну строчку
#2876274/23 → /10 2017-07-03 10:25:12
@oxpa
да можно обернуть всё в функцию и подсунуть, почему нет...
#2876274/24 → /23 2017-07-03 10:25:39
@oxpa
и ещё я не уверен, что получится вытащить переменную из второго comprehension. Но тогда можно j вытащить куда-нибудь выше
#2876274/25 → /23 2017-07-03 10:27:41
@Shura
Не выходит со слайсами. ``` a=range(10,20) for i in a: print "i=",i for j in a[1:]: #if j#2876274/26 → /17 2017-07-03 10:43:11
@oxpa
>from itertools import product >a=range(10,20) >for i in itertools.product(a, repeat=2): > print i; В i оказывается тапл, который можно передать куда-нибудь как два аргумента.
#2876274/27 → /26 2017-07-03 10:51:57
@oxpa
тьфу ты! я там перепутал и с модулем вызываю itertools.product, но понятно, наверно Ещё есть permutations, cominations и всякое такое. https://docs.python.org/2/library/itertools.html сами itertools у тебя наверняка есть (только если не совсем старьё)
#2876274/28 → /27 2017-07-03 10:53:16
@Shura
хе-хе > Traceback (most recent call last): > File "test.py", line 10, in > for i in itertools.product(a, repeat=2): > NameError: name 'itertools' is not defined
#2876274/29 → /28 2017-07-03 10:54:40
@oxpa
это я коряво импорт написал, ну =)
#2876274/30 → /29 2017-07-03 10:55:55
@Shura
справился, сейчас поковыряю. Спасибо
#2876274/31 → /30 2017-07-03 10:56:28
@kapsh
In [15]: arr1 = [1, 0, 3, 4, 0] In [16]: arr2 = [1, 0, 0, 4, 0] In [17]: [a for a, b in zip(arr1, arr2) if a == b] Out[17]: [1, 0, 4, 0] Это если я правильно понял твою задачу. Все каменты лень читать.
#2876274/32 → /8 2017-07-03 10:57:02
@kapsh
Прочитал, похоже что не понял.
#2876274/33 → /32 2017-07-03 10:58:54
@Shura
вот как раз мой случай > for i in itertools.combinations(a,2): Спасибо, избавлюсь от индексов, while и ручного инкремента счётчика :)
#2876274/34 → /30 2017-07-03 11:01:34
@oxpa
в jabber'е есть прекрасный python@c.j.r. Я там не сижу, но там всегда подскажут даже сложные штуки
#2876274/35 → /34 2017-07-03 11:37:56
@waterlaz
Я бы срал кирпичами, если бы этот код вел себя так, как ты хочешь.
#2876274/36 2017-07-03 12:11:34
@33
Это потому что for-in — это не цикл со счётчиком, это обход итератора. Причем там ещё такая магия, что по сути неявно получается итератор от переданного объекта, то есть по факту реальный код твоего цикла будет выглядеть следующим образом: iterator = iter(range(10)) while True: ____try: ________print iterator.next() # в Python 3 будет "next(iterator)" ____except StopIteration: ________break
#2876274/37 2017-07-03 12:13:46