Spec-Zone.ru › Julia 1.6

Утилиты итерации

Base.Iterators.StatefulТип

Stateful(itr)

Существует несколько способов интерпретации этого обёртки итератора:

  1. Она предоставляет изменяемую обёртку вокруг итератора и его состояния итерации.
  2. Она преобразует абстракцию типа итератор в абстракцию типа Channel.
  3. Это итератор, который изменяется, чтобы стать своим собственным остаточным итератором, когда генерируется элемент.

Stateful обеспечивает стандартный интерфейс итератора. Как и другие изменяемые итераторы (например, Channel), если итерация прервана преждевременно (например, с помощью break в цикле for), её можно продолжить с того же места, продолжив итерацию над тем же объектом итератора (в отличие от неизменяемого итератора, который должен начать заново с начала).

Примеры

julia> a = Iterators.Stateful("abcdef");

julia> isempty(a)
false

julia> popfirst!(a)
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)

julia> collect(Iterators.take(a, 3))
3-element Vector{Char}:
 'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
 'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
 'd': ASCII/Unicode U+0064 (category Ll: Letter, lowercase)

julia> collect(a)
2-element Vector{Char}:
 'e': ASCII/Unicode U+0065 (category Ll: Letter, lowercase)
 'f': ASCII/Unicode U+0066 (category Ll: Letter, lowercase)
julia> a = Iterators.Stateful([1,1,1,2,3,4]);

julia> for x in a; x == 1 || break; end

julia> peek(a)
3

julia> sum(a) # Sum the remaining elements
7
исходный код

Base.Iterators.zipФункция

zip(iters...)

Запускает несколько итераторов одновременно, пока любой из них не исчерпается. Тип значения итератора zip — кортеж значений из его под-итераторов.

zip упорядочивает вызовы под-итераторов таким образом, чтобы изменяемые итераторы не продвигались, когда другой итератор завершает текущую итерацию.

Примеры

julia> a = 1:5
1:5

julia> b = ["e","d","b","c","a"]
5-element Vector{String}:
 "e"
 "d"
 "b"
 "c"
 "a"

julia> c = zip(a,b)
zip(1:5, ["e", "d", "b", "c", "a"])

julia> length(c)
5

julia> first(c)
(1, "e")
исходный код

Base.Iterators.enumerateФункция

enumerate(iter)

Итератор, который возвращает (i, x), где i — счётчик, начинающийся с 1, а x — i-й элемент из заданного итератора. Это полезно, когда вам нужен не только сам элемент x над которым вы итерируетесь, но и номер текущей итерации. Обратите внимание, что i может не быть корректным индексом для iter, а также возможно, что x != iter[i], если iter имеет индексы, которые не начинаются с 1. См. метод pairs(IndexLinear(), iter), если вы хотите гарантировать, что i является индексом.

Примеры

julia> a = ["a", "b", "c"];

julia> for (index, value) in enumerate(a)
           println("$index $value")
       end
1 a
2 b
3 c
исходный код

Base.Iterators.restФункция

rest(iter, state)

Итератор, который возвращает те же элементы, что и iter, но начиная с заданного state.

Примеры

julia> collect(Iterators.rest([1,2,3,4], 2))
3-element Vector{Int64}:
 2
 3
 4
исходный код

Base.Iterators.countfromФункция

countfrom(start=1, step=1)

Итератор, который вечно считает, начиная с start и увеличивая на step.

Примеры

julia> for v in Iterators.countfrom(5, 2)
           v > 10 && break
           println(v)
       end
5
7
9
исходный код

Base.Iterators.takeФункция

take(iter, n)

Итератор, который генерирует не более первых n элементов из iter.

Примеры

julia> a = 1:2:11
1:2:11

julia> collect(a)
6-element Vector{Int64}:
  1
  3
  5
  7
  9
 11

julia> collect(Iterators.take(a,3))
3-element Vector{Int64}:
 1
 3
 5
исходный код

Base.Iterators.takewhileФункция

takewhile(pred, iter)

Итератор, который генерирует элементы из iter до тех пор, пока предикат pred является истинным, после чего опускает все оставшиеся элементы.

Для этой функции требуется Julia 1.4 или выше.

Примеры

julia> s = collect(1:5)
5-element Vector{Int64}:
 1
 2
 3
 4
 5

julia> collect(Iterators.takewhile(<(3),s))
2-element Vector{Int64}:
 1
 2
исходный код

Base.Iterators.dropФункция

drop(iter, n)

Итератор, который генерирует все элементы из iter, кроме первых n.

Примеры

julia> a = 1:2:11
1:2:11

julia> collect(a)
6-element Vector{Int64}:
  1
  3
  5
  7
  9
 11

julia> collect(Iterators.drop(a,4))
2-element Vector{Int64}:
  9
 11
исходный код

Base.Iterators.dropwhileФункция

dropwhile(pred, iter)

Итератор, который пропускает элементы из iter до тех пор, пока предикат pred является истинным, после чего возвращает все оставшиеся элементы.

Для этой функции требуется Julia 1.4 или выше.

Примеры

julia> s = collect(1:5)
5-element Vector{Int64}:
 1
 2
 3
 4
 5

julia> collect(Iterators.dropwhile(<(3),s))
3-element Vector{Int64}:
 3
 4
 5
исходный код

Base.Iterators.cycleФункция

cycle(iter)

