Spec-Zone.ru › Julia 1.7

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

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 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> Iterators.reset!(a); popfirst!(a)
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)

julia> Iterators.reset!(a, "hello"); popfirst!(a)
'h': ASCII/Unicode U+0068 (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 упорядочивает вызовы под-итераторов таким образом, что изменяемые итераторы не будут продвигаться, когда другой итератор завершится в текущей итерации.

См. также: enumerate, splat.

Примеры

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.

См. также: Iterators.drop, Iterators.peel, Base.rest.

Примеры

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.

См. также: drop, peel, first, take!.

Примеры

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) пусто.

См. также: Iterators.repeated, repeat.

Примеры

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

См. также: Iterators.cycle, repeat.

Примеры

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-го аргументного итератора. Первый итератор меняется быстрее всего.

См. также: zip, Iterators.flatten.

Примеры

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)

julia> ans == [(x,y) for x in 1:2, y in 3:5]  # collects a generator involving Iterators.product
true
исходный код

Base.Iterators.flattenФункция

flatten(iter)

Дано итератор, который возвращает итераторы, возвращает итератор, который возвращает элементы этих итераторов. Другими словами, элементы аргументного итератора конкатенируются.

Примеры

julia> collect(Iterators.flatten((1:2, 8:9)))
4-element Vector{Int64}:
 1
 2
 8
 9

julia> [(x,y) for x in 0:1 for y in 'a':'c']  # collects generators involving Iterators.flatten
6-element Vector{Tuple{Int64, Char}}:
 (0, 'a')
 (0, 'b')
 (0, 'c')
 (1, 'a')
 (1, 'b')
 (1, 'c')
исходный код

Base.Iterators.partitionФункция

partition(collection, 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 для жадной реализации фильтрации для массивов.

Примеры

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

julia> [x for x in [1, 2, 3, 4, 5] if isodd(x)]  # collects a generator over Iterators.filter
3-element Vector{Int64}:
 1
 3
 5
исходный код

Base.Iterators.accumulateФункция

Iterators.accumulate(f, itr; [init])

Принимая функцию от двух аргументов 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)

Возвращает первый элемент и итератор по оставшимся элементам.

Если итератор пуст, возвращает nothing (как и iterate).

Предыдущие версии генерировали исключение BoundsError, если итератор был пустым.

См. также: Iterators.drop, Iterators.take.

Примеры

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.7.0/base/iterators/

Spec-Zone.ru

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