Утилиты итерации
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> 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.
Примеры
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.
Примеры
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) тоже пусто.
Примеры
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 Vector{Matrix{Int64}}:
[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 Matrix{Tuple{Int64, Int64}}:
(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 Vector{Int64}:
1
2
8
9
исходный код
Base.Iterators.partitionФункция
partition(collection, n)
Итерируется по элементам коллекции 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 для жадного (eager) варианта фильтрации массивов.
Примеры
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
исходный код
Base.Iterators.accumulateФункция
Iterators.accumulate(f, itr; [init])
При заданной функции с 2-мя аргументами 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)
Возвращает первый элемент и итератор по оставшимся элементам.
Примеры
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.6.0/base/iterators/