Spec-Zone.ru › Julia 1.0

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

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'
 '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/

Spec-Zone.ru

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