Утилиты итерации
Base.Iterators.StatefulТип
Stateful(itr)
Существует несколько способов интерпретации этого обёртки итератора:
- Она предоставляет изменяемую обёртку вокруг итератора и его состояния итерации.
- Она превращает абстракцию типа итератор в абстракцию типа
Channel. - Это итератор, который изменяется, чтобы стать собственным итератором остатка всякий раз, когда генерируется элемент.
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{Array{Int64,1},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 для жадного (eager) варианта фильтрации для массивов.
Примеры
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.reverseФункция
Iterators.reverse(itr)
Принимая итератор itr, тогда reverse(itr) — это итератор над той же коллекцией, но в обратном порядке.
Этот итератор «ленивый», поскольку он не создаёт копию коллекции для её обратного упорядочивания; см. Base.reverse для жадного (eager) варианта.
Не все типы итераторов 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исходный код
© 2009–2019 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.1.1/base/iterators/