Chapitre 7 - Listes
===================

// TODO: split in pages

Définition
----------

Une liste est une *suite ordonée* d'éléments.

Créer une liste
---------------

Avec des crochets: ``[``, ``]``, et les élements séparés par des virgules::

    liste_vide = []
    trois_entiers = [1, 2, 3]


Listes hétérogènes
------------------

On peut mettre des types différents dans la même liste::

    ma_liste = [True, 2, "trois"]

On peut aussi mettre des listes dans des listes::

    liste_de_listes = [[1, 2], ["Germaine", "Gertrude"]]

Connaître la taille d'une liste
-------------------------------

Avec ``len()`` - encore une fonction native::

    liste_vide = []
    taille = len(liste_vide)
    print(taille)
    # affiche:  0

    trois_entiers = [1, 2, 3]
    taille = len(trois_entiers)
    print(taille)
    # affiche:  3

Concaténation de listes
-----------------------

Avec ``+``::

    prénoms = ["Alice", "Bob"]
    prénoms += ["Charlie", "Eve"]
    print(prénoms)
    # affiche: ['Alice', 'Bob', "Charlie", 'Eve']

On ne peut concaténer des listes que avec d'autres listes::

    scores = [1, 2, 3]
    scores += 4
    # erreur

    scores += [4]
    print(scores)
    # affiche: [1,2,3,4]

Test d'appartenance
-------------------

Avec ``in``::

    prénoms = ["Alice", "Bob"]
    print("Alice" in prénoms)
    # affiche: True

    prénoms = ["Alice", "Bob"]
    print("Charlie" in prénoms)
    # affiche: False

Itérer sur les élements d'une liste
------------------------------------

Avec ``for ... in``::

   prénoms = ["Alice", "Bob", "Charlie"]
   for prénom in prénoms:
   	# La variable 'prénom" est assignée à chaque
   	# élément de la liste
       print("Bonjour", prénom)

.. code-block:: text

   Bonjour Alice
   Bonjour Bob
   Bonjour Charlie

Indéxer une liste
------------------

* Avec ``[]`` et un entier

* Les index valides vont de 0 à ``n-1`` où ``n`` est la
  taille de la liste::

    fruits = ["pomme", "orange", "poire"]

    print(fruits[0])
    # affiche: "pomme"

    print(fruits[1])
    # affiche: "orange"

    print(list[2])
    # affiche: "poire"

    fruits[3]
    # erreur: IndexError

Modifier une liste
-------------------

Encore une assignation::

    fruits = ["pomme", "orange", "poire"]
    fruits[0] = "abricot"
    print(fruits)
    # affiche: ["abricot", "orange", "poire"]

Les strings sont aussi des listes (presque)
--------------------------------------------

On peut itérer sur les caractères d'une string::

    for c in "vache":
    	print(c)

.. code-block: console

   v
   a
   c
   h
   e

On peut tester si un caractère est présent::

    print("e" in "vache")
    # affiche: True

    print(x" in "vache")
    # affiche: False


Mais on neut peut pas modifier une string::

   prénom = "Charlotte"
   l = prénom[0]
   print(l)
   # affiche: "C"

   l = prénom[3]
   print(l)
   # affiche: "r"

   prénom[0] = "X"
   # erreur: TypeError


Falsy et truthy
----------------


En réalité on peut mettre autre chose qu'une comparaison ou une variable booléenne après le if.

Si on met une liste vide, ``if`` se comportera comme si on avait mis une valeur fausse, et si
la liste n'est pas vide , ``if`` se comportera comme si on avait mis une valeur vraie.::

    ma_liste = [1, 2, 3]
    if ma_liste:
        print("ma_liste n'est pas vide")
    # affiche: ma_liste n'est pas vide

    mon_autre_liste = []
    if not mon_autre_liste:
        print("mon_autre_liste est vide")
    # affiche: mon_autre_liste est vide

On dit que les listes vides sont *Falsy* et les listes non-vides *Truthy*
