Size: a a a

Язык программирования Julia / Julia programming language

2021 March 25

ЕП

Евгений Погребняк... in Язык программирования Julia / Julia programming language
Kirill Tsaregorodtsev
Кстати есть такая обёртка сейчас - - функция nth(..) в Iterators или типа того
Там же islice, с элемента n1 до n2
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Ian Pilé
эммм, любой генератор является итератором же
Имеется в виду, что генератор это очень специальный случай итератора (по крайней мере в Джулии). В отличие от обычного итератора, у которого изменение состояния и вычисление нового элемента происходит вместе, у генератора эти две сущности разнесены.

То есть всякий генератор является итератором, но не всякий итератор является генератором.
источник

IP

Ian Pilé in Язык программирования Julia / Julia programming language
да, это я понимаю)
источник

ЕП

Евгений Погребняк... in Язык программирования Julia / Julia programming language
Ian Pilé
да, это я понимаю)
А я вот чувствую подвох, но до конца не понимаю )
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Kirill Tsaregorodtsev
Кстати есть такая обёртка сейчас - - функция nth(..) в Iterators или типа того
Нет, эта обёртка делает другое. Как я чуть выше сказал, не всякий итератор это генератор. Функция nth как раз шагает до n  индекса, просто итерируя состояния. То есть в случае генератора она будет вычислять все промежуточные значения используемой функции, чего как раз не хочется.
источник

ЕП

Евгений Погребняк... in Язык программирования Julia / Julia programming language
У меня вопрос ) а как можео получить n-ое состояние не вычисляя предыдущие? В чем магия?
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Евгений Погребняк
А я вот чувствую подвох, но до конца не понимаю )
Ну я же выше написал.

sqr(x) = x*x
G = (sqr(i) for i in 1:10)


Если к G применить collect, то получится [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Магия, в том, что генератор по сути делает две вещи
1. итерирует состояние (то есть переключается 1, 2, 3, 4, 5 и т.п.)
2. Применяет функцию (в данном случае sqr) к новому состоянию и возвращает её результат.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Но мы можем второй шаг просто пропускать при итерации.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
То есть getindex(G, n) будет выглядеть как-то так
function getindex(G, n)
  v, state = IterTools.nth(G.state0, n)
  G.f(v)
end
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Это отличается от обычного поведения iterate, которое выглядит как-то так
function iterate(G, state = G.state0)
  v, state = iterate(state)
  return (G.f(v), state)
end
источник

ЕП

Евгений Погребняк... in Язык программирования Julia / Julia programming language
Тут стейты индекса и стейт самого G - разные, верно?
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Не думаю.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Если ты итерируешься по [10, 20, 30] то твой стейт - это текущий индекс (от 1 до 3), а вот возвращаемое значение - это результат применения [10, 20, 30] к индексу.

Если ты используешь генератор поверх массива, то твой стейт - это всё ещё текущий индекс (от 1 до 3), а возвращаемое значение - это результат применения некоторой функции f к результату вычисления [10, 20, 30] от текущего индекса.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Поправил примеры
источник

ЕП

Евгений Погребняк... in Язык программирования Julia / Julia programming language
Андрей Оськин
Если ты итерируешься по [10, 20, 30] то твой стейт - это текущий индекс (от 1 до 3), а вот возвращаемое значение - это результат применения [10, 20, 30] к индексу.

Если ты используешь генератор поверх массива, то твой стейт - это всё ещё текущий индекс (от 1 до 3), а возвращаемое значение - это результат применения некоторой функции f к результату вычисления [10, 20, 30] от текущего индекса.
А в случае если генератер это какая-то функция от своих же предыдущих значений (фиббоначи приводили пример) - то это приводили пример, то разделение индекса и результата вычисления нам чем-то помогает?
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Числа Фиббоначи - это не генератор
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Это просто итератор.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Не всякий итератор является генератором.
источник

ЕП

Евгений Погребняк... in Язык программирования Julia / Julia programming language
Спасибо!
источник