# Les bases du langage

## Algébrie

Opérateur | Usage
--- | ---
+ | Additionne deux nombres
- | Soustrait deux nombres
* | Multiplie deux nombres
/ | Divise deux nombres
// | Retourne le nombre entier d'une division
% | Retourne le reste d'une division

Exemple :

    >>> 2+3
    # Le résultat sera 5
    >>> 3*3
    # Le résultat sera 9

## Les variables

### Les bases

- Déclaration d'une variable :

    nom_variable = valeur

> 1. Le nom de la variable ne peut être composé que de lettres, majuscules ou minuscules, de chiffres et du symbole souligné « _ » (appelé underscore en anglais).
> 2. Le nom de la variable ne peut pas commencer par un chiffre.
>    3.Le langage Python est sensible à la casse, ce qui signifie que des lettres majuscules et minuscules ne constituent pas la même variable (la variable AGE est différente de aGe, elle-même différente de age).

Il existe 2 conventions principales pour nommer une variable :

1. On remplace les espaces par un _ : `mon_age`
2. On écrit le début de chaque mot, sauf le premier, avec une majuscule : `monAge`
   Pour affecter une valeur à cette variable :

    monAge = 19

On peut interagir avec cette variable en modifiant son contenu comme bon nous semble :

    monAge = 19
    # monAge vaut 19
    monAge = monAge + 4
    # monAge vaut 23
    monAge = monAge * 2
    # monAge vaut 46

### Différents types de données

Type de donnée | Commentaire
--- | ---
Nombres entiers (int) | Nombre sans virgule : `3`
Nombres flottants (float) | Nombre avec virgule : `3.2442`
Chaine de caractères | Contient des lettres, des phrases : `Bonjour !`

Pour les chaines de caractères, il faut faire attention aux types de guillements utilisés :

    maPhrase = 'J'aime le python'
    # Syntaxe incorrecte !
    # Pour corriger cela, il faut échapper le ' :
    maPhrase = 'J\'aime le python'
    # Affiche bien la phrase

    maPhrase = "j'aime le python"
    # J'aime le python

    maPhrase = """j'aime
                  le
                  python"""
    # Les trois guillemets permettent de ne pas avoir à échapper les caractères, et permettent de faire un retour à la ligne sans utiliser \n

### trucs et astuces

#### Incrémenter des variables

Lorsqu'il s'agit d'incrémenter des variables, on peut faire de plusieurs façons :

    # Méthode 1 : Rajouter la valeur à la variable
    maVariable = 1
    maVariable = maVariable + 1
    # Méthode 2 : Incrémenter directement la variable
    maVariable = 1
    maVariable += 1

#### Permutation de variable

    >>> a = 5
    >>> b = 32
    >>> a,b = b,a # permutation
    >>> a
    32
    >>> b
    5
    >>>

#### Affecter la même valeur à plusieurs variables

    >>> x = y = 3
    >>> x
    3
    >>> y
    3
    >>>

## Les fonctions

Syntaxe d'une fonction :

    nom_de_la_fonction(parametre_1,parametre_2,…,parametre_n)

### Fonctions de base

- La fonction type
  Cette fonction permet de retourner le type d'une variable.

    a=3
    type(a)
    # retourne <class 'int'>

- La fonction print
  Cette fonction ne sert uniquement qu'à afficher du texte ou une variable. Contrairement à la console qui est capable d'afficher une variable sans avoir à appeler cette fonction, sur un IDE vous serez obligé de vous en servir.

    >>> a = 3
    >>> print(a)
    >>> a = a + 3
    >>> b = a - 2
    >>> print("a =", a, "et b =", b)

- La fonction input
  Cette fonction permet de récupérer la saisie d'un utilisateur.

    choix = input("Faite votre choix : ")

Par défaut, la valeur sera une chaine de caractères. Pour la convertir en entier, on peut utiliser ceci :

    annee = input("Saisir une annee : ")
    annee = int(annee)

# Structures conditionnelles

## IF

La structure conditionnelle IF permet de faire un choix. Cela permet de rendre le code intelligent.
Dans un langage courant, cela donnerait ceci :

    Si <réfrigérateur_vide = 1>
      Alors Afficher "Faire des courses"
    Fin si

En python, cela donnerait :

    refrigerateur_vide = 1
    if refrigerateur_vide=1:
      print "Faire des courses"

> Attention : Dans d'autres langages de programmation tel que le C#, la fonction est délimitée par {}. En python, la fonction commence par : et c'est l'indentation qui délimite.

Démonstration :

    refrigerateur_vide = 1
    if refrigerateur_vide=1: #Je débute le IF
      print "Aller faire des courses" # Je suis dans le IF
      print "Je suis encore de le IF"
      print "Ici aussi"
    print "Ici non, mon IF est terminé"

## IF ELSE

Je peux également grâce au ELSE définir une action si ma condition est fausse.

    refrigerateur_vide = 1
    if refrigerateur_vide=1: # Si le frigo est vide, alors ...
      print "Faire des courses"
    else: # Sinon ...
      print "Ne pas faire de courses"

## ELIF

Cette condition permet d'avoir plusieurs conditions dans une clause IF.

    refrigerateur_vide = 1
    if refrigerateur_vide=1: # Si le frigo est vide, alors ...
      print "Faire des courses"
    elif refrigerateur_vide=0.5: # Si le frigo est presque vide, alors ...
      print "Faire de petites courses"
    else: # Sinon ...
      print "Ne pas faire de courses"

## Opérateurs de comparaison

Opérateur | Signification
--- | ---
< | Strictement inférieur à
> | Strictement supérieur à
<= | Inférieur ou égal à
>= | Supérieur ou égal à
== | Égal à
!= | Différent de

> Attention : Pour tester l'égalité de deux valeurs, on utilise == et non = qui lui sert à l'affectation de valeurs

> Info : Une condition renvoie uniquement deux valeurs : True ou False (vrai ou faux). Si le test est correcte, il renverra True, sinon False.

## Plusieurs conditions pour une clause IF

Si un test à besoin de plusieurs conditions pour être vrai, on peut combiner plusieurs conditions pour une seule clause IF.

    permis=False
    majeur=True
    if permis==True and majeur == True: # Pour que je puisse conduire, il faut que j'ai mon permis et que je sois majeur
      print "Je peux conduire"
    else:
      print "Je ne peux pas conduire"

# Les boucles

## La boucle WHILE

La boucle while (ou tant que) répète une série d'instructions tant qu'une condition n'est pas vraie.
Syntaxe :

    while condition:
      instruction1
      instruction2
      ...

Exemple : Je veux répéter une instruction tant que i n'est pas égal à 10 :

    i = 0
    while 1 != 10:
      print ("i ne vaut pas 10")
      i+=1

> Attention : Il ne faut pas oublier d'incrémenter le compteur, sinon la boucle sera infinie !

# Fonctions avancées

## Le constructeur

Un constructeur est une méthode spéciale d'une classe qui permet de construire un objet, de lui donner des attributs.

Le nom de cette méthode est “ __init__ ” et prend en premier argument “ self ”, qui représente l'objet courant, qui est cours de création.

Exemple : je crée un constructeur permettant de définir une personne

    class People:
        def __init__(self,firstname,lastname,age):
            self.firstname = firstname
            self.lastname  = lastname
            self.age       = age

Notre fonction init demande 3 paramètres, “ self ” étant un paramètre spécial.

Grâce à ce constructeur il ne reste qu'à créer des objets :

    >>> chuck = People("Chuck","Norris",81)

L'objet “chuck” a été créé, on peut désormais accéder à ses différents attributs, les lire et les modifier.

    >>> chuck.firstname
    'Chuck'
    >>> chuck.firstname = "Chucky"
    >>> chuck.firstname
    'Chucky'

## Le représentateur

Reprenons l'exemple précédent. Lorsque l'on souhaite afficher notre objet, la valeur retournée n'est pas tout à fait celle attendue.

    >>> chuck
    <__main__.People object at 0x03C12820>

Nous allons donc utiliser un représentateur pour mettre en forme l'objet.

Cette méthode se définit “ __repr__ ”.

    class People:
        def __init__(self,firstname,lastname,age):
            self.firstname = firstname
            self.lastname  = lastname
            self.age       = age

        def __repr__(self):
            return "Nom : %s , Prenom : %s , Age : %s" % (self.lastname, self.firstname, self.age)

    >>> repr(chuck)
    'Nom : Norris , Prenom : Chuck , Age : 81'

## Le décorateur

Le décorateur est une fonction permettant de modifier le comportement d'autres fonctions, évitant la répétition de code. Il est appelé par “ @nom_décoraeur ”.

    def title_decorator(function):
        def wrapper(*args, **kwargs):
            print("*"*30)
            print("-"*30)
            function(*args, **kwargs)
            print("-"*30)
            print("*"*30)
        return wrapper

    @title_decorator
    def title(titre):
        print(titre)

    >>> titre = "Ceci est mon texte décoré"
    >>> title(titre)
    ******************************
    ------------------------------
    Ceci est mon texte décoré
    ------------------------------
    ******************************

Ce décorateur permet simplement de mettre en forme un titre. Mais le décorateur, critiqué pour son nom ne définissant pas assez clairement sa fonction, peut avoir bien d'autres usages.

Par exemple, dans le cadre du développement web, les décorateurs sont très utilisés. Typiquement, pour les pages nécessitant une authentification, le décorateur “ @login_required ” du framework Django est très utile.

    from django.contrib.auth.decorators import login_required

    @login_required
    def my_page(request):
        ...

Tout comme “ @login_required ”, beaucoup de décorateurs sont déjà développés, nécessitant un simple import.