Утилиты итерации
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{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, если коллекция содержит ноль или несколько элементов.
Этот метод требует по крайней мере 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/