Spec-Zone.ru › Julia 1.2

Итерационные утилиты

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...)

Запускает несколько итераторов одновременно до тех пор, пока любой из них не исчерпается. Тип значения итератора 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)
Base.Iterators.Zip{Tuple{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. Обратитесь к методу 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.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.2.0/base/iterators/

Spec-Zone.ru

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