{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# langages de script – Python\n",
"\n",
"## Cours 2 – précisions, fichiers et chaînes\n",
"\n",
"### M1 Ingénierie Multilingue – INaLCO\n",
"\n",
"clement.plancq@ens.fr"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Type `bool` et valeurs booléennes\n",
"\n",
"* Nous avons vu qu'il existe un type `bool`\n",
"\n",
" `True` et `False` sont les deux valeurs possibles de ce type.\n",
"\n",
"* Les comparaisons et les opérations booléennes renvoient des valeurs de type `bool`"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\"Hilary Clinton\" == \"Donald Trump\""
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"2.0 < 2.1 and 2.0 > 1.9"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"* Les valeurs ci-dessous sont toutes évaluées par l'interpréteur comme ayant la valeur booléenne *false*\n",
"\n",
" `False` `None` `0` `\"\"` `()` `[]` `{}`\n",
"\n",
"* Tout le reste1 sera évalué comme _true_\n",
"\n",
" Vous pouvez écrire :\n",
"```python\n",
">>> if var: ou while list: \n",
"```\n",
" plutôt que : \n",
" (C'est même jugé plus pythonique (pythonien ?))\n",
"\n",
"```python\n",
">>> if var != \"\": ou while list != []:\n",
"```\n",
"\t\n",
"1 Sauf les objets dont vous avez construit les classes. Voir les diapos à venir sur Classes et objets."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Assertions\n",
"\t\n",
"* Les assertions (`assert condition`) permettent de vérifier qu'une condition est remplie avant de poursuivre le programme\n",
"\n",
"* `assert` est utilisé à des fins de débogage.\n",
"* Les assertions ne sont pas prises en compte si l'interpréteur est appelé avec l'option -O (optimisation)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"var = 2\n",
"assert 1 <= var <= 10"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"source": [
"est équivalent à :"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"if not 1 <= var <= 10:\n",
" raise AssertionError\n",
"# plus exactement \n",
"if __debug__:\n",
" if not 1 <= var <= 10: raise AssertionError\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Précisions sur boucle `for`\n",
"\n",
"* `for` permet d'appliquer à chaque élément d'une liste les instructions du bloc qui suit"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"words = ['tout', 'ici', 'chante', 'la', 'vie', 'de', 'naguère']\n",
"for word in words:\n",
" up_word = word.upper()\n",
" print(up_word)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"source": [
"* Plus précisément `for` s'applique sur les *séquences* (`list`, `str`, `tuple`) et plus généralement sur les *iterables* [voir doc](https://docs.python.org/3/glossary.html#term-iterable)\n",
"\t \n",
"* Les *iterables* sont des objets issus de classes qui implémentent la méthode `__iter__()` et/ou `__getitem__()`\n",
"\n",
" Essayer `help(str)` ou `help(dict)`"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Boucles encore\n",
"\n",
"* L'instruction `continue` permet de passer à l'itération suivante"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"tout ici chante vie de naguère "
]
}
],
"source": [
"for word in words:\n",
" if word == 'la':\n",
" continue\n",
" print(word, end=\" \")"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"source": [
"* L'instruction `break` permet de quitter la boucle en cours"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"tout ici chante "
]
}
],
"source": [
"for word in words:\n",
" if word == 'la':\n",
" break\n",
" print(word, end=\" \")"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Boucles enfin\n",
"\n",
"* `zip` permet de boucler sur plusieurs séquences\n",
"* Si les séquences sont de tailles différentes `zip` s'arrête à la longueur la plus petite\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"einstein est inscrit en pro à inalco\n",
"planck est inscrit en r&d à p3\n",
"turing est inscrit en r&d à p10\n",
"curie est inscrit en pro à inalco\n",
"bohr est inscrit en pro à p3\n",
"shannon est inscrit en r&d à inalco\n"
]
}
],
"source": [
"noms = ['einstein', 'planck', 'turing', 'curie', 'bohr', 'shannon']\n",
"facs = ['inalco', 'p3', 'p10', 'inalco', 'p3', 'inalco']\n",
"parcours = ['pro', 'r&d', 'r&d', 'pro', 'pro', 'r&d']\n",
"for nom, fac, parcours in zip(noms, facs, parcours):\n",
" print(\"{} est inscrit en {} à {}\".format(nom, parcours, fac))"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Les fichiers\n",
"\n",
"* Pour travailler avec les fichiers on doit procéder à trois opérations :\n",
" 1. Ouverture avec la fonction `open` (renvoie `IOError` en cas d'échec)\n",
" 2. Lecture (`read` ou `readline` ou `readlines`) et/ou écriture (`write`)\n",
" 3. Fermeture du fichier avec la fonction `close`\n",
"\t \n",
"* Ouverture\n",
" * `open` est une fonction qui accepte de nombreux arguments : RTFM\n",
" * `open` renvoie un objet de type `file`\t \n",
" * Le plus souvent elle s'emploie de la manière suivante:\n",
" ```python\n",
">>> #f = open(filename, mode)\t \n",
">>> f = open('nom_fichier', 'w')\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Les modes sont : \n",
"\n",
"* r : lecture (défaut)\n",
"* w : écriture\n",
"* x : création et écriture (échec si le fichier existe déjà)\n",
"* a : concaténation (append)\n",
"\t \n",
"* b : mode binaire\n",
"* t : mode texte (défaut)\n",
"* \\+ : read/write (ex: r+b)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"## Les fichiers : ouverture\n",
"\n",
"La documentation de Python conseille cette façon de faire \n",
"```python\n",
">>> with open('mon_fichier', 'r') as f:\n",
"... read_data = f.read()\n",
"```\n",
"L'utilisation du mot clé `with` garantit la fermeture du fichier même si une exception est soulevée"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"## Les fichiers : lecture\n",
"\n",
"Plusieurs options pour la lecture\n",
"\n",
"* la fonction `read()` sans argument retourne le contenu du fichier\n",
"* elle peut recevoir en argument la taille des donnéees à retourner \n",
"\n",
"```python\n",
"# Les n premiers octets\n",
"3_chars = f.read(3) \n",
"# Le reste du fichier\n",
"content = f.read()\t \n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"* fonction `readline` et `readlines`\n",
"\n",
"```python\n",
"for line in f.readline():\n",
" process(line)\n",
" \n",
"lines = f.readlines() \n",
"```\n",
"\n",
"* un objet `file` est un itérable ! (_the pythonic way_)\n",
"\n",
"```python\n",
"for line in f:\n",
" process(line)\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"## Les fichiers : écriture et fermeture\n",
"\n",
"* fonction `write`\n",
"```python\n",
"for item in list:\n",
" f.write(item)\n",
"```\n",
"* fonction `close`\n",
"\n",
" `f.close()`\n",
"\n",
" En règle générale veillez à toujours fermer les objets fichiers\n",
"\n",
" En mode écriture oublier de fermer un fichier peut réserver des mauvaises surprises\n",
"\n",
"* `sys.stdin`, `sys.stdout` et `sys.stderr` sont des objets de type `file`"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Les chaînes\n",
"\n",
"Comme les listes et les tuples, les chaînes sont des *sequences*, on peut leur appliquer les opérations suivantes propres à la catégorie d'objets *sequence* :\n",
"\n",
"* longueur, minimum, maximum"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"7"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"var = \"bonjour\"\n",
"len(var)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'u'"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"max(var)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"source": [
"* _indexing_"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'n'"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"var[2]"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'r'"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"var[-1]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"* _slicing_"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'bon'"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"var[0:3] # 3 premiers éléments"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'our'"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"var[-3:] # 3 derniers éléments"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"source": [
"* _membership_"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Il y a un u dans bonjour\n"
]
}
],
"source": [
"if 'u' in var:\n",
" print(\"Il y a un u dans {}\".format(var))\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Les chaînes ont aussi des fonctions qui leur sont propres\n",
"\n",
"* lower"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'le grand quotidien national'"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"var = \"Le Grand Quotidien National\"\n",
"var.lower()"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"source": [
"* replace"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'le grand quotidien botiobol'"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"var = \"Le Grand Quotidien National\"\n",
"var = var.lower()\n",
"var.replace('na', 'bo')"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"* strip, rstrip\n",
"\n",
" `strip` appelé sans arguments supprimme le ou les espaces en tête et en fin de chaîne \n",
" `rstrip` fait la même chose en fin de chaîne uniquement \n",
" `lstrip` idem en début de chaîne"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"\"Lover you should've come over\""
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"var = \"Lover you should've come over \"\n",
"var.rstrip()"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"* split\n",
"\n",
" `split` découpe une chaîne en fonction du séparateur passé en argument et renvoie une liste\n"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['The', 'concept', 'of', 'global', 'warming']"
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"var = \"The concept of global warming was created by and for the Chinese in order to make U.S. manufacturing non-competitive.\"\n",
"words = var.split(' ')\n",
"words[:5]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"* join\n",
"\n",
" `join` est l'inverse de `split`, il permet de joindre les éléments d'une liste de chaînes pour former une seule chaîne de caractères"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'Quand le ciel bas et lourd'"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list = ['Quand', 'le', 'ciel', 'bas', 'et', 'lourd']\n",
"\" \".join(list)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"👩👩👧\n"
]
}
],
"source": [
"print('\\N{ZWJ}'.join(['👩','👩','👧']))"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"## Formatage de chaînes\n",
"\n",
"« There should be one-- and preferably only one --obvious way to do it. » _Zen of Python_ \n",
"Sauf que : "
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Tiens salut . T'aurais pas 1.2 euros pour 2 cafés ?\n"
]
}
],
"source": [
"name = \"\"\n",
"coffee_price = 0.6\n",
"\n",
"print(\"Tiens salut \" + name + \". Tu aurais pas \" + str(coffee_price*2) + \" euros pour 2 cafés ?\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"source": [
"* [`format()`](https://docs.python.org/3.5/library/string.html#formatstrings) depuis python3 (et python2.7)"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"scrolled": true,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Tiens salut . T'aurais pas 1.2 euros pour 2 cafés ?\n"
]
}
],
"source": [
"print(\"Tiens salut {}. T'aurais pas {} euros pour 2 cafés ?\".format(name, coffee_price*2))"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"source": [
"* [f-string](https://docs.python.org/3.6/reference/lexical_analysis.html#f-strings) depuis python3.6"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Tiens salut . T'aurais pas 1.2 pour 2 cafés ?\n"
]
}
],
"source": [
"print(f\"Tiens salut {name}. T'aurais pas {coffee_price*2} pour 2 cafés ?\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Exos\n",
"\n",
"Vous rendrez des scripts Python3. Avec des commentaires c'est mieux. \n",
" \n",
"1. Finir dictionnaire de rimes\n",
"2. Résoudre [températures](https://www.codingame.com/training/easy/temperatures) sur CodinGame"
]
}
],
"metadata": {
"celltoolbar": "Slideshow",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.0"
},
"livereveal": {
"autolaunch": true,
"scroll": true,
"transition": "none"
}
},
"nbformat": 4,
"nbformat_minor": 2
}