
Dmitry
18.12.2016
15:53:17
А ялд получается во всех функциях того же вайба происходит не явно при их выполнении?
Т.е. request("http://") ...

qwe
18.12.2016
15:53:42
Этого я не знаю)

Dmitry
18.12.2016
15:54:05
Просто не совсем понятно тогда где его нужно делать если самостоятельно что-то пишешь

Google

Dmitry
18.12.2016
15:54:17
с потоком то ясно — запустил его и он считается пока результат не вернет
а тут...

qwe
18.12.2016
15:56:13
Так я не понял, что непонятно. Для чего эти фибер с ялдами?

Dmitry
18.12.2016
16:02:44
ялд прерывает выполнение фибера чтобы выполнился другой фибер
верно же?
Вот. Вопрос в том, в каких случаях нужно этот ялд вызывать?

qwe
18.12.2016
16:04:27
как другой?

Dmitry
18.12.2016
16:04:55
ну фибер это же как легковесная задача
т.е. одна сделала что-то и на другую все перещелкнулось

qwe
18.12.2016
16:05:26
короче
эта штука работает эквивалентно генераторам из Python. Какими бы терминами ее не поливали. Может быть ее можно использовать еще как-то, но как минимум ее можно использовать как генераторы из Python. Если непонятно для чего использовать генераторы в Python, то я могу объяснить.

Dmitry
18.12.2016
16:08:14
Лучше тогда объясни т.к. я могу их не совсем верно представляьт


qwe
18.12.2016
16:17:35
Генераторы в Python используются для сжатия вложенных циклов. Например если ты перебираешь список списков, но работаешь только с элементами вложенных списков, то при помощи генератора ты можешь перебирать 2 цикла и ялдить только элементы. А если у тебя еще есть условие по которому происходит continue (то есть пропускается итерация), то генераторы это то, что надо.
Другой пример: у тебя есть массив, который надо перебрать в методе, но только перебрать, ничего другого с массивом в этом методе не должно происходить, и ты передаешь в метод не массив, а генератор при помощи которого перебираешь массив.
Еще пример: есть массив, который ты перебираешь в разных методах, ты его раньше перебирал через for(i=0; i<len(myarr); ++i), а тут пришлось тебе начать хранить элементы не в массиве, а в ассоциативном массиве, да еще и ключи строковые. И если везде раньше ты передавал массив, то тебе придется везде менять свой for на foreach, да еще и метод наверняка придется вызывать для получения значений ассоциативного массива, а если ты передавал генераторы, то ты просто меняешь генератор

Google

qwe
18.12.2016
16:17:43
@DmitryBubnenkov

Dmitry
18.12.2016
16:19:12
генератор не прекращая обход возвращает обратно только нужные значения?

qwe
18.12.2016
16:19:58
а это как запрограммуешь


Мерлин
18.12.2016
16:19:59
Генераторы в Python используются для сжатия вложенных циклов. Например если ты перебираешь список списков, но работаешь только с элементами вложенных списков, то при помощи генератора ты можешь перебирать 2 цикла и ялдить только элементы. А если у тебя еще есть условие по которому происходит continue (то есть пропускается итерация), то генераторы это то, что надо.
Другой пример: у тебя есть массив, который надо перебрать в методе, но только перебрать, ничего другого с массивом в этом методе не должно происходить, и ты передаешь в метод не массив, а генератор при помощи которого перебираешь массив.
Еще пример: есть массив, который ты перебираешь в разных методах, ты его раньше перебирал через for(i=0; i<len(myarr); ++i), а тут пришлось тебе начать хранить элементы не в массиве, а в ассоциативном массиве, да еще и ключи строковые. И если везде раньше ты передавал массив, то тебе придется везде менять свой for на foreach, да еще и метод наверняка придется вызывать для получения значений ассоциативного массива, а если ты передавал генераторы, то ты просто меняешь генератор
Ещё ленивые коллекции
бесконечные списки


Dmitry
18.12.2016
16:20:39
Мерлин, спасибо, но это сейчас только запутает

qwe
18.12.2016
16:21:00
@twentydraft тоже хорошие примеры, на практике редко было, просто

Мерлин
18.12.2016
16:21:24

qwe
18.12.2016
16:22:10
?
@DmitryBubnenkov не молчите, давно уже паришься с этими фиберами, а идея проста
что-то еще непонятно ?

Dmitry
18.12.2016
16:24:11
перечитываю это все по 5 раз)
Я просто не совсем понимаю что мне мешает просто перебирать циклом без ялда, какие минусы будут?
Ялд как понимаю позволяет избежать генерации всего массива

qwe
18.12.2016
16:25:36
хорошо
сейчас покажу

Мерлин
18.12.2016
16:28:14

qwe
18.12.2016
16:29:14
http://vpaste.net/x2OjY вот пример со сжатием
удобно?
@DmitryBubnenkov фильтрация и агрегация происходит в коде твоей библиотеки, а использование уже через предоставляемый генератор в клиентском коде

Google

Dmitry
18.12.2016
16:30:57
м.... а return тут бы получается не сработал, верно?

