Spec-Zone.ru › Julia 1.8

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

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)

Итератор, который генерирует все, кроме первых n элементов из iter.

Примеры

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]
элементов за раз.

Примеры

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

При заданной функции с 2 аргументами f и итераторе itr, вернуть новый итератор, который последовательно применяет f к предыдущему значению и следующему элементу из itr.

Это фактически ленивая версия Base.accumulate.

Ключевой аргумент init добавлен в Julia 1.5.

Примеры

julia> a = Iterators.accumulate(+, [1,2,3,4]);

julia> foreach(println, a)
1
3
6
10

julia> b = Iterators.accumulate(/, (2, 5, 2, 5); init = 100);

julia> collect(b)
4-element Vector{Float64}:
 50.0
 10.0
  5.0
  1.0
исходный код

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.

Примеры

julia> only(["a"])
"a"

julia> only("a")
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)

julia> only(())
ERROR: ArgumentError: Tuple contains 0 elements, must contain exactly 1 element
Stacktrace:
[...]

julia> only(('a', 'b'))
ERROR: ArgumentError: Tuple contains 2 elements, must contain exactly 1 element
Stacktrace:
[...]
исходный код

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–2022 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.8/base/iterators/

Spec-Zone.ru

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