Утилиты итерации
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': 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 Array{Char,1}:
'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 Array{String,1}:
"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 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.takewhileФункция
takewhile(pred, iter)
Итератор, который генерирует элементы из iter до тех пор, пока предикат pred истинен, после чего отбрасывает каждый элемент.
Для этой функции требуется Julia 1.4 или выше.
Примеры
julia> s = collect(1:5)
5-element Array{Int64,1}:
1
2
3
4
5
julia> collect(Iterators.takewhile(<(3),s))
2-element Array{Int64,1}:
1
2
исходный код
Base.Iterators.dropФункция
drop(iter, n)
Итератор, который генерирует все элементы iter за исключением первых n.
Примеры
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.dropwhileФункция
dropwhile(pred, iter)
Итератор, который отбрасывает элементы из iter до тех пор, пока предикат pred истинен, после чего возвращает каждый элемент.
Для этой функции требуется Julia 1.4 или выше.
Примеры
julia> s = collect(1:5)
5-element Array{Int64,1}:
1
2
3
4
5
julia> collect(Iterators.dropwhile(<(3),s))
3-element Array{Int64,1}:
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 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 по 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; [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 Array{Char,1}:
'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
исходный код
© 2009–2020 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.5.3/base/iterators/