Итерационные утилиты
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 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> Iterators.reset!(a); popfirst!(a)
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
julia> Iterators.reset!(a, "hello"); popfirst!(a)
'h': ASCII/Unicode U+0068 (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.
См. также: Iterators.drop, Iterators.peel, Base.rest.
Примеры
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.
См. также: drop, peel, first, take!.
Примеры
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) пусто.
См. также: Iterators.repeated, repeat.
Примеры
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)).
См. также: Iterators.cycle, repeat.
Примеры
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-го аргументного итератора. Первый итератор меняется быстрее всего.
См. также: zip, Iterators.flatten.
Примеры
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)
julia> ans == [(x,y) for x in 1:2, y in 3:5] # collects a generator involving Iterators.product
true
исходный код
Base.Iterators.flattenФункция
flatten(iter)
Дано итератор, который возвращает итераторы, возвращает итератор, который возвращает элементы этих итераторов. Другими словами, элементы аргументного итератора конкатенируются.
Примеры
julia> collect(Iterators.flatten((1:2, 8:9)))
4-element Vector{Int64}:
1
2
8
9
julia> [(x,y) for x in 0:1 for y in 'a':'c'] # collects generators involving Iterators.flatten
6-element Vector{Tuple{Int64, Char}}:
(0, 'a')
(0, 'b')
(0, 'c')
(1, 'a')
(1, 'b')
(1, 'c')
исходный код
Base.Iterators.partitionФункция
partition(collection, 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 для жадной реализации фильтрации для массивов.
Примеры
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
julia> [x for x in [1, 2, 3, 4, 5] if isodd(x)] # collects a generator over Iterators.filter
3-element Vector{Int64}:
1
3
5
исходный код
Base.Iterators.accumulateФункция
Iterators.accumulate(f, itr; [init])
Принимая функцию от двух аргументов 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, если коллекция содержит ноль или несколько элементов.
Этот метод требует как минимум Julia 1.4.
Base.Iterators.peelФункция
peel(iter)
Возвращает первый элемент и итератор по оставшимся элементам.
Если итератор пуст, возвращает nothing (как и iterate).
Предыдущие версии генерировали исключение BoundsError, если итератор был пустым.
См. также: Iterators.drop, Iterators.take.
Примеры
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.7.0/base/iterators/