teaching:progappchim:notions_fondamentales

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
teaching:progappchim:notions_fondamentales [2020/06/11 08:57]
villersd [Les dictionnaires]
teaching:progappchim:notions_fondamentales [2021/05/06 08:12] (Version actuelle)
villersd [Structures répétitives]
Ligne 1: Ligne 1:
 ====== Notions fondamentales ====== ====== Notions fondamentales ======
-Aide mémoire synthétique sur le langage Python. Les [[https://dvillers.umons.ac.be/wiki/floss:python#de_python_2_a_python_3|différences importantes entre la branche 2 et la branche 3]] seront commentées. La différence la plus fréquente est le passage de print à print() !+Aide mémoire synthétique sur le langage Python.
  
 ===== Règles de base ===== ===== Règles de base =====
Ligne 70: Ligne 70:
   * **Structures imbriquées** : une structure au sein d'une autre structure ! (aisément identifiables grâce à l'indentation).   * **Structures imbriquées** : une structure au sein d'une autre structure ! (aisément identifiables grâce à l'indentation).
   * Les **commentaires** commencent toujours par un caractère dièse (#) et s'étendent jusqu'à la fin de la ligne courante. Idéalement, il faut aussi penser à utiliser dans les définitions (des fonctions, des classes,...) une chaîne de documentation, débutant et se terminant par les 'triples quotes' : """   * Les **commentaires** commencent toujours par un caractère dièse (#) et s'étendent jusqu'à la fin de la ligne courante. Idéalement, il faut aussi penser à utiliser dans les définitions (des fonctions, des classes,...) une chaîne de documentation, débutant et se terminant par les 'triples quotes' : """
-Ces dispositions sont capitales pour assurer la compréhension d'un code source, par une autre personne, mais par le programmeur lui-même lorsqu'il reprend un code longtemps après son écriture.+Ces dispositions sont capitales pour assurer la compréhension d'un code source, par une autre personne, mais aussi par le programmeur lui-même lorsqu'il reprend un code longtemps après son écriture. 
 + 
 +Les instruction if peuvent souvent être remplacées par une alternative plus lisible, plus générale. Cf. par exemple [[https://medium.com/swlh/3-alternatives-to-if-statements-to-make-your-python-code-more-readable-91a9991fb353|3 Alternatives to If Statements That Make your Code More Readable]] (Jonny Jackson, Medium, 24/09/2020)
  
 ==== Structures répétitives ==== ==== Structures répétitives ====
Ligne 89: Ligne 91:
  
 //Cf.// [[http://www.courspython.com/boucles.html|cet autre cours]] avec des illustrations et des exemples de code exécutable sur le site [[http://www.pythontutor.com|pythontutor]]. //Cf.// [[http://www.courspython.com/boucles.html|cet autre cours]] avec des illustrations et des exemples de code exécutable sur le site [[http://www.pythontutor.com|pythontutor]].
 +
 +FIXME : ajouter d'autres possibilités telles que :
 +  * [[https://medium.com/analytics-vidhya/looping-techniques-in-python-3bbf907b8dfa|Looping Techniques in Python - Let’s learn about looping techniques using functions like enumerate, zip, sorted, reversed in python]] Indhumathy Chelliah; Medium, 30/07/2020
 +  * [[https://medium.com/better-programming/how-to-use-for-loops-better-in-python-1dfbc3d9e91f|How To Use For Loops Better in Python - A few functions that can improve your looping logic]] Yong Cui, Medium, Jan 8, 2020
 +  * [[https://medium.com/techtofreedom/the-art-of-writing-loops-in-python-68e9869e4ed4|The Art of Writing Loops in Python - Simple is better than complex]] Yang Zhou, Medium, 03/05/2021
  
 ---- ----
Ligne 122: Ligne 129:
   * Conversion en nombre (donnée numérique créée à partir d'une chaîne de caractères) : int("587"), float("3.14")   * Conversion en nombre (donnée numérique créée à partir d'une chaîne de caractères) : int("587"), float("3.14")
   * Pour la concaténation d'une liste de chaîne, la fonction join est plus adaptée que "+" (cf. [[https://towardsdatascience.com/do-not-use-to-join-strings-in-python-f89908307273|ici]]) :    * Pour la concaténation d'une liste de chaîne, la fonction join est plus adaptée que "+" (cf. [[https://towardsdatascience.com/do-not-use-to-join-strings-in-python-f89908307273|ici]]) : 
-<code>+<code python>
 strings = ['A', 'bac', 'cali', 'jkppl'] strings = ['A', 'bac', 'cali', 'jkppl']
 text = ''.join(strings) text = ''.join(strings)
Ligne 129: Ligne 136:
  
 Les caractères Unicode étant considérés comme abstraits dans Python 3, leur encodage (UTF-8, UTF-16,...) n'est à prendre en considération que si on utilise la méthode [[https://docs.python.org/3/library/stdtypes.html?highlight=encode#string-methods|.encode]] pour les convertir en bytes. Les caractères Unicode étant considérés comme abstraits dans Python 3, leur encodage (UTF-8, UTF-16,...) n'est à prendre en considération que si on utilise la méthode [[https://docs.python.org/3/library/stdtypes.html?highlight=encode#string-methods|.encode]] pour les convertir en bytes.
 +
 +=== Constantes ===
 +<code python>
 +import string # directive d'importation obligatoire pour ces exemples
 +
 +string.ascii_letters # 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
 +string.ascii_lowercase # 'abcdefghijklmnopqrstuvwxyz'
 +string.ascii_uppercase # 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
 +string.digits # '0123456789'
 +
 +string.punctuation # '!”#$%&\’()*+,-./:;<=>?@[\\]^_`{|}~'
 +string.whitespace # ' \t\n\r\x0b\x0c'; \x0b is \v (vertical tab), \x0c is \f (form feed)
 +string.printable # = digits + ascii_letters + punctuation + whitespace
 +</code>
 +
 +=== Modifications, recherches, index, vérifications,... ===
 +<code python>
 +s.capitalize() # captilizes (first character becomes uppercase) the string
 +s.lower() # all characters become lowercase
 +s.casefold() # more rigorous lowercase (languages other than English are covered)
 +s.upper() # all characters become uppercase
 +
 +s.count(sub) # count occurences of substring sub in s
 +s.count(sub, start) # count occurences of substring sub starting from start position in string s
 +s.count(sub, start, end) # count occurences of substring sub from start to end — 1 position in string s
 +s.find(sub) # returns index of first occurence of substring sub in s, return -1 if not found
 +s.find(sub, start) # returns index of first occurence of substring sub starting from start position in string s, returns -1 if not found
 +s.find(sub, start, end) # returns index of first occurence of substring sub from start to end — 1 position in string s, return -1 if not found
 +s.index(sub) # returns index of first occurence of substring sub in s, raises error if not found
 +s.index(sub, start) # returns index of first occurence of substring sub starting from start position in string s, raises error if not found
 +s.index(sub, start, end) # returns index of first occurence of substring sub from start to end — 1 position in string s, raises error if not found
 +len(str) # returns length of string
 +
 +s.startswith(prefix) # checks if s starts with prefix
 +s.startswith(prefix, start) # checks if s starts with prefix starting from start position
 +s.startswith(prefix, start, end) # checks if s starts with prefix starting from start position until end — 1 position
 +s.endswith(suffix) # checks if s ends with suffix
 +s.endswith(suffix, start) # checks if s ends with suffix starting from start position
 +s.endswith(suffix, start, end) # checks if s ends with suffix starting from start position until end — 1 position
 +s.isalnum() # checks if string is alphanumeric
 +s.isalpha() # checks if string contains only alphabets
 +s.isnumeric() # checks if string contains only numbers
 +s.islower() # checks if all alphabets in string s are lowercase
 +s.isupper() # checks if all alphabets in string s are uppercase
 +s.isspace() # checks if s is a space character
 +
 +s.replace(old, new) # replaces substring old with substring new
 +s.replace(old, new, count) # replace substring old with substring new for count number of times starting from left side of string s
 +s.ljust(width) # puts width — len(s) spaces on the right side of string s
 +s.ljust(width, fillchar=c) # puts character c width — len(s) times on the right side of string s 
 +s.rjust(width) # puts width — len(s) spaces on the left side of string s
 +s.rjust(width, fillchar=c) # puts character c width — len(s) times on the left side of string s
 +s.strip() # all spaces gone left and right both sides of string s
 +s.lstrip() # all spaces gone on left side of string s 
 +s.rstrip() # all spaces gone on right side of string s
 +s.strip(k) # all substrings k gone left and right both sides of string s
 +s.lstrip(k) # all substrings k gone on left side of string s
 +s.rstrip(k) # all substrings k gone on right side of string s
 +s.split(‘,’) # splits the string by ‘,’; returns a list
 +s.split(‘::’) # splits the string by ‘::’; returns a list 
 +s.split(‘ ‘) # splits the string by ‘ ‘; returns a list
 +s.zfill(width) # adds width — len(s) zeros on the left side; if a +/- sign is there then zeros are added after it
 +
 +s.join(l) # joins a list or string l with substring s
 +</code>
 +
 +=== Applications à la détection de palindromes et anagrammes ===
 +
 +
 +<code python string-palindrome-01.py>
 +#!/usr/bin/env python3
 +# -*- coding: utf-8 -*-
 +"""
 +Created on Mon Jan 25 10:58:37 2021
 +
 +@author: villersd
 +
 +Un palindrome est un texte ou une séquence plus générale (notes de musique,
 +code génétique,...), dont l'ordre des lettres (ou des notes,...) reste le même
 +qu'on le lise de gauche à droite ou de droite à gauche.
 +Source : https://fr.wikipedia.org/wiki/Palindrome
 +"""
 +import unicodedata
 +
 +def palindrome(string_to_check):
 +    if string_to_check.lower().replace(' ', '') == string_to_check.lower().replace(' ', '')[::-1]:
 +        return True
 +    else:
 +        return False
 +
 +def remove_accents(input_str):
 +    """
 +    Les lettres accentuées viennent compliquer le problème...
 +    cf. https://stackoverflow.com/questions/517923/what-is-the-best-way-to-remove-accents-normalize-in-a-python-unicode-string
 +    """
 +    nfkd_form = unicodedata.normalize('NFKD', input_str)
 +    return u"".join([c for c in nfkd_form if not unicodedata.combining(c)])
 +
 +
 +string0 = 'Esope reste ici et se repose'
 +print(string0, palindrome(string0))
 +
 +string1 = 'Ésope reste ici et se repose'
 +print(string1, palindrome(string1))
 +
 +print(string1, remove_accents(string1), palindrome(remove_accents(string1)))
 +
 +</code>
 +
 +<code python string-anagramme-00.py>
 +#!/usr/bin/env python3
 +# -*- coding: utf-8 -*-
 +"""
 +Created on Mon Jan 25 11:42:18 2021
 +
 +@author: villersd
 +
 +Une anagramme est un mot ou une expression obtenu en permutant les lettres
 +d'un mot ou d'une expression de départ
 +Source : https://fr.wikipedia.org/wiki/Anagramme
 +"""
 +string1 = 'manoir'
 +string2 = 'romain'
 +
 +print(string1, sorted(string1))
 +print(string2, sorted(string2))
 +
 +# exercice : utiliser cette fonction sorted() et appliquer les transformations
 +# de la fonction de vérification de palindromes pour détecter une anagramme.
 +
 +</code>
 +
 +Pour une technique de détection utilisant les nombres premiers : [[https://mobile.twitter.com/fermatslibrary/status/1385957963429515266]] (programmer et comparer !)
  
 === Références === === Références ===
   * [[https://blog.emacsos.com/unicode-in-python.html|Handling Unicode Strings in Python]]   * [[https://blog.emacsos.com/unicode-in-python.html|Handling Unicode Strings in Python]]
 +  * [[https://realpython.com/python-encodings-guide/|Unicode & Character Encodings in Python: A Painless Guide]], Brad Solomon, Real Python
 +  * [[https://stackoverflow.com/questions/36146214/cannot-convert-unicode-to-utf-8-in-python]]
 ==== Les séquences binaires ==== ==== Les séquences binaires ====
 //Cf.// la [[https://docs.python.org/3/library/stdtypes.html?highlight=encode#binary-sequence-types-bytes-bytearray-memoryview|documentation officielle]] //Cf.// la [[https://docs.python.org/3/library/stdtypes.html?highlight=encode#binary-sequence-types-bytes-bytearray-memoryview|documentation officielle]]
Ligne 170: Ligne 312:
 </code> </code>
  
-  * //range(start, stop, step)// avec des arguments entiers renvoie une liste d'entiers commençant par //start//, incrémentés chaque fois de la valeur //step//, jusque la valeur //stop// exclue.+  * //range(start, stop, step)// avec des arguments entiers renvoie une liste d'entiers commençant par //start//, incrémentés chaque fois de la valeur //step//, jusque la valeur //stop// exclue. FIXME : → generator depuis python 3 !
   * La fonction [[https://docs.python.org/2/library/functions.html#enumerate|enumerate]] permet de parcourir les éléments d'une liste en même temps que leur indice, bien plus pratiquement qu'en passant par l'utilisation de range :    * La fonction [[https://docs.python.org/2/library/functions.html#enumerate|enumerate]] permet de parcourir les éléments d'une liste en même temps que leur indice, bien plus pratiquement qu'en passant par l'utilisation de range : 
  
Ligne 190: Ligne 332:
  
  
-FIXME : piles, files/queues, pop,...+FIXME : piles, files/queues, pop, del li[i], li.clear(), li.insert(ind, item), li.remove(item), li.reverse(),...
  
 === Références === === Références ===
   * [[https://www.datacamp.com/community/tutorials/python-list-comprehension|Python List Comprehension Tutorial]]   * [[https://www.datacamp.com/community/tutorials/python-list-comprehension|Python List Comprehension Tutorial]]
 +  * list comprehension,... : [[https://tgits.github.io/post/notes_apprentissage_python_comprehension/|Notes d'apprentissage de Python : les compréhensions]]
  
 ==== Les tuples ==== ==== Les tuples ====
Ligne 221: Ligne 363:
     print("{} = {}".format(key, val))     print("{} = {}".format(key, val))
 </code> </code>
 +
 +Depuis Python 3.9, l'opérateur | est utilisé pour fusionner les dictionnaires tandis que l'opérateur |= peut être utilisé pour mettre à jour les dictionnaires ([[https://www.python.org/dev/peps/pep-0584/|/pep-0584]].
  
 === Références diverses === === Références diverses ===
Ligne 261: Ligne 405:
  
  
-Consulter la [[https://docs.python.org/2/library/collections.html|documentation officielle]], et ces liens ([[http://pymbook.readthedocs.org/en/latest/collections.html|1]][[https://pymotw.com/2/collections/counter.html|2]], [[https://dzone.com/articles/python-201-whats-a-deque|3]][[https://towardsdatascience.com/the-most-undervalued-standard-python-library-14021632f692|4]])+  * Consulter la [[https://docs.python.org/2/library/collections.html|documentation officielle]], et ces liens 
 +    * [[http://pymbook.readthedocs.org/en/latest/collections.html]] 
 +    * [[https://pymotw.com/2/collections/counter.html] 
 +    * [[https://dzone.com/articles/python-201-whats-a-deque|Python 201: What’s a Deque?]] 
 +    * [[https://towardsdatascience.com/the-most-undervalued-standard-python-library-14021632f692|The Most Undervalued Standard Python Library Collections for data scientists]] Tyler Folkman, Medium, Oct 26, 2019 (video) 
 +    * [[https://levelup.gitconnected.com/introducing-high-performance-datatypes-in-python-with-the-collections-library-3d8c334827a5|Introducing high-performance datatypes in Python with the collections library]] George Seif, Medium, Oct 15, 2019 
 +    * [[https://medium.com/better-programming/your-one-stop-guide-to-collections-in-python-4c0b36243561|Your One-Stop Guide to Collections in Python - Make your code awesome using high-order containers]] Felix Antony, Medium, 21/01/2021
  
 Des types non intégrés par défaut dans Python peuvent facilement être implémentés, en utilisant les types répandus. C'est pas exemple le cas des [[https://fr.wikipedia.org/wiki/Arbre_enracin%C3%A9|arbres]] (informatique, théorie des graphes) : Des types non intégrés par défaut dans Python peuvent facilement être implémentés, en utilisant les types répandus. C'est pas exemple le cas des [[https://fr.wikipedia.org/wiki/Arbre_enracin%C3%A9|arbres]] (informatique, théorie des graphes) :
Ligne 408: Ligne 558:
 </code> </code>
  
 +  * Autres références :
 +    * [[https://towardsdatascience.com/global-local-and-nonlocal-variables-in-python-6b11c20d73b0|Global, Local and Nonlocal variables in Python]]
 +    * [[https://towardsdatascience.com/many-python-programmers-cannot-solve-this-puzzle-c5950841d14d|Many Python Programmers Cannot Solve This Puzzle - A brief introduction to “Python under the hood” for beginners]] Naser Tamimi, Medium, Dec 23, 2020
 ==== Passage d'arguments par tuples et dictionnaires ==== ==== Passage d'arguments par tuples et dictionnaires ====
   * Les arguments d'une fonction peuvent être transmis via un tuple en préfixant le nom du tuple par le symbole * (on utilise en général l'identifiant "*args" pour le tuple)   * Les arguments d'une fonction peuvent être transmis via un tuple en préfixant le nom du tuple par le symbole * (on utilise en général l'identifiant "*args" pour le tuple)
Ligne 484: Ligne 637:
   * [[https://chrisyeh96.github.io/2017/08/08/definitive-guide-python-imports.html|The Definitive Guide to Python import Statements]]   * [[https://chrisyeh96.github.io/2017/08/08/definitive-guide-python-imports.html|The Definitive Guide to Python import Statements]]
   * [[https://realpython.com/absolute-vs-relative-python-imports/|Absolute vs Relative Imports in Python]]   * [[https://realpython.com/absolute-vs-relative-python-imports/|Absolute vs Relative Imports in Python]]
 +  * [[https://medium.com/dev-genius/importing-packages-in-python-fb3f4a64ed14|Importing Packages in Python - Exploring different ways to import packages in Python]] Indhumathy Chelliah, Medium, Oct 24, 2020
 +  * [[https://medium.com/techtofreedom/3-key-skills-for-handling-modules-in-python-d644c5e5682|3 Key Skills for Handling Modules in Python]] by Yang Zhou, TechToFreedom, Mar, 2021, Medium
 +
   * ...   * ...
  
Ligne 493: Ligne 649:
 <note tip>Pour bien comprendre l'utilité de ce test, décompressez les 4 fichiers python de {{:teaching:progappchim:if_name_main_.zip|cette archive}}, étudiez-les et faites les fonctionner !</note> <note tip>Pour bien comprendre l'utilité de ce test, décompressez les 4 fichiers python de {{:teaching:progappchim:if_name_main_.zip|cette archive}}, étudiez-les et faites les fonctionner !</note>
  
 +Référence :
 +  * [[https://medium.com/better-programming/the-reason-behind-if-name-main-in-python-e633634f0dd0|The Reason Behind if __name__ == ‘__main__’ in Python]]
 ==== Espaces de noms (namespaces) ==== ==== Espaces de noms (namespaces) ====
 Lorsque l'interpréteur Python exécute "import nomdemodule", l'environnement crée un espace de noms "nomdemodule", contenant les variables et fonctions du module nomdemodule, ce qui permet de regrouper ces fonctions et variables sous un préfixe unique et spécifique, qui explique les appels sous la forme "nomdemodule.func1". C'est une garantie pour éviter tout conflit entre des fonctions portant des noms identiques, mais tirées de modules différents. Le prix à payer est de sans cesse devoir expliciter l'espace de nom. Celui-ci peut cependant être condensé lors de la directive d'importations : Lorsque l'interpréteur Python exécute "import nomdemodule", l'environnement crée un espace de noms "nomdemodule", contenant les variables et fonctions du module nomdemodule, ce qui permet de regrouper ces fonctions et variables sous un préfixe unique et spécifique, qui explique les appels sous la forme "nomdemodule.func1". C'est une garantie pour éviter tout conflit entre des fonctions portant des noms identiques, mais tirées de modules différents. Le prix à payer est de sans cesse devoir expliciter l'espace de nom. Celui-ci peut cependant être condensé lors de la directive d'importations :
Ligne 537: Ligne 695:
   * [[http://stackoverflow.com/questions/5082452/python-string-formatting-vs-format]]   * [[http://stackoverflow.com/questions/5082452/python-string-formatting-vs-format]]
   * [[http://www.python-course.eu/python3_formatted_output.php]]   * [[http://www.python-course.eu/python3_formatted_output.php]]
 +  * [[https://k3no.medium.com/print-in-python-389aea412c1f|Print() in Python - A guide to printing and formatting your scripts output]] Keno Leon, Medium, Feb 8, 2020
  
 ===== Lire et écrire dans des fichiers ===== ===== Lire et écrire dans des fichiers =====
Ligne 556: Ligne 715:
 <note tip>Les données de tout type devant être transformées en chaînes de caractères, il n'est pas aisé de stocker dans des fichiers des données composites comprenant des entiers, listes, dictionnaires,... Dans ce cas, une des solutions les plus simples consiste à utiliser le module json codant et décodant les données dans le format répandu [[http://fr.wikipedia.org/wiki/JavaScript_Object_Notation|JSON]].</note> <note tip>Les données de tout type devant être transformées en chaînes de caractères, il n'est pas aisé de stocker dans des fichiers des données composites comprenant des entiers, listes, dictionnaires,... Dans ce cas, une des solutions les plus simples consiste à utiliser le module json codant et décodant les données dans le format répandu [[http://fr.wikipedia.org/wiki/JavaScript_Object_Notation|JSON]].</note>
  
-Pour en savoir plus, consultez la page [[https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files]].+==== Références ==== 
 +  * Pour en savoir plus, consultez la page [[https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files]]. 
 +  * [[https://medium.com/better-programming/a-cheat-sheet-on-reading-and-writing-files-in-python-e78297adf413|A Cheat Sheet on Reading and Writing Files in Python - Quick reference on how to read and write files]] Yong Cui, Medium, 13/01/2020 
 +  * [[https://medium.com/techtofreedom/file-handling-in-python-daee4586a64|File Handling in Python]] Yang Zhou, Medium, 25/04/2020 
 +  * [[https://medium.com/code-85/how-to-read-and-write-files-in-python-b2ca7bb2c3f6|How To Read and Write Files in Python - A beginner’s guide to file I/O]] Jonathan Hsu, Medium, Apr 18, 2020 
 + 
  
 ===== Gestion des erreurs ===== ===== Gestion des erreurs =====
Ligne 668: Ligne 833:
   * Noms de classe en [[wp>fr:CamelCase|CamelCase]]   * Noms de classe en [[wp>fr:CamelCase|CamelCase]]
  
 +==== Assignation, copie, "is", "id"... ====
 +FIXME expliquer un peu le fonctionnement du langage et comment les objets sont représentés en interne. + notion mutable/immutable,...
 +  * comparaison == et is ?
 +  * [[https://medium.com/analytics-vidhya/shallow-copy-vs-deep-copy-vs-assignment-in-python-921d7e413a3a|Shallow Copy vs Deep Copy vs Assignment in Python]]
 +  * ...
 ==== Outils de vérification automatique ==== ==== Outils de vérification automatique ====
   * [[https://pycodestyle.readthedocs.io/en/latest/|pycodestyle]]   * [[https://pycodestyle.readthedocs.io/en/latest/|pycodestyle]]
Ligne 675: Ligne 845:
   * [[https://julien.danjou.info/code-style-checks-in-python/|Code Style Checks in Python]]   * [[https://julien.danjou.info/code-style-checks-in-python/|Code Style Checks in Python]]
  
 +==== Conseils divers ====
 +  * [[https://levelup.gitconnected.com/10-python-tips-for-better-code-1bbffde3b44d|10 Python Tips For Better Code]] (Abhay Parashar, Medium, 17/12/2020)
  • teaching/progappchim/notions_fondamentales.1591858641.txt.gz
  • Dernière modification: 2020/06/11 08:57
  • de villersd