#!/usr/bin/python3
# -*- coding: utf-8 -*-
# intérêt de ce programme : exemple
# glob.glob() met les fichiers du répertoire en premier,
#  puis les répertoires

import os # path.join
import glob # glob
import subprocess # run

def structure_liste() :
    print("### structure 'list' ###")
    print("# déclaration d'une liste vide")
    print("liste = []")
    liste = []
    print(f"  -> liste = '{liste}' ; len(liste) = '{len(liste)}' ; type(liste) = {type(liste)}")
    
    print("# ajout d'éléments à la liste")
    print("liste.append(1)")
    liste.append(1)
    print(f"  -> liste = '{liste}'")
    
    print("# déclaration d'une liste")
    print("liste1 = [2, 3]")
    liste1 = [2, 3]
    print(f"  -> liste1 = '{liste1}'")
    
    print("# concaténation de 2 listes (mises bout à bout)")
    print("# (remarque : avec append(), liste1 serait un élément de liste)")
    print("liste.extend(liste1)")
    liste.extend(liste1)
    print(f"  -> liste = '{liste}'")
    
    print("# insertion d'un élément à une position donnée")
    print("liste.insert(1, 4)")
    liste.insert(1, 4)
    print(f"  -> liste = '{liste}' ; len(liste) = {len(liste)} ; ")
    
    print("# suppression d'un élément par sa valeur")
    print("liste.remove(2)")
    liste.remove(2)
    print(f"  -> liste = '{liste}'")

    # del liste[2]
    print("# suppression d'un élément à une position donnée")
    print("# (autre possibilité : del liste[2])")
    print("# attention : la position du permier élément est 0 . . .")
    print("liste.pop(1)")
    liste.pop(1)
    print(f"  -> liste = '{liste}'")

    # del liste
    print("# vidange de la liste")
    print("# (autre possibilité : redéfinition liste = []")
    print("liste.clear()")
    liste.clear()
    print(f"  -> liste = '{liste}'")

    # position du premier élément valant x
    # list.index(x[, start[, end]])

    # nombre d'éléments valant x
    # list.count(x)
    
    # tri de la liste
    # list.sort(key=None, reverse=False)

    # inversion de la liste
    # list.reverse()

    # copie de la liste dans une nouvelle liste
    # attention éviter absolument : liste1 = liste
    #     erreur assurée : 2 noms différents pour la même liste
    # list.copy()

    # squares = list(map(lambda x: x**2, range(10)))
    # ou, de manière équivalente :
    # squares = [x**2 for x in range(10)]

    return None

def structure_dictionnaire() :
    print("### structure 'dictionary' ###")
    print("# déclaration d'un dictionnaire vide")
    print("dico = {}")
    dico = {}
    print(f"  -> dico = '{dico}' ; len(dico) = {len(dico)} ; type(dico) = {type(dico)}")
    
    print("# ajout d'un élément")
    print("dico['andré'] = '+33123456789'")
    dico['andré'] = '+33123456789'
    print(f"  -> dico = '{dico}'")
    return None

def structure_classe() :
    print("### structure 'class' ###")
    # attributs et fonctions
    class classe() :
        def __init__(self, x) :
            # attributs
            self.x = x
            return None
        def carre(self) :
            return self.x**2
        def puissance(self, p) :
            return self.x**p
    print("# déclaration dune instance de classe 'a' :")
    print("a = classe(5)")
    a = classe(5)
    print(f"  -> type(a)={type(a)}")
    print("# application de la fonction carre() de la classe à l'instance a :")
    print("a.carre()")
    print("  ->", a.carre())
    print("a.puissance(4)")
    print("  ->", a.puissance(4))
    return None
    
def main() :
    print("# data_structure.py : début")
    # deque, set doivent être utilisés à la place de list pour optimiser les performances
    liste_choix = " list  deque  tuple  set  dictionary  class "
    choix = '?'
    while choix != '' :
        choix = input(f"Votre choix parmi {liste_choix}? ")
        if choix == '' :
            break
        elif choix == 'list' :
            structure_liste()
        elif choix == 'deque' :
            print("# collection.deque :")
            print("# optimisation de liste pour l'ajout en tête")
        elif choix == 'tuple' :
            print("# tuple : liste qu'on ne peut pas modifier")
            print("# le retour de plusieurs arguments d'une fonction est un tuple")
        elif choix == 'set' :
            print("# set : optimisation de liste quand on n'a pas besoin de l'ordre")
        elif choix == 'dictionary' :
            structure_dictionnaire()
        elif choix == 'class' :
            structure_classe()
    print("# data_structure.py : fin")
    return None

if __name__ == "__main__" :
    main()