qwe
18.12.2016
16:31:01
да даже не библиотеки, а просто какого-то модуля

Мерлин
18.12.2016
16:31:30
А потом можно протаскивать данные через цепочки генераторов
Очень приятно

qwe
18.12.2016
16:32:12
@DmitryBubnenkov сработал, но тогда бы тебе пришлось бы сделать копию массива. А что если в нем 10^9 элементов?
копию агрегированного фильтрованого массива

Мерлин
18.12.2016
16:33:11
А ещё можно работать асинхронно
Eventloop, вот это всё
Всё это растёт из yield

qwe
18.12.2016
16:34:13
@twentydraft тоже верно, но предлагаю пока показать пример с фильрацией, чтоб когнитивного диссонанса не было)
@DmitryBubnenkov там 10 строк, скажи какая не ясна

Dmitry
18.12.2016
16:39:33
я не совсем про копию массива понял... почему ее пришлось бы делать...

qwe
18.12.2016
16:40:09
а как бы ты вернул агрегированный массив отфильтрованных элементов?

Dmitry
18.12.2016
16:42:20
а фильтрация это if is_bad(element): ?

qwe
18.12.2016
16:42:32
да и continue после этого

Мерлин
18.12.2016
16:42:36
ну вот скажем нужно нам получить произвольное количество чисел, квадрат + 1 которых чётный
def source(n):
for i in range(n):
x = (i*i + 1)%2
if x == 0:
yield(i)
for r in source(10):
print(r)
А если заранее городить список, то он забьёт всю оперативку

qwe
18.12.2016
16:44:42
@twentydraft погодите, сейчас @DmitryBubnenkov поймет

Dmitry
18.12.2016
16:45:51
Вот честно я гуманитарий. Реально очень тяжело в голову ложится. Я примерно понял идею, но не уверен, что смогу ее использовать самостоятельно

Google

Мерлин
18.12.2016
16:46:26
Говорю же, попробуйте сам написать что-то
Облизать со всех сторон

qwe
18.12.2016
16:47:23
@DmitryBubnenkov вы понимаете, что делают циклы в my_gen?

Dmitry
18.12.2016
16:47:55
поочередно печатают возвращаемые элементы
my_gen получается и есть генератор
в примере наверно вложенный массив усложняет понимание
по идее же можно было без него?

qwe
18.12.2016
16:49:47
@DmitryBubnenkov циклы в my_gen берут массив массивов, пробегаются по этим массивам, пробегаются по элементам, смотрят плохой ли этот элемент и если нет, то возвращают его.

Dmitry
18.12.2016
16:50:30
но без вложенного же так же бы работало?

Admin
ERROR: S client not available

Dmitry
18.12.2016
16:50:34
Если так, то я понял идею

qwe
18.12.2016
16:51:03
без вложенного смысле меньше, но сейчас сделаю

Dmitry
18.12.2016
16:52:05
А в vibed получается все функции работают как генераторы?

qwe
18.12.2016
16:52:30
@DmitryBubnenkov я не работал с vibed

Dmitry
18.12.2016
16:52:38
Я просто не могу понять как отличить блокируюшую функцию от неблокирующей

qwe
18.12.2016
16:52:45
http://vpaste.net/lOP8G тут нет агрегации, только фильтрация

Dmitry
18.12.2016
16:54:34
генератор тут будет просто возвращать по одному элементу, так ведь? Просто механизм return какой? Я понял, что "он создаст копию", но не понимаю почему именно это произойдет. Типа итерация остановится или как?

qwe
18.12.2016
16:55:02
return не создаст копию
так

Google

qwe
18.12.2016
16:56:16
у вас задача вывести на экран четные числа в массиве [0,1,2,3,4,5,6], напишите быстро код

Dmitry
18.12.2016
16:56:36
сейчас

qwe
18.12.2016
16:57:02
только не в чат код пожалуйста
на pastebin или куда-нибудь еще

Dmitry
18.12.2016
16:58:16
foreach (a; arr)
if(a%2==0)
{
writeln(a);
}
ой
щас на пастбин отправлю

qwe
18.12.2016
16:58:47
заодно вынесите это в метод
и чтоб он не выводил, а в возвращал
и его использование, разумеется

Dmitry
18.12.2016
16:59:27
http://vpaste.net/9E3Tu
блин, ошибка со скобками
http://vpaste.net/Hrkce
Вот

qwe
18.12.2016
17:00:22
и чтоб он не выводил, а в возвращал

Dmitry
18.12.2016
17:01:35
http://vpaste.net/LfqJq

qwe
18.12.2016
17:02:14
метод вернет только 1 число

Dmitry
18.12.2016
17:02:36
да, точно, сейчас момент подумаю...
Мне упорно хочется написать что-то типа:
http://vpaste.net/VtdH9
но оно не компилируется даже

qwe
18.12.2016
17:08:43
Вы ж return хотели делать

Dmitry
18.12.2016
17:09:28
дык он получается прирвет выполнение и вернет только одно число

qwe
18.12.2016
17:10:09
это если его в цикле поставить
yield a так в Python Только можно