Утилиты итерации
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...)
Для набора итерируемых объектов возвращает итерируемый набор кортежей, где i-й кортеж содержит i-ю компоненту каждого входного итерируемого объекта.
Примеры
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.Zip2{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. Обратитесь к методу enumerate(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 для жадной реализации фильтрации для массивов.
Примеры
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 для жадной реализации.
Не все типы итераторов 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.0.4/base/iterators/