Spec-Zone.ru › Julia 1.4

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

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 Array{Char,1}:
 'b'
 'c'
 'd'

julia> collect(a)
2-element Array{Char,1}:
 'e'
 'f'
julia> a = Iterators.Stateful([1,1,1,2,3,4]);

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

julia> Base.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 Array{String,1}:
 "e"
 "d"
 "b"
 "c"
 "a"

julia> c = zip(a,b)
Base.Iterators.Zip{Tuple{UnitRange{Int64},Array{String,1}}}((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 Array{Int64,1}:
 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 Array{Int64,1}:
  1
  3
  5
  7
  9
 11

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

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

drop(iter, n)

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

Примеры

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

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

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

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 Array{Array{Int64,2},1}:
 [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 Array{Tuple{Int64,Int64},2}:
 (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 Array{Int64,1}:
 1
 2
 8
 9
исходный код

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

partition(collection, n)

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

Примеры

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

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

Iterators.filter(flt, itr)

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

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

См. Base.filter для неленивой реализации фильтрации для массивов.

Примеры

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

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

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

Iterators.accumulate(f, itr)

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

Это фактически ленивая версия Base.accumulate.

Примеры

julia> f = Iterators.accumulate(+, [1,2,3,4])
Base.Iterators.Accumulate{typeof(+),Array{Int64,1}}(+, [1, 2, 3, 4])

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

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 Array{Char,1}:
 'b'
 'c'
исходный код

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

Spec-Zone.ru

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