Итератор, который циклически повторяет iter вечно. Если iter пусто, то и cycle(iter) тоже пусто.

Примеры

julia> for (i, v) in enumerate(Iterators.cycle("hello"))
           print(v)
           i > 10 && break
       end
hellohelloh
исходный код

Base.Iterators.repeatedФункция

repeated(x[, n::Int])

Итератор, который вечно генерирует значение x. Если указано n, генерирует x заданное количество раз (эквивалентно take(repeated(x), n)).

Примеры

julia> a = Iterators.repeated([1 2], 4);

julia> collect(a)
4-element Vector{Matrix{Int64}}:
 [1 2]
 [1 2]
 [1 2]
 [1 2]
исходный код

Base.Iterators.productФункция

product(iters...)

Возвращает итератор по произведению нескольких итераторов. Каждый сгенерированный элемент — кортеж, где i-й элемент берётся из i-го итератора аргумента. Первый итератор изменяется быстрее всего.

Примеры

julia> collect(Iterators.product(1:2, 3:5))
2×3 Matrix{Tuple{Int64, Int64}}:
 (1, 3)  (1, 4)  (1, 5)
 (2, 3)  (2, 4)  (2, 5)
исходный код

Base.Iterators.flattenФункция

flatten(iter)

Принимая итератор, возвращающий итераторы, возвращает итератор, возвращающий элементы этих итераторов. Другими словами, элементы итератора аргумента конкатенируются.

Примеры

julia> collect(Iterators.flatten((1:2, 8:9)))
4-element Vector{Int64}:
 1
 2
 8
 9
исходный код

Base.Iterators.partitionФункция

partition(collection, n)

Итерируется по элементам коллекции n по n элементов за раз.

Примеры

julia> collect(Iterators.partition([1,2,3,4,5], 2))
3-element Vector{SubArray{Int64, 1, Vector{Int64}, Tuple{UnitRange{Int64}}, true}}:
 [1, 2]
 [3, 4]
 [5]
исходный код

Base.Iterators.mapФункция

Iterators.map(f, iterators...)

Создаёт ленивое отображение. Это альтернативный синтаксис для (f(args...) for args in zip(iterators...)).

Для этой функции требуется Julia 1.6 или выше.

Примеры

julia> collect(Iterators.map(x -> x^2, 1:3))
3-element Vector{Int64}:
 1
 4
 9
исходный код

Base.Iterators.filterФункция

Iterators.filter(flt, itr)

Принимая функцию предиката flt и итерируемый объект itr, возвращает итерируемый объект, который при итерации возвращает элементы x из itr, которые удовлетворяют условию flt(x). Порядок исходного итератора сохраняется.

Эта функция является ленивой; то есть, она гарантированно возвращается за время $Θ(1)$ и использует дополнительное пространство $Θ(1)$, и flt не будет вызвана во время вызова filter . Вызовы flt будут выполняться во время итерации над возвращаемым итерируемым объектом. Эти вызовы не кэшируются, и они будут повторно выполняться при повторной итерации.

См. Base.filter для жадного (eager) варианта фильтрации массивов.

Примеры

julia> f = Iterators.filter(isodd, [1, 2, 3, 4, 5])
Base.Iterators.Filter{typeof(isodd), Vector{Int64}}(isodd, [1, 2, 3, 4, 5])

julia> foreach(println, f)
1
3
5
исходный код

Base.Iterators.accumulateФункция

Iterators.accumulate(f, itr; [init])

При заданной функции с 2-мя аргументами f и итераторе itr, возвращается новый итератор, который последовательно применяет f к предыдущему значению и следующему элементу itr.

Это по сути ленивая версия Base.accumulate.

Ключевой аргумент init добавлен в Julia 1.5.

Примеры

julia> f = Iterators.accumulate(+, [1,2,3,4]);

julia> foreach(println, f)
1
3
6
10

julia> f = Iterators.accumulate(+, [1,2,3]; init = 100);

julia> foreach(println, f)
101
103
106
исходный код

Base.Iterators.reverseФункция

Iterators.reverse(itr)

При заданном итераторе itr, reverse(itr) — это итератор над той же коллекцией, но в обратном порядке.

Этот итератор «ленивый», так как он не создаёт копию коллекции для её переворота; см. Base.reverse для жадной реализации.

Не все типы итераторов T поддерживают итерацию в обратном порядке. Если T не поддерживает, то итерация по Iterators.reverse(itr::T) выбросит MethodError из-за отсутствия методов iterate для Iterators.Reverse{T}. (Чтобы реализовать эти методы, исходный итератор itr::T можно получить из r = Iterators.reverse(itr) с помощью r.itr.)

Примеры

julia> foreach(println, Iterators.reverse(1:5))
5
4
3
2
1
исходный код

Base.Iterators.onlyФункция

only(x)

Возвращает единственный элемент коллекции x, и выбрасывает ArgumentError если коллекция содержит ноль или несколько элементов.

См. также: first, last.

Этот метод требует как минимум Julia 1.4.

исходный код

Base.Iterators.peelФункция

peel(iter)

Возвращает первый элемент и итератор по оставшимся элементам.

Примеры

julia> (a, rest) = Iterators.peel("abc");

julia> a
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)

julia> collect(rest)
2-element Vector{Char}:
 'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
 'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
исходный код

© 2009–2021 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.6.0/base/iterators/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API