Spec-Zone.ru › Julia 1.5

Утилиты итерации

Base.Iterators.StatefulТип

Stateful(itr)

Существует несколько способов интерпретации этого обёртки итератора:

  1. Он предоставляет изменяемую обёртку вокруг итератора и его состояния итерации.
  2. Он преобразует абстракцию типа «итератор» в абстракцию типа «Channel».
  3. Это итератор, который изменяется, становясь собственным итератором остатка, когда элемент произведён.

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 если коллекция содержит ноль или несколько элементов.

См. также: first, last.

Этот метод требует по крайней мере 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API