Iteration utilities
Base.Iterators.Stateful — TypeStateful(itr)Il existe plusieurs façons de penser à cet enveloppeur d'itérateur :
- Il fournit un enveloppeur mutable autour d'un itérateur et de son état d'itération.
- Il transforme une abstraction semblable à un itérateur en une abstraction semblable à un
Channel. - C'est un itérateur qui se muta pour devenir son propre itérateur de reste chaque fois qu'un élément est produit.
Stateful fournit l'interface d'itérateur régulière. Comme d'autres itérateurs mutables (par exemple, Base.Channel), si l'itération est arrêtée prématurément (par exemple, par un break dans une boucle for), l'itération peut être reprise au même endroit en continuant à itérer sur le même objet itérateur (en revanche, un itérateur immuable redémarrerait depuis le début).
Exemples
julia> a = Iterators.Stateful("abcdef");
julia> isempty(a)
false
julia> popfirst!(a)
'a': ASCII/Unicode U+0061 (catégorie Ll : Lettre, minuscule)
julia> collect(Iterators.take(a, 3))
3-element Vector{Char}:
'b': ASCII/Unicode U+0062 (catégorie Ll : Lettre, minuscule)
'c': ASCII/Unicode U+0063 (catégorie Ll : Lettre, minuscule)
'd': ASCII/Unicode U+0064 (catégorie Ll : Lettre, minuscule)
julia> collect(a)
2-element Vector{Char}:
'e': ASCII/Unicode U+0065 (catégorie Ll : Lettre, minuscule)
'f': ASCII/Unicode U+0066 (catégorie Ll : Lettre, minuscule)
julia> Iterators.reset!(a); popfirst!(a)
'a': ASCII/Unicode U+0061 (catégorie Ll : Lettre, minuscule)
julia> Iterators.reset!(a, "hello"); popfirst!(a)
'h': ASCII/Unicode U+0068 (catégorie Ll : Lettre, minuscule)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) # Somme des éléments restants
7Base.Iterators.zip — Functionzip(iters...)Exécute plusieurs itérateurs en même temps, jusqu'à ce que l'un d'eux soit épuisé. Le type de valeur de l'itérateur zip est un tuple de valeurs de ses sous-itérateurs.
zip ordonne les appels à ses sous-itérateurs de telle sorte que les itérateurs avec état ne progresseront pas lorsque un autre itérateur se termine dans l'itération en cours.
zip() sans arguments produit un itérateur infini de tuples vides.
Voir aussi : enumerate, Base.splat.
Exemples
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 — Functionenumerate(iter)Un itérateur qui produit (i, x) où i est un compteur commençant à 1, et x est la i-ème valeur de l'itérateur donné. C'est utile lorsque vous avez besoin non seulement des valeurs x sur lesquelles vous itérez, mais aussi du nombre d'itérations jusqu'à présent.
Notez que i peut ne pas être valide pour indexer iter, ou peut indexer un élément différent. Cela se produira si iter a des indices qui ne commencent pas à 1, et peut se produire pour des chaînes de caractères, des dictionnaires, etc. Consultez la méthode pairs(IndexLinear(), iter) si vous souhaitez vous assurer que i est un index.
Exemples
julia> a = ["a", "b", "c"];
julia> for (index, value) in enumerate(a)
println("$index $value")
end
1 a
2 b
3 c
julia> str = "naïve";
julia> for (i, val) in enumerate(str)
print("i = ", i, ", val = ", val, ", ")
try @show(str[i]) catch e println(e) end
end
i = 1, val = n, str[i] = 'n'
i = 2, val = a, str[i] = 'a'
i = 3, val = ï, str[i] = 'ï'
i = 4, val = v, StringIndexError("naïve", 4)
i = 5, val = e, str[i] = 'v'Base.Iterators.rest — Functionrest(iter, state)Un itérateur qui produit les mêmes éléments que iter, mais en commençant à l'état donné.
Voir aussi : Iterators.drop, Iterators.peel, Base.rest.
Exemples
julia> collect(Iterators.rest([1,2,3,4], 2))
3-element Vector{Int64}:
2
3
4Base.Iterators.countfrom — Functioncountfrom(start=1, step=1)Un itérateur qui compte indéfiniment, en commençant à start et en incrémentant de step.
Exemples
julia> for v in Iterators.countfrom(5, 2)
v > 10 && break
println(v)
end
5
7
9Base.Iterators.take — Functiontake(iter, n)Un itérateur qui génère au maximum les n premiers éléments de iter.
Voir aussi : drop, peel, first, Base.take!.
Exemples
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
5Base.Iterators.takewhile — Functiontakewhile(pred, iter)Un itérateur qui génère des éléments de iter tant que le prédicat pred est vrai, ensuite, il ignore chaque élément.
Cette fonction nécessite au moins Julia 1.4.
Exemples
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
2Base.Iterators.drop — Functiondrop(iter, n)Un itérateur qui génère tous les éléments sauf les premiers n éléments de iter.
Exemples
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
11Base.Iterators.dropwhile — Functiondropwhile(pred, iter)Un itérateur qui supprime les éléments de iter tant que le prédicat pred est vrai, puis retourne chaque élément.
Cette fonction nécessite au moins Julia 1.4.
Exemples
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
5Base.Iterators.cycle — Functioncycle(iter[, n::Int])Un itérateur qui parcourt iter indéfiniment. Si n est spécifié, alors il parcourt iter ce nombre de fois. Lorsque iter est vide, cycle(iter) et cycle(iter, n) le sont aussi.
Iterators.cycle(iter, n) est l'équivalent paresseux de Base.repeat(vector, n), tandis que Iterators.repeated(iter, n) est le Base.fill(item, n) paresseux.
La méthode cycle(iter, n) a été ajoutée dans Julia 1.11.
Exemples
julia> for (i, v) in enumerate(Iterators.cycle("hello"))
print(v)
i > 10 && break
end
hellohelloh
julia> foreach(print, Iterators.cycle(['j', 'u', 'l', 'i', 'a'], 3))
juliajuliajulia
julia> repeat([1,2,3], 4) == collect(Iterators.cycle([1,2,3], 4))
true
julia> fill([1,2,3], 4) == collect(Iterators.repeated([1,2,3], 4))
trueBase.Iterators.repeated — Functionrepeated(x[, n::Int])Un itérateur qui génère la valeur x indéfiniment. Si n est spécifié, génère x ce nombre de fois (équivalent à take(repeated(x), n)).
Voir aussi fill, et comparer Iterators.cycle.
Exemples
julia> a = Iterators.repeated([1 2], 4);
julia> collect(a)
4-element Vector{Matrix{Int64}}:
[1 2]
[1 2]
[1 2]
[1 2]
julia> ans == fill([1 2], 4)
true
julia> Iterators.cycle([1 2], 4) |> collect |> println
[1, 2, 1, 2, 1, 2, 1, 2]Base.Iterators.product — Functionproduct(iters...)Renvoie un itérateur sur le produit de plusieurs itérateurs. Chaque élément généré est un tuple dont l'élément i vient de l'itérateur d'argument i. Le premier itérateur change le plus rapidement.
Voir aussi : zip, Iterators.flatten.
Exemples
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] # collecte un générateur impliquant Iterators.product
trueBase.Iterators.flatten — Functionflatten(iter)Étant donné un itérateur qui produit des itérateurs, renvoie un itérateur qui produit les éléments de ces itérateurs. En d'autres termes, les éléments de l'itérateur d'argument sont concaténés.
Exemples
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'] # collecte des générateurs impliquant Iterators.flatten
6-element Vector{Tuple{Int64, Char}}:
(0, 'a')
(0, 'b')
(0, 'c')
(1, 'a')
(1, 'b')
(1, 'c')Base.Iterators.flatmap — FunctionIterators.flatmap(f, iterators...)Équivalent à flatten(map(f, iterators...)).
Voir aussi Iterators.flatten, Iterators.map.
Cette fonction a été ajoutée dans Julia 1.9.
Exemples
julia> Iterators.flatmap(n -> -n:2:n, 1:3) |> collect
9-element Vector{Int64}:
-1
1
-2
0
2
-3
-1
1
3
julia> stack(n -> -n:2:n, 1:3)
ERROR: DimensionMismatch: stack expects uniform slices, got axes(x) == (1:3,) while first had (1:2,)
[...]
julia> Iterators.flatmap(n -> (-n, 10n), 1:2) |> collect
4-element Vector{Int64}:
-1
10
-2
20
julia> ans == vec(stack(n -> (-n, 10n), 1:2))
trueBase.Iterators.partition — Functionpartition(collection, n)Itérer sur une collection n éléments à la fois.
Exemples
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 — FunctionIterators.map(f, iterators...)Créez un mappage paresseux. C'est une autre syntaxe pour écrire (f(args...) for args in zip(iterators...)).
Cette fonction nécessite au moins Julia 1.6.
Exemples
julia> collect(Iterators.map(x -> x^2, 1:3))
3-element Vector{Int64}:
1
4
9Base.Iterators.filter — FunctionIterators.filter(flt, itr)Étant donné une fonction prédicat flt et un objet itérable itr, renvoie un objet itérable qui, lors de l'itération, produit les éléments x de itr qui satisfont flt(x). L'ordre de l'itérateur original est préservé.
Cette fonction est paresseuse ; c'est-à-dire qu'elle garantit de renvoyer en $Θ(1)$ temps et d'utiliser $Θ(1)$ espace supplémentaire, et flt ne sera pas appelé par une invocation de filter. Des appels à flt seront effectués lors de l'itération sur l'objet itérable retourné. Ces appels ne sont pas mis en cache et des appels répétés seront effectués lors de la réitération.
Des transformations paresseuses ultérieures sur l'itérateur retourné par filter, telles que celles effectuées par Iterators.reverse ou cycle, retarderont également les appels à flt jusqu'à la collecte ou l'itération sur l'objet itérable retourné. Si le prédicat de filtrage est non déterministe ou si ses valeurs de retour dépendent de l'ordre d'itération sur les éléments de itr, la composition avec des transformations paresseuses peut entraîner un comportement surprenant. Si cela est indésirable, assurez-vous que flt est une fonction pure ou collectez des itérateurs filter intermédiaires avant d'autres transformations.
Voir Base.filter pour une implémentation avide du filtrage pour les tableaux.
Exemples
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)] # collecte un générateur sur Iterators.filter
3-element Vector{Int64}:
1
3
5Base.Iterators.accumulate — FunctionIterators.accumulate(f, itr; [init])Étant donné une fonction à 2 arguments f et un itérateur itr, renvoie un nouvel itérateur qui applique successivement f à la valeur précédente et au prochain élément de itr.
C'est effectivement une version paresseuse de Base.accumulate.
L'argument clé init a été ajouté dans Julia 1.5.
Exemples
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.0Base.Iterators.reverse — FunctionIterators.reverse(itr)Étant donné un itérateur itr, alors reverse(itr) est un itérateur sur la même collection mais dans l'ordre inverse. Cet itérateur est "paresseux" en ce sens qu'il ne fait pas de copie de la collection pour l'inverser ; voir Base.reverse pour une implémentation avide.
(Par défaut, cela renvoie un objet Iterators.Reverse enveloppant itr, qui est itérable si les méthodes iterate correspondantes sont définies, mais certains types itr peuvent implémenter des comportements Iterators.reverse plus spécialisés.)
Tous les types d'itérateurs T ne prennent pas en charge l'itération dans l'ordre inverse. Si T ne le fait pas, alors itérer sur Iterators.reverse(itr::T) lancera une MethodError en raison des méthodes iterate manquantes pour Iterators.Reverse{T}. (Pour implémenter ces méthodes, l'itérateur original itr::T peut être obtenu à partir d'un objet r::Iterators.Reverse{T} par r.itr ; plus généralement, on peut utiliser Iterators.reverse(r).)
Exemples
julia> foreach(println, Iterators.reverse(1:5))
5
4
3
2
1Base.Iterators.only — Functiononly(x)Renvoie le seul et unique élément de la collection x, ou lève une ArgumentError si la collection contient zéro ou plusieurs éléments.
Cette méthode nécessite au moins Julia 1.4.
Exemples
julia> only(["a"])
"a"
julia> only("a")
'a': ASCII/Unicode U+0061 (catégorie Ll: Lettre, minuscule)
julia> only(())
ERREUR : ArgumentError: Le tuple contient 0 éléments, doit contenir exactement 1 élément
Traceback :
[...]
julia> only(('a', 'b'))
ERREUR : ArgumentError: Le tuple contient 2 éléments, doit contenir exactement 1 élément
Traceback :
[...]Base.Iterators.peel — Functionpeel(iter)Renvoie le premier élément et un itérateur sur les éléments restants.
Si l'itérateur est vide, renvoie nothing (comme iterate).
Les versions antérieures lancent une BoundsError si l'itérateur est vide.
Voir aussi : Iterators.drop, Iterators.take.
Exemples
julia> (a, rest) = Iterators.peel("abc");
julia> a
'a': ASCII/Unicode U+0061 (catégorie Ll : Lettre, minuscule)
julia> collect(rest)
2-element Vector{Char}:
'b': ASCII/Unicode U+0062 (catégorie Ll : Lettre, minuscule)
'c': ASCII/Unicode U+0063 (catégorie Ll : Lettre, minuscule)