#!/usr/bin/env python
# coding: utf-8
# # langages de script – Python
#
# ## Cours 1 – premiers pas
#
# ### M1 Ingénierie Multilingue – INaLCO
#
# clement.plancq@ens.fr
# # Avant de commencer
#
# * Nous travaillerons avec Python3 (3.6 de préférence)
# * Pour le travail avec la console vous utiliserez ``python3`` ou ``ipython``
# Tapez ``python3`` ou ``ipython`` dans un terminal pour accéder à la console
# * Choisissez l'éditeur de texte que vous préférez (emacs, vi, atom, visual studio, sublime text, …)
# * Vos scripts devront être encodés en utf-8, indiquez-le dans vos scripts avec le commentaire suivant en première ligne :
# `# -*- coding: utf-8 -*-` ou `# coding=utf-8`
# # Avant de commencer (2)
#
# Pour exécuter vos scripts, deux options :
#
# `> python3 mon_script.py`
#
# ou (mais pourquoi faire compliqué ?)
#
# `> chmod u+x`
# `> ./mon_script.py` en ajoutant ce shebang en première ligne :
# `#!/usr/bin/env python3`
#
# # Opérateurs mathématiques
#
# `+` addition
# In[3]:
2 + 5
# `-` soustraction
# In[2]:
3 - 2
# `*` multiplication
# In[4]:
2 * 3
# `/` division
# In[5]:
36 / 6
# `%` modulo (reste de la division)
# In[6]:
36 % 8
# `**` puissance
# In[7]:
10 ** 2 * 4
# * L'ordre des opérations est l'ordre classique en mathématiques (puissance passe avant les opérations).
# * vous pouvez utiliser des parenthèses pour définir des priorités.
# In[8]:
36 / (2*3)
# # Les chaînes de caractères
#
# * `+` est aussi l'opérateur de concaténation de chaînes de caractères
# In[13]:
"Hello" + "world"
# In[14]:
"Hello" + " " + "world"
# * Les chaînes de caractères sont entourées soit de quotes simples `'`, soit de guillemets `"`
# * Si votre mot contient une apostrophe, entourez-le de guillemets `"`
# In[15]:
'Ça donne une erreur t'as vu'
# In[12]:
"Ça donne une erreur t'as vu"
# # Les variables
#
# * L'affectation des variables se fait à l'aide du symbole `=`
# * Si la variable est placée à droite du symbole `=`, sa *valeur* est affectée à la variable placée à gauche.
# In[17]:
var = 3 + 2
print(var)
another_var = var
print(another_var)
# In[18]:
yet_another_var_2 = var + 1
yet_another_var_2
# * Les noms de variable sont composés de car. alphabétiques (min ou maj), des chiffres et de l'underscore. C'est tout.
#
# * Les noms de variable sont choisis par le programmeur, ils doivent être le plus clair possible.
# En réalité il est conseillé de suivre la [PEP 8](https://www.python.org/dev/peps/pep-0008/).
#
#
# In[21]:
je-ne-suis-pas-une-variable = 2
# In[22]:
3_moi_non_plus = 2 + 3
# * Seuls les mots réservés sont interdits.
# In[20]:
import keyword
print(keyword.kwlist)
# # Help !
# ## PEP, quesaco ?
#
# PEP : Python Enhancement Proposals
#
# Python est sous licence libre. Le langage a été créé par Guido Van Rossum mais depuis 2001 le développement de Python est géré par la [Python Software Foundation](http://www.python.org/psf/) (dont Guido était le *"benevolent dictator for life"* jusqu'en juillet 2018).
#
# Les évolutions du langage sont détaillées dans ces PEP (proposées, examinées, corrigées, acceptées puis implémentées).
# Les PEP les plus célèbres sont
# * [PEP 20](https://www.python.org/dev/peps/pep-0020/) "Zen of Python"1 (tapez `import this` dans une console)
# * [PEP 8](https://www.python.org/dev/peps/pep-0008/) "Style Guide for Python Code"
#
# 1 "There should be one-- and preferably only one --obvious way to do it." Tacle par derrière sur Perl, c'est pas joli-joli.
# # Les types
#
# * Python est un langage à typage *dynamique* fort : le type d'une variable est déterminé par l'interpréteur.
# * Python est un langage à typage dynamique *fort* : pas de conversion implicite, certaines actions sont interdites.
# In[23]:
"Hello" + 1
# * La fonction `type()` retourne le type de la variable donnée en argument.
# In[31]:
type("Hello")
# * `str()`, `int()`, `float()` convertit l'argument dans le type désiré.
# * `bool()` retourne `True` si l'argument est vrai, `False` sinon.
# In[26]:
int(3.14159265359)
# In[27]:
"Hello" + str(1)
# # Help !
#
# Nous venons d'utiliser 4 fonctions.
#
# Avant d'utiliser une fonction il est indispensable de savoir : ce que fait la fonction, quels sont les paramètres attendus, quelle est la valeur de retour.
#
# Pour accéder à la documentation d'une fonction :
# * dans la console : `help(int)` (d'une fonction ou d'une classe ou d'un module)
# `q` pour sortir de la doc
# * sur le web : [https://docs.python.org/3/library/functions.html](https://docs.python.org/3/library/functions.html)
# * ou bien : [DevDocs](http://devdocs.io/)
# # Les structures conditionnelles
#
# ```python
# if condition:
# #begin of block
# instruction1
# instruction2
# #end of block
#
# ```
#
# ### Opérateurs de comparaison
# `<` inférieur / `<=` inférieur ou égal
# `>` supérieur / `>=` supérieur ou égal
# `==` égal / `!=` non égal
# `is` identité (pour les objets surtout) / `is not` non identité
# In[33]:
x = 4
if x > 3:
print("x a grandi")
# In[34]:
if x > 3:
print("x a grandi")
else:
print("x n'a pas grandi")
# ### Opérateurs booléens
# ``not`` négation
# ``and`` conjonction (True si les deux opérandes sont vraies, False sinon)
# ``or`` disjonction (True si une des deux opérandes est vraie)
# In[35]:
if x > 3 and x <= 5:
print("x a grandi, un peu")
elif x > 5:
print("x a grandi")
else:
print("x n'a pas grandi")
# # Les listes
# #### Vite fait, on y reviendra
#
# * Une liste une structure de données ordonnée
# * Une liste peut contenir plusieurs valeurs, variables, listes, objets, ... le tout de types différents
# * On accède à un élément de la liste par son indice (de 0 à n-1, n étant le nombre d'éléments)
# In[45]:
voyelles = []
voyelles = ['a', 'e', 'i', 'o', 'u']
voyelles[0]
# # Les dictionnaires
# #### Vite fait, on y reviendra
#
# * Un dictionnaire est une structure de données associative de type 'clé' => 'valeur'
# * Les données ne sont pas ordonnées comme dans les listes
# * On accède à une valeur par sa clé
# * Les clés sont uniques, on ne peut pas associer deux valeurs à une même clé
# * `keys()` renvoie la liste des clés, `values()` la liste des valeurs
# In[41]:
couleurs = {'a':'noir', 'e':'blanc', 'i':'rouge', 'u':'vert', 'o':'bleu'}
couleurs['i'] = "pourpre"
couleurs
# In[50]:
couleurs.keys()
# # Les boucles
# #### Vite fait, on y reviendra
#
# * Les boucles `while` nécessitent que la valeur utilisée dans la condition d'arrêt soit modifiée dans le corps de la boucle.
# * Les boucles `for` s'appliquent aux objets de type "iterables" (liste, chaîne de car., dict.items())
# In[51]:
i = 1
while i < 5:
print(i)
i = i + 1
# In[52]:
for item in voyelles:
print(item)
# In[53]:
for item in couleurs.keys():
print(item)
# In[56]:
for key, value in couleurs.items():
print(key, value)
# # Les fonctions
# ### Vite fait, on y reviendra
#
# ```python
# def ma_fonction(arg1, arg2):
# """ description de la fonction """
# instruction1
# instruction2
# return(resultat)
# ```
# * L'ordre des arguments est déterminant
# * Il est possible d'outrepasser l'ordre en nommant les arguments lors de l'appel de fonction
#
# In[61]:
def soustraction(arg1, arg2):
res = arg1 - arg2
return res
# In[62]:
diff = soustraction(5, 3)
diff
# In[63]:
diff = soustraction(3, 5)
diff
# In[65]:
diff = soustraction(arg2=5, arg1=3)
diff
# # Exos
#
# Vous rendrez des scripts Python3. Avec des commentaires c'est mieux.
#
# 1. Finir le chifoumi
# 2. Faire un jeu un peu sur le modèle du chifoumi où l'utilisateur doit deviner un chiffre entre 1 et 10 (10 inclus). 5 essais possibles. Le jeu doit donner des indications (trop grand, trop petit) à chaque essai.
# 3. Résoudre [Power of Thor - Episode 1](https://www.codingame.com/training/easy/power-of-thor-episode-1) sur CodinGame