#!/usr/bin/env python
# coding: utf-8
# # Les tableaux :
#
# Un tableau est une suite ordonnée d'éléments. Ces éléments sont séparés par des virgules et entourés par des crochets.
#
# En Python, un tableau est de type list.
#
# > A voir sur Lumni : https://www.lumni.fr/video/notion-de-listes-en-informatique-et-application-aux-images-numeriques
#
# ## Exemples :
#
# ### Un tableau vide :
# In[ ]:
monTableau = []
monTableau, type(monTableau)
# ### Un tableau d'entiers :
# In[ ]:
tab_entiers = [ 1, 2, 3, 4, 5]
tab_entiers, type(tab_entiers)
# ### Un tableau de chaines de caractères :
# In[ ]:
tab_chaines = [ "toto", "titi", "tata", "tutu", "tete"]
tab_chaines, type(tab_chaines)
# ### Un tableau de tuples :
# In[ ]:
tab_tuples = [(1, 2, 'moi'),(3, 4, 'toi'),(5, 6, 'nous')]
tab_tuples, type(tab_tuples)
# ### Un tableau de tableau :
# In[ ]:
tab_tableaux = [[0, 2, 4, 6, 8],[1, 3, 5, 7, 9]]
tab_tableaux, type(tab_tableaux)
# > **Présentation sous forme de matrice en ligne et colonne :**
# >
# > ```python
# matrice = [[1, 2, 3],
# [4, 5, 6],
# [7, 8, 9]]
# ```
# > Pour cibler un élément particulier de la matrice, on utilise la notation avec "doubles crochets" : matrice[ligne][colonne]
# In[ ]:
tab_tuples = [(1, 2, 'moi'),
(3, 4, 'toi'),
(5, 6, 'nous')]
tab_tableaux = [[0, 2, 4, 6, 8],
[1, 3, 5, 7, 9]]
# ## Lecture d'un tableau par index :
#
# Le premier élément est toujours à l'index `0`, le dernier est toujours à l'index `-1` :
#
#
#
# "toto" |
# "titi" |
# "tata" |
# "tutu" |
# "tete" |
#
#
# 0 |
# 1 |
# 2 |
# 3 |
# 4 |
#
#
# -5 |
# -4 |
# -3 |
# -2 |
# -1 |
#
#
# ### Accès à un élément :
# In[ ]:
tab_chaines[-2]
# In[ ]:
tab_tuples[1][2]
# In[ ]:
"toto" in tab_chaines
# In[ ]:
tab_chaines.index("toto")
# ### Parcours des éléments d'un tableau :
# In[ ]:
for element in tab_chaines :
print(element)
# La fontion `len(monTableau)` renvoie la taille d'un tableau, le nombre d'éléments qu'il contient :
# In[ ]:
for i in range(len(tab_chaines)) :
print(tab_chaines[i])
# In[ ]:
for i in range(len(tab_tableaux)) :
for j in range(len(tab_tableaux[i])) :
print(tab_tableaux[i][j])
# ## Modification du contenu d'un tableau :
#
# Contrairement à un `tuple`, un tableau est mutable, c'est à dire que l'on peut modifer l'un de ses éléments.
#
# ### Modifier un élément :
# In[ ]:
tab_chaines[4]="tyty"
tab_chaines
# ### Ajouter/supprimer un élément :
# - Pour ajouter un élément à une liste on utilise la méthode **``append()``**
# In[ ]:
tab_chaines.append("toto")
tab_chaines
# In[ ]:
# Remplissage d'un tableau dans une boucle
tab_cubes = [] # on déclare un tableau vide
for k in range(10):
tab_cubes.append(k**3) # on ajoute le cube de l'indice à chaque tour de boucle
tab_cubes
# - Pour supprimer un élément à une liste on utilise la méthode **``remove()``** ou encore la fonction **`del()`**
# In[ ]:
tab_chaines.remove("toto")
tab_chaines
# In[ ]:
tab_chaines.remove(tab_chaines[-1])
tab_chaines
# In[ ]:
del(tab_chaines[0])
tab_chaines
# ### Concaténation :
# In[ ]:
tab_chaines = ["toto"] + tab_chaines + ["tete"]
tab_chaines
# In[ ]:
monTableau = [0] * 6
monTableau
# ### Autre méthodes :
#
# > Placer le curseur après le point et appuyer sur la touche `Tab`
# In[ ]:
monTableau.
# ## Tableau par compréhension :
#
# Il est possible de créer un tableau et de le remplir en une ligne grâce à la compréhension de tableau :
# In[ ]:
new_tab_entier = [n for n in range(1,6)]
new_tab_entier
# In[ ]:
new_tab_cubes = [k**3 for k in range(10)]
new_tab_cubes
# In[ ]:
ma_liste_de_mots = [ "Cosinus", "Sinus", "Tangente", "Cotangente" ]
new_tab = [ len(mot) for mot in ma_liste_de_mots]
new_tab
# In[ ]:
tab_input = [input("saisir un entier positif = ") for n in range(4)]
tab_decimal = [int(n) for n in tab_input]
tab_binaire = [bin(n) for n in tab_decimal]
tab_hexadecimal = [hex(n) for n in tab_decimal]
tab_input, tab_decimal, tab_binaire, tab_hexadecimal
# La compréhension de tableau permet de rajouter une condition `if` :
# In[ ]:
new_tab_tableaux = [[i for i in range(10) if i % 2 == 0],[j for j in range(10) if j % 2 == 1]]
new_tab_tableaux
# In[ ]:
multiples_de_cinq_ou_de_sept_mais_pas_des_deux = [n for n in range(100) if ((n % 5 == 0 or n % 7 == 0) and n % 35 != 0)]
multiples_de_cinq_ou_de_sept_mais_pas_des_deux
# > **Une instruction par compréhension se construit de la façon suivante :**
# >```python
# [fonction for i in sequence condition]
# ```
# ## Identité et copie de tableau :
# Deux tableaux qui sont liés par une relation d'égalité pointent vers la même adresse mémoire.
#
# La modification de l'un entraîne la modification de l'autre.
#
# Si l'on souhaite mémoriser l'état initial d'un tableau avant sa modification il faut le copier au préalable avec la méthode `copy()`...
# In[ ]:
t1 = [1,2,3]
t2 = t1
t3 = t1.copy()
t1, t2, t3
# In[ ]:
t1[0] = 5
t1, t2, t3
# ### Observation avec Python tutor
# In[ ]:
from metakernel import register_ipython_magics
register_ipython_magics()
# In[ ]:
get_ipython().run_cell_magic('tutor', '', 't1 = [1,2,3]\nt2 = t1\nt3 = t1.copy()\nt1[0] = 5\nt3[1] = 7\n')
# A programmer vous-même :
#
#
# #### EXERCICE n°1 :
#
# 1- Écrire une fonction ``additionne_element(tableau)`` qui retourne la somme des éléments d’un tableau.
#
# Tester pour ``tableau = [ 10 , 20 , 30 , 10 , 20 , 60 , 100 ]``
#
# 2- Écrire une fonction ``moyenne_element(tableau)`` qui retourne la moyenne des éléments d’un tableau.
#
# Tester pour ``tableau = [ 10 , 20 , 30 , 10 , 20 , 60 , 100 ]``
#
# #### EXERCICE n°2 :
#
# Écrire une fonction ``supprimer_doublons(tableau)`` qui permet de supprimer les doublons d'un tableau.
#
# Tester pour ``tableau = [20,41,52,41,20,78,41,63,52,20]``
#
# #### EXERCICE n°3 :
#
# 1- Écrire une fonction ``multiplie_par_2(tableau)`` qui multiplie par 2 chaque élément du tableau
#
# Tester pour ``tableau = [ 10 , 20 , 30 , 10 , 20 , 60 , 100 ]``
#
# 2- Écrire une compréhension de tableau qui permet d’effectuer cette tâche.
#
# 3- Compléter cette instruction pour que le tableau ne contienne que des valeurs supérieures à 50
# ****
# ## Références aux programmes :
#
#
#
#
# Contenus |
# Capacités attendues |
# Commentaires |
#
#
#
# Tableau indexé, tableau donné en compréhension |
# Lire et modifier les éléments d’un tableau grâce à leurs index. Construire un tableau par compréhension. Utiliser des tableaux de tableaux pour représenter des matrices : notation a [i] [j]. Itérer sur les éléments d’un tableau.
# |
# Seuls les tableaux dont les éléments sont du même type sont présentés. Aucune connaissance des
# tranches (slices) n’est exigible. L’aspect dynamique des tableaux de Python n’est pas évoqué. Python identifie listes et tableaux. Il n’est pas fait référence aux tableaux de la bibliothèque NumPy.
# |
#
#
#
# ## Pour Aller plus loin :
# Le type `list` de Python permet de créer des tableaux (des listes de listes) pas obligatoirement homogènes en taille, ni en type :
#
# In[ ]:
monTableau= [[1,2,3,4],["toto","titi","tata"], [-3.14, 0.5, 1, 2.35, 6.48]]
monTableau[1][0], type(monTableau)
# > La bibliothèque **``numpy``** permet de gérer des tableaux numériques homogènes, des matrices...