Parcours
/
Julia
Julia
/
Programme
/
Intervalles
In

Intervalles en Julia

1 exercice

À propos de Intervalles

Suppose que tu veuilles tous les entiers positifs ou nuls jusqu'à 1000. Il serait ridicule de devoir les taper un par un dans un tableau.

Pour cela, on dispose du type range :

julia> 0:1000
0:1000

julia> typeof(0:1000)
UnitRange{Int64}

Les ranges sont très courants : non seulement pour t'éviter de tout taper, mais aussi comme valeurs de retour de fonctions.

Note que les ranges ne sont pas des tableaux.

Les tableaux sont définis dès le départ (évaluation « gloutonne »), et leur stockage est proportionnel à leur longueur.

En revanche, les ranges ne sont qu'un ensemble d'instructions servant à générer une séquence (évaluation « paresseuse », ou « itérateur »).

Si tu as besoin d'un range sous forme de tableau, utilise la fonction collect() pour le convertir :

julia> collect(0:5)
6-element Vector{Int64}:
 0
 1
 2
 3
 4
 5

Tu peux aussi utiliser collect(type, range) pour préciser le type du tableau obtenu.

On peut préciser le pas, ici 0,3 :

julia>  collect(1.0:0.3:2.0)
4-element Vector{Float64}:
 1.0
 1.3
 1.6
 1.9

La syntaxe est donc start:stepsize:stop. Les deux bornes sont incluses, comme le montre l'exemple avec les entiers. Si le pas ne divise pas exactement stop - start, le dernier élément ne dépassera pas stop.

Pour un contrôle plus fin, utilise la fonction Base.range(), qui offre plusieurs options supplémentaires.

Les ranges de lettres

On peut aussi utiliser des séquences non numériques dans les ranges. L'exemple le plus simple est celui des lettres ASCII :

julia> 'a':'d'
'a':1:'d'

julia> typeof('a':'d')
StepRange{Char, Int64}

julia> collect('a':'d')
4-element Vector{Char}:
 'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
 '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)

Le type Char sera abordé plus en détail dans un autre concept. Pour l'instant, considère ces valeurs comme de simples caractères entre apostrophes.

Les fonctions et opérateurs pour les ranges

Vérifie les bornes d'un range avec first() et last().

Il est souvent utile de savoir si une valeur particulière fait partie d'un range. La fonction sous-jacente est in(), mais on utilise plus couramment l'opérateur infixe in ou son synonyme plus mathématique ∈. Dans un éditeur adapté, le raccourci pour ∈ s'obtient en tapant \in puis la touche tabulation.

 r = 1:10  # => 1:10
 first(r)  # => 1
 last(r)   # => 10
 7 in r    # => true
 11 ∈ r    # => false

L'opérateur in ou ∈ est utilisé ici avec des ranges, mais il peut aussi servir avec plusieurs autres types de collections, comme les vecteurs, les ensembles et les dictionnaires.

Plus d'informations sur l'indexation des tableaux

Les ranges d'entiers et les tableaux peuvent être utilisés pour indexer un tableau :

nums = collect(10.0:50.0)
nums[3:2:7]  # gives [12.0, 14.0, 16.0]
nums[ [3, 5, 7] ] # also gives [12.0, 14.0, 16.0]

L'utilisation avec end fonctionne aussi, même si la priorité des opérateurs peut rendre les parenthèses nécessaires :

 nums[(end - 3):end]
4-element Vector{Float64}:
 47.0
 48.0
 49.0
 50.0

Bien sûr, chacun des indices peut être une variable entière déjà définie.

Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet

Apprends Intervalles