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 [2017/01/05 23:43] – [Le type de données texte ou string :] villersdteaching:progappchim:notions_fondamentales [2023/05/03 08:39] (Version actuelle) – [Variables locales et globales] villersd
Ligne 1: Ligne 1:
 ====== Notions fondamentales ====== ====== Notions fondamentales ======
-Aide mémoire synthétique sur le langage Python. Les [[http://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 23: Ligne 23:
  
 ==== Scripts ou programmes Python, où les conserver, et comment les nommer : ==== ==== Scripts ou programmes Python, où les conserver, et comment les nommer : ====
-il est utile de donner des noms de programmes signifiants, d'éviter les espaces et caractères spéciaux dans les noms, d'utiliser systématiquement l'extension ".py" et de les classer en répertoires suivant leur rôle ou utilité (exercice, exemple simple, application de calcul, utilisation graphique, interface,...). Python propose des lignes directrices sur le style d'écriture des programmes, mettant en avant la lisibilité. Il s'agit de la [[https://www.python.org/dev/peps/pep-0008/|pep8]].+il est utile de donner des noms de programmes signifiants, d'éviter les espaces et caractères spéciaux dans les noms, d'utiliser systématiquement l'extension ".py" et de les classer en répertoires suivant leur rôle ou utilité (exercice, exemple simple, application de calcul, utilisation graphique, interface,...). 
 + 
 +Python propose des lignes directrices sur le style d'écriture des programmes, mettant en avant la lisibilité. Il s'agit de la [[https://www.python.org/dev/peps/pep-0008/|pep8]]. Le document du [[https://blog.impulsebyingeniance.io/outils-et-bonnes-pratiques-pour-un-code-python-de-bonne-qualite/|blog ingeniance]] donne les quelques recommandations les plus importantes, en français. Le site Real Python propose un tuto : [[https://realpython.com/python-pep8/|How to Write Beautiful Python Code With PEP 8]] 
 + 
  
 ===== Structures conditionnelles et répétitives ===== ===== Structures conditionnelles et répétitives =====
Ligne 43: Ligne 47:
 En python, une indentation par tabulation (dans les faits 4 espaces) délimite le bloc d'instruction en rapport avec les conditions testées, dont la valeur est évaluée comme "vrai" (true) ou "faux" (false). Exemple : En python, une indentation par tabulation (dans les faits 4 espaces) délimite le bloc d'instruction en rapport avec les conditions testées, dont la valeur est évaluée comme "vrai" (true) ou "faux" (false). Exemple :
  
-<sxh python>+<code python>
 a = 0 a = 0
 if a > 0 : if a > 0 :
Ligne 52: Ligne 56:
 else: else:
     print("a est nul")     print("a est nul")
-</sxh>+</code>
  
 L'utilisation de "elif" est liée à une condition chaînée. L'utilisation de "else" sous-tend une condition alternative. un simple "if" correspond à une expression conditionnelle. L'utilisation de "elif" est liée à une condition chaînée. L'utilisation de "else" sous-tend une condition alternative. un simple "if" correspond à une expression conditionnelle.
Ligne 66: 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) 
 + 
 +Dans quelques cas, il est intéressant d'écrire les instructions conditionnelles sur une seule ligne de code. //Cf.// [[https://towardsdatascience.com/python-if-else-statement-in-one-line-ternary-operator-explained-eca2be64b7cc|Python If-Else Statement in One Line — Ternary Operator Explained - Single-line conditionals in Python? Here’s when to and when NOT to use them]] Dario Radečić, Medium, 11/01/2022 
 + 
  
 ==== Structures répétitives ==== ==== Structures répétitives ====
 L'**instruction while** ([[https://docs.python.org/3/reference/compound_stmts.html#while|documentation officielle]]) Permet d'exécuter des commandes tant que la condition qui suit (éventuellement combinée) est vraie. Exemple : L'**instruction while** ([[https://docs.python.org/3/reference/compound_stmts.html#while|documentation officielle]]) Permet d'exécuter des commandes tant que la condition qui suit (éventuellement combinée) est vraie. Exemple :
  
-<sxh python>+<code python>
 a = 0 a = 0
 while a < 12 : while a < 12 :
     a = a + 1     a = a + 1
-    print a, a**2, a**3 +    print(a, a**2, a**3) 
-</sxh>+</code>
  
 L'**instruction for** ([[https://docs.python.org/3/reference/compound_stmts.html#for|documentation officielle]]) permet d'itérer sur une liste, ou aussi sur les caractères successifs d'une séquence "chaîne de caractères". L'**instruction for** ([[https://docs.python.org/3/reference/compound_stmts.html#for|documentation officielle]]) permet d'itérer sur une liste, ou aussi sur les caractères successifs d'une séquence "chaîne de caractères".
-<sxh python>+<code python>
 for i in range(11): for i in range(11):
-    print i, i**2, i**3 +    print(i, i**2, i**3) 
-</sxh>+</code>
  
 //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
 +  * [[https://towardsdatascience.com/the-art-of-speeding-up-python-loop-4970715717c|The Art of Speeding Up Python Loop]] Casey Cheng, Oct 2022, Towards Data Science
 +
  
 ---- ----
Ligne 107: Ligne 124:
  
 Essayez per exemple aussi de taper ces commandes dans l'interpréteur (idle) Essayez per exemple aussi de taper ces commandes dans l'interpréteur (idle)
-<sxh python>+<code python>
 mot="chimie" mot="chimie"
 print(mot[0]) print(mot[0])
 print(mot[5]) print(mot[5])
 print(mot[6]) print(mot[6])
-</sxh>+</code>
  
   * Concaténation de chaînes : <code>c = "auto" + "mobile"</code>   * Concaténation de chaînes : <code>c = "auto" + "mobile"</code>
   * Longueur (nombre de caractères) d'une chaîne : <code>len(c)</code>   * Longueur (nombre de caractères) d'une chaîne : <code>len(c)</code>
   * 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]]) : 
 +<code python>
 +strings = ['A', 'bac', 'cali', 'jkppl']
 +text = ''.join(strings)
 +print(text)
 +</code>
  
 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, anagrammes et pangrammes ===
 +
 +
 +<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>
 +
 +<code python  string_pangrammes-01.py>
 +#!/usr/bin/env python3
 +# -*- coding: utf-8 -*-
 +"""
 +Created on Mon May  9 11:54:40 2022
 +
 +@author: villersd
 +
 +Test d'une chaîne pour connaître le nombre de lettres de l'apahabet utilisées
 +et si elles le sont toutes (pangramme).
 +ref : https://fr.wikipedia.org/wiki/Pangramme
 +
 +"""
 +import string
 +print('ASCII letters : ', string.ascii_lowercase)
 +
 +# test string :
 +ts = "Portez ce vieux whisky au juge blond qui fume"
 +
 +# dict count strategy
 +letter_count_dict = dict( (key, ts.lower().count(key)) for key in string.ascii_lowercase )
 +print(letter_count_dict)
 +
 +# list count strategy
 +letter_count_list = [ts.lower().count(key) for key in string.ascii_lowercase]
 +print(letter_count_list)
 +
 +# using all()
 +print(all(letter_count_list))
 +
 +# one-liner : 
 +print(all([ts.lower().count(key) for key in string.ascii_lowercase]))
 +print("All ASCII letters : ", all(["Portez ce vieux whisky au juge blond qui fume".lower().count(key) for key in string.ascii_lowercase]))
 +</code>
 +
 +Pour une technique de détection utilisant les nombres premiers : [[https://mobile.twitter.com/fermatslibrary/status/1385957963429515266]] (programmer et comparer !)
 +
 +=== Chaînes préfixées ===
 +Les chaînes pêuvent être préfixées, pour tenir compte de types et d'utilisations particulières :
 +
 +^Prefix  ^Utilisation  ^Exemple  ^
 +|None  |chaîne de caractère habituelle  |"Hello world !"  |
 +|r  |raw string (utilisant plusieurs caractères \ s'échappement)  |print(r"C:\Users\johndoe\documents" |
 +|b  |chaîne binaire  |b"byte string"  |
 +|u  |chaîne unicode  |u"Unicode string"  |
 +|f  |chaîne de formatage fstring  |print(f"My cool string is called {name.upper()}." |
  
 === 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 136: Ligne 339:
   * [[https://docs.python.org/3/library/stdtypes.html#boolean-operations-and-or-not|les opérateurs booléens]]   * [[https://docs.python.org/3/library/stdtypes.html#boolean-operations-and-or-not|les opérateurs booléens]]
   * [[https://docs.python.org/3/library/stdtypes.html#comparisons|les opérateurs de comparaison]]   * [[https://docs.python.org/3/library/stdtypes.html#comparisons|les opérateurs de comparaison]]
 +    * Les 6 opérateurs ==, !=, <, >, <=, >= sont destinés à comparer des valeurs d'objets (cf. les instructions conditionnelles,...)
 +    * Les opérateurs **is** et **is not** sont destinés à comparer l'identité d'objets, en particulier des objets uniques (singletons) du langage, comme **None**
  
 ==== Les listes ==== ==== Les listes ====
Ligne 144: Ligne 349:
   * la fonction del permet d'effacer des éléments   * la fonction del permet d'effacer des éléments
   * Les listes sont des objets sur lesquels on peut agir à l'aide de méthodes, comme .append pour ajouter un élément, .remove pour en enlever. Voir la documentation en ligne (Library Reference - Built-in Objects - Built-in Types - Sequence types - Mutable Sequence types). Exemples :   * Les listes sont des objets sur lesquels on peut agir à l'aide de méthodes, comme .append pour ajouter un élément, .remove pour en enlever. Voir la documentation en ligne (Library Reference - Built-in Objects - Built-in Types - Sequence types - Mutable Sequence types). Exemples :
-<sxh python>+<code python>
 a=[12,15,7,13,21,24,11,13,21,27,5] a=[12,15,7,13,21,24,11,13,21,27,5]
 print(a,len(a)) print(a,len(a))
Ligne 158: Ligne 363:
 a.sort() a.sort()
 print(a,len(a)) print(a,len(a))
-</sxh>+</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** 
  
-<sxh python+<code python> 
-#!/usr/bin/python+#!/usr/bin/env python
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
 """ """
Ligne 170: Ligne 375:
 """ """
 recipients = ['matras', 'erlenmeyer', 'verre à pied', 'ballon', 'bécher'] recipients = ['matras', 'erlenmeyer', 'verre à pied', 'ballon', 'bécher']
-print ', '.join(recipients)+print(', '.join(recipients))
 # méthode "classique" # méthode "classique"
 for i in range(len(recipients)): for i in range(len(recipients)):
-    print 'Récipient # ', i, ' : ', recipients[i]+    print('Récipient # ', i, ' : ', recipients[i])
 # méthode avec enumerate # méthode avec enumerate
 for i,recipient in enumerate(recipients): for i,recipient in enumerate(recipients):
-    print 'Récipient # ', i, ' : ', recipient +    print('Récipient # ', i, ' : ', recipient) 
-</sxh>+</code>
  
  
-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 === 
 +  * [[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]] 
 +  * [[https://towardsdatascience.com/reverse-python-list-ad10ad408021|How To Reverse Python Lists More Efficiently - Efficient reversal of lists in Python]] Giorgos Myrianthous, Medium, 07/10/2022 
  
 ==== Les tuples ==== ==== Les tuples ====
 Analogues aux listes, mais utilisant les parenthèses pour leur écriture, les tuples ne peuvent pas être  Analogues aux listes, mais utilisant les parenthèses pour leur écriture, les tuples ne peuvent pas être 
 modifiés. De ce fait, une méthode [[http://fr.wikipedia.org/wiki/Fonction_de_hachage|fonction de hachage]] peut être appliquée aux tuples, mais pas aux listes, ce qui rend les tuples utilisables comme clés de dictionnaires ou éléments d'ensembles. modifiés. De ce fait, une méthode [[http://fr.wikipedia.org/wiki/Fonction_de_hachage|fonction de hachage]] peut être appliquée aux tuples, mais pas aux listes, ce qui rend les tuples utilisables comme clés de dictionnaires ou éléments d'ensembles.
 +
 +Référence :
 +  * [[https://www.datacamp.com/community/tutorials/python-tuples-tutorial|Python Tuples Tutorial]]
 +  * [[https://towardsdatascience.com/python-tuple-the-whole-truth-and-only-the-truth-hello-tuple-12a7ab9dbd0d|Python Tuple, the Whole Truth, and Only the Truth: Hello, Tuple! - Learn the basics of tuples and of using them]] Marcin Kozak, Towards Data Science (Medium), 21/01/2023
  
 ==== Les dictionnaires ==== ==== Les dictionnaires ====
Ligne 190: Ligne 405:
  
 Un dictionnaire permet de stocker des paires (clé : valeur), où les clés doivent être uniques, non modifiables, et où les valeurs sont n'importe quel objet. Il est délimité par des accolades {}, et les couples clé : valeur sont séparés par des virgules. Au sein de ce couple, le caractère ":" sépare la clé de la valeur. Les éléments peuvent être accédés suivant les clés. Dès qu'on doit utiliser à la fois la clé et la valeur, il est recommandé d'utiliser la fonction //".items()"//, comme ceci : Un dictionnaire permet de stocker des paires (clé : valeur), où les clés doivent être uniques, non modifiables, et où les valeurs sont n'importe quel objet. Il est délimité par des accolades {}, et les couples clé : valeur sont séparés par des virgules. Au sein de ce couple, le caractère ":" sépare la clé de la valeur. Les éléments peuvent être accédés suivant les clés. Dès qu'on doit utiliser à la fois la clé et la valeur, il est recommandé d'utiliser la fonction //".items()"//, comme ceci :
-<sxh python; > 
-dico = {"Nom": "Belgique", "Capitale":"Bruxelles", "Population":11239755, 
-    "Superficie":"30 528 km2", "Monnaie":"Euro"} 
  
-for key,val in dico.items(): +<code python> 
-    print "{} = {}".format(key, val) +#!/usr/bin/env python 
-</sxh>+# -*- coding: utf-8 -*-
  
-Pour les très gros dictionnairesil est préférable de remplacer //".items()"// par la méthode //".iteritems()"//.+dico = {"Nom": "Belgique", 
 +    "Capitale":"Bruxelles", 
 +    "Population":11239755, 
 +    "Superficie":"30 528 km2", 
 +    "Monnaie":"Euro", 
 +    } 
 + 
 +for key, val in dico.items()
 +    print("{} = {}".format(key, val)) 
 +</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 === 
 +  * [[https://www.datacamp.com/community/tutorials/python-dictionary-tutorial]] 
 +  * [[https://medium.com/better-programming/5-advanced-operations-using-dictionaries-in-python-5f8edb4719fa|5 Advanced Operations Using Dictionaries in Python - Better Programming - Medium]]
  
  
Ligne 207: Ligne 434:
   * [[https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset]] (Python 3)   * [[https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset]] (Python 3)
   * [[http://en.wikibooks.org/wiki/Python_Programming/Sets]]   * [[http://en.wikibooks.org/wiki/Python_Programming/Sets]]
 +  * [[https://www.pythoncheatsheet.org/blog/python-sets-what-why-how|Python Sets: What, Why and How]]
  
 <note important>Les éléments d'ensembles doivent être différents (et le rester), donc posséder un caractère [[http://fr.wikipedia.org/wiki/Objet_immuable|immuable]] (ou [[http://en.wikipedia.org/wiki/Immutable_object|immutable]] en anglais), et de là [[http://en.wiktionary.org/wiki/hashable|hachable]].</note> <note important>Les éléments d'ensembles doivent être différents (et le rester), donc posséder un caractère [[http://fr.wikipedia.org/wiki/Objet_immuable|immuable]] (ou [[http://en.wikipedia.org/wiki/Immutable_object|immutable]] en anglais), et de là [[http://en.wiktionary.org/wiki/hashable|hachable]].</note>
Ligne 212: Ligne 440:
 Il est donc plus efficace de tester l'appartenance d'un élément à un ensemble (éventuellement créé au départ d'une liste) plutôt que de tester la présence dans une liste (toute la liste doit être parcourue) : Il est donc plus efficace de tester l'appartenance d'un élément à un ensemble (éventuellement créé au départ d'une liste) plutôt que de tester la présence dans une liste (toute la liste doit être parcourue) :
  
-<sxh python; > +<code python; > 
-li=[4,8,9,1,6,8,4]+li = [4, 8, 9, 1, 6, 8, 4]
 # pas efficace : # pas efficace :
 if 8 in li: if 8 in li:
-    print "8 est dans la liste"+    print("8 est dans la liste")
  
 # efficace : # efficace :
 se=set(li) se=set(li)
 if 8 in se: if 8 in se:
-    print "8 est dans la liste" +    print("8 est dans la liste") 
-</sxh>+</code>
  
 +Références complémentaires :
 +  * [[https://stackoverflow.com/questions/2541752/best-way-to-find-the-intersection-of-multiple-sets|Best way to find the intersection of multiple sets?]]
 ==== D'autres types ==== ==== D'autres types ====
 Des types "haute-performance" sont aussi intégrés à Python, via le module "collections" à importer : Des types "haute-performance" sont aussi intégrés à Python, via le module "collections" à importer :
Ligne 234: Ligne 464:
  
  
-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]]+  * 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 
 +    * [[https://towardsdatascience.com/write-ultra-concise-code-with-python-collections-ab79f03bb54|Write Ultra-Concise Code with Python collections | by Thomas Hikaru Clark | Oct, 2021 | Towards Data Science]] Thomas Hikaru Clark, Medium, 11/10/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 256: Ligne 494:
 ===== Fonctions prédéfinies ===== ===== Fonctions prédéfinies =====
  
-  * input() permet d'entrer des données au clavier. raw_input entre une chaîne de caractères (on peut dans certains cas la convertir par int() ou float()...)+  * input() permet d'entrer des données au clavier. On peut dans certains cas convertir la chaîne rentrée par int() ou float(), selon le type attendu. 
 + 
 +<code python> 
 +li = input("Donnez une température (en °C) ? ") 
 +print(li, type(li)) 
 +temp = float(li) 
 +print(temp, type(temp)) 
 +</code> 
 + 
   * Importer un module de fonctions. Exemples : from math import * --> les fonction abs, sqrt, sin,... deviennent accessibles ! Essayez par exemple ceci :   * Importer un module de fonctions. Exemples : from math import * --> les fonction abs, sqrt, sin,... deviennent accessibles ! Essayez par exemple ceci :
-<sxh python+ 
-a=16 +<code python> 
-print sqrt(a)+a = 16 
 +print(sqrt(a))
 from math import * from math import *
-print sqrt(a) +print(sqrt(a)
-</sxh>+</code>
  
 ==== Veracité/fausseté d'une expression ==== ==== Veracité/fausseté d'une expression ====
Ligne 269: Ligne 517:
 Une expression aboutissant à une valeur logique rend soit 0 ou faux, soit tout autre valeur ou vrai. Cf les rudiments de logique booléenne ! Une expression aboutissant à une valeur logique rend soit 0 ou faux, soit tout autre valeur ou vrai. Cf les rudiments de logique booléenne !
 Essayez : Essayez :
-<sxh python+<code python> 
-a="coucou" +a = "coucou" 
-b="coucou" +b = "coucou" 
-c="cou" +c = "cou" 
-d=(a==b) +d = (a == b) 
-print d +print(d) 
-print int(d) +print(int(d)
-d=(a==c) +d = (a == c) 
-print d +print(d) 
-print int(d) +print(int(d)
-print not(d)+print(not(d))
 ... ...
-</sxh>+</code>
  
 ==== Modules turtle et xturtle ==== ==== Modules turtle et xturtle ====
Ligne 296: Ligne 544:
 Définir une fonction et ses **paramètres** : Définir une fonction et ses **paramètres** :
  
-<sxh python>+<code python>
 def nomdelafonction(liste de paramètres): def nomdelafonction(liste de paramètres):
     ...     ...
     bloc d'instructions indenté     bloc d'instructions indenté
          
-</sxh>+</code>
  
 Les fonctions peuvent n'avoir aucun paramètre, mais ceux-ci sont souvent très utiles pour exécuter les instructions de la fonction. Les fonctions peuvent n'avoir aucun paramètre, mais ceux-ci sont souvent très utiles pour exécuter les instructions de la fonction.
Ligne 308: Ligne 556:
  
 Exemple (réalisable en mode interactif) : Exemple (réalisable en mode interactif) :
-<sxh python+<code python> 
-def plus(a,b): +def plus(a, b): 
-    return a+b+    return a + b
 ... ...
-x=plus(3,9)+x = plus(3,9)
 print(x) print(x)
 plus(x,8) plus(x,8)
-</sxh>+print(x) 
 +</code>
  
 <note important> <note important>
Ligne 334: Ligne 583:
 Il est dangereux d'utiliser dans les grands programmes des variables globales, et il est préférable de n'utiliser que des variables locales et de transmettre explicitement via les paramètres de la fonction tout ce qui est extérieur et peut lui être utile. Sinon, il y a un risque de perturber le fonctionnement de la fonction à cause d'une modification non attendue de la variable globale. Il est dangereux d'utiliser dans les grands programmes des variables globales, et il est préférable de n'utiliser que des variables locales et de transmettre explicitement via les paramètres de la fonction tout ce qui est extérieur et peut lui être utile. Sinon, il y a un risque de perturber le fonctionnement de la fonction à cause d'une modification non attendue de la variable globale.
  
-//Cf.// [[http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-python/portee-des-variables-et-references]]+Pour obtenir un dictionnaire des variables globales ou locales à une portée donnée (scope) du code, il suffit d'utiliser les méthodes "globals()" et "locals()"
 + 
 +//Cf.// [[http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-python/portee-des-variables-et-references]], [[http://python-textbok.readthedocs.io/en/1.0/Variables_and_Scope.html]]
  
 Tester aussi ce code : Tester aussi ce code :
-<sxh python; title : variables_locales_globales.py>+<code python variables_locales_globales.py>
 #!/usr/bin/env python #!/usr/bin/env python
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
  
 def chipote(in1): def chipote(in1):
-    in1 = in1+5+    in1 = in1 + 5
     print("in1 =", in1," dans chipote")     print("in1 =", in1," dans chipote")
     print("a=",a," dans chipote")     print("a=",a," dans chipote")
-    b=8+    b = 8
     print("b=",b," dans chipote")     print("b=",b," dans chipote")
-    c=a+10+    c = a + 10
     print("c=",c," dans chipote")     print("c=",c," dans chipote")
-    e=b+in1+    e = b + in1
     print("e=",e," dans chipote")     print("e=",e," dans chipote")
     li.append(b)     li.append(b)
     global f     global f
-    f=f+20+    f = f + 20
  
-li=[1,2,3] +li=[1, 2, 3] 
-b=4 +b = 4 
-a=5 +a = 5 
-f=13+f = 13
 print("f=",f) print("f=",f)
 chipote(a) chipote(a)
Ligne 366: Ligne 617:
 print(li) print(li)
 print("f=",f) print("f=",f)
-</sxh>+</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
 +    * [[https://tonylixu.medium.com/python-different-ways-to-call-function-e6f37bafefcf|Python — Different Ways to Call Function
 +How to call a function in Python?]] Tony, Medium, 19/04/2023
 ==== 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)
   * Les arguments d'une fonction peuvent être transmis via un dictionnaire dont les clés correspondent aux arguments nommés dans la définition de la fonction, en préfixant le nom du dictionnaire par les %%**%% (on utilise en général l'identifiant "%%**%%kwargs" pour le dictionnaire)   * Les arguments d'une fonction peuvent être transmis via un dictionnaire dont les clés correspondent aux arguments nommés dans la définition de la fonction, en préfixant le nom du dictionnaire par les %%**%% (on utilise en général l'identifiant "%%**%%kwargs" pour le dictionnaire)
 +  * cf. [[https://towardsdatascience.com/args-kwargs-python-d9c71b220970|*args and **kwargs in Python - Discussing the difference between positional and keyword arguments and how to use *args and **kwargs in Python]] Giorgos Myrianthous, Towards Data Science, Jun 22 2022
  
 === Passage par tuple === === Passage par tuple ===
-<code python fonction_args_tuple.py3>+<code python fonction_args_tuple.py>
 #!/usr/bin/env python #!/usr/bin/env python
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
Ligne 392: Ligne 649:
  
 === Passage par dictionnaire === === Passage par dictionnaire ===
-<code python fonction_args_dictionnaire.py3>+<code python fonction_args_dictionnaire.py>
 #!/usr/bin/env python #!/usr/bin/env python
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
Ligne 422: Ligne 679:
 plat : poularde plat : poularde
 </code> </code>
 +
 +Références :
 +  * [[https://medium.com/@mikehuls/python-args-kwargs-and-all-other-ways-to-pass-arguments-to-your-function-bd2acdce72b5|Python args, kwargs, and All Other Ways to Pass Arguments to Your Function - Expertly design your function parameters in 6 examples]] Mike Huls, Medium, 07/03/2023
 +  * [[https://python.plainenglish.io/args-and-kwargs-in-python-demystified-317fb1961720|*args And **kwargs In Python Demystified | by Liu Zuo Lin | Mar, 2023 | Python in Plain English]] Liu Zuo Lin, Medium, 26/03/2023
 ===== Modules de fonctions ===== ===== Modules de fonctions =====
 Des fonctions ou simplement des déclarations de variables peuvent être définies et regroupées dans un fichier (.py), et ensuite renseignées pour leur utilisation dans un programme grâce à la directive d'importation. Des fonctions ou simplement des déclarations de variables peuvent être définies et regroupées dans un fichier (.py), et ensuite renseignées pour leur utilisation dans un programme grâce à la directive d'importation.
Ligne 440: Ligne 701:
  
   * from nomdemodule import func13   * from nomdemodule import func13
 +
 +Références :
 +  * [[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://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
 +
 +  * ...
  
 ==== Test sur le programme "main" ==== ==== Test sur le programme "main" ====
Ligne 448: Ligne 717:
 <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 481: Ligne 752:
  
 Depuis Python 2.6, le langage a introduit la méthode .format() qui est plus sophistiquée et ne présente pas les défauts des techniques utilisant les "%" ! (FIXME : écrire une page spécifique). Depuis Python 2.6, le langage a introduit la méthode .format() qui est plus sophistiquée et ne présente pas les défauts des techniques utilisant les "%" ! (FIXME : écrire une page spécifique).
 +
 +→ [[print_format|Impressions avec la méthode .print()]]
 +
 +FIXME **intégrer f-string !**: cf. 
 +  * [[https://datawhatnow.com/things-you-are-probably-not-using-in-python-3-but-should/]] (f-strings vs format)
 +  * [[https://python.plainenglish.io/become-a-master-of-string-formatting-in-python3-252334a8269a|Become a Master of String Formatting in Python3]] by Maxence LQ, Python in Plain English, 25/05/2021
 +  * [[https://ibexorigin.medium.com/have-mercy-on-yourself-and-learn-these-9-everyday-python-f-string-codes-e8104677d7c7|Have Mercy on Yourself And Learn These 9 Everyday Python f-string Codes]] Bex. T., Medium, 14/03/2023
 +
  
 Références : Références :
Ligne 488: Ligne 767:
   * [[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 498: Ligne 778:
 Une fois l'utilisation achevée du fichier, il est important de fermer le fichier par la commande "f.close()" des erreurs peuvent subvenir sur le système de fichier si ce n'est pas fait correctement pour les fichiers en écriture surtout. Une fois l'utilisation achevée du fichier, il est important de fermer le fichier par la commande "f.close()" des erreurs peuvent subvenir sur le système de fichier si ce n'est pas fait correctement pour les fichiers en écriture surtout.
  
-Il est recommandé d'ouvrir le fichier en utilisant la commande "with", qui garantit la fermeture du fichier après exécution du code indenté, même en cas d'erreur : +**Il est recommandé d'ouvrir le fichier en utilisant la commande "with", qui garantit la fermeture du fichier après exécution du code indenté, même en cas d'erreur** 
  
-<sxh python>+<code python>
 with open("fichier.txt", "r") as fic: with open("fichier.txt", "r") as fic:
     contenu_fic = fic.read()     contenu_fic = fic.read()
-</sxh>+</code>
  
 <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 =====
 +FIXME
 +
 +  * Try ... Except :
 +    * [[https://medium.com/better-programming/how-to-start-using-try-statements-in-python-5043fe69058d]]
 +    * [[https://medium.com/@niklas_lang/exception-handling-in-python-8cc8f69f16ad|Exception Handling in Python. Understanding how to use Python Try… ]] by Niklas Lang, October 2022, Towards Data Science
 +  * https://realpython.com/python-keyerror/
 +  * ...
  
 ===== Gestion de l'encodage des caractères en Python ===== ===== Gestion de l'encodage des caractères en Python =====
-Le système de codage des caractères a considérablement évolué. Aux débuts de l'informatique, le codage était initialement limité à l'[[http://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange|ASCII]] sur 7 bits avec 128 caractères possibles, ne permettant donc d'écrire valablement qu'en anglais, sans caractères spéciaux, sans lettres accentuées. Écrire des programmes en Python (ou dans d'autres langages) en utilisant exclusivement ces caractères est une façon simple d'éviter toute difficulté.+Le système de codage des caractères a considérablement évolué. Aux débuts de l'informatique, le codage était initialement limité à l'[[wp>fr:American_Standard_Code_for_Information_Interchange|ASCII]] sur 7 bits avec 128 caractères possibles, ne permettant donc d'écrire valablement qu'en anglais, sans caractères spéciaux, sans lettres accentuées. Écrire des programmes en Python (ou dans d'autres langages) en utilisant exclusivement ces caractères est une façon simple d'éviter toute difficulté.
  
-Cette limitation a donné lieu à des encodages parfois bricolés, propriétaires et mal conçus pendant plusieurs décennies, et dont il subsiste encore des traces dans de nombreux logiciels et documents sauvegardés. Citons pour ce qui concerne l'Europe de l'ouest les encodage [[http://fr.wikipedia.org/wiki/Windows-1252|cp1252]], applemac et [[http://fr.wikipedia.org/wiki/Latin1|Latin1]] (ou iso8859-1). Ces encodages permettent quelques caractères supplémentaires, mais ne sont pas satisfaisants.+Cette limitation a donné lieu à des encodages parfois bricolés, propriétaires et mal conçus pendant plusieurs décennies, et dont il subsiste encore des traces dans de nombreux logiciels et documents sauvegardés. Citons pour ce qui concerne l'Europe de l'ouest les encodage [[wp>fr:Windows-1252|cp1252]], applemac et [[wp>fr:Latin1|Latin1]] (ou iso8859-1). Ces encodages permettent quelques caractères supplémentaires, mais ne sont pas satisfaisants.
  
-Une solution universelle aux difficultés d'encodage a été de créer une norme définissant les caractères utilisables au niveau mondial, l'unicode, permettant de décrire des dizaines de milliers de caractères différents, et d'un encodage efficace pour les usages majoritaires ([[http://fr.wikipedia.org/wiki/Utf-8|UTF-8]] pour la plupart des pays utilisant des caractères latins, et UTF-16 pour les autres).+Une solution universelle aux difficultés d'encodage a été de créer une norme définissant les caractères utilisables au niveau mondial, l'unicode, permettant de décrire des dizaines de milliers de caractères différents, et d'un encodage efficace pour les usages majoritaires ([[wp>fr:Utf-8|UTF-8]] pour la plupart des pays utilisant des caractères latins, et UTF-16 pour les autres).
  
 Il est recommandé de spécifier les caractères utilisés pour le codage du programme via une ligne à placer en début de programme, comme une des suivantes par exemple : Il est recommandé de spécifier les caractères utilisés pour le codage du programme via une ligne à placer en début de programme, comme une des suivantes par exemple :
Ligne 525: Ligne 819:
 </code> </code>
  
-Les mots-clés du langage n'utilisent que les caractères du jeu historique ASCII. Un programme Python peut utiliser des chaînes de caractère utilisant un codage sur plus d'un octet (unicode). Python 3 utilisant des techniques différentes de Python 2 pour cela, et vu l'obsolescence progressive de cette dernière branche, les traitements particuliers de codage/décodage ne seront pas explicités. Sinon, //cf.// [[http://www.pythoncentral.io/python-unicode-encode-decode-strings-python-2x/|cette référence]].+Les mots-clés du langage n'utilisent que les caractères du jeu historique ASCII. Un programme Python peut utiliser des chaînes de caractère utilisant un codage sur plus d'un octet (unicode). Python 3 utilisant des techniques différentes de Python 2 pour cela, et vu l'obsolescence de la branche 2, les traitements particuliers de codage/décodage ne seront pas explicités. 
 + 
 +==== Références ==== 
 + 
 +  * [[http://www.pythoncentral.io/python-unicode-encode-decode-strings-python-2x/]] (2013) 
 +  * [[https://realpython.com/courses/python-unicode/|Unicode in Python: Working With Character Encodings (9 Lessons)]], Real Python, Christopher Trudeau (2020) 
 + 
  
 ===== La complexité algorithmique ===== ===== La complexité algorithmique =====
Ligne 559: Ligne 860:
 ===== Introspection ===== ===== Introspection =====
 Un programme Python peut s'examiner lui-même : Un programme Python peut s'examiner lui-même :
-<sxh python; title : test-introspection.py>+<code python test-introspection.py>
 #!/usr/bin/env python #!/usr/bin/env python
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
Ligne 576: Ligne 877:
  
 print(__doc__) print(__doc__)
-</sxh>+</code>
  
 ===== Lignes directrices pour l'écriture de code Python ===== ===== Lignes directrices pour l'écriture de code Python =====
Ligne 585: Ligne 886:
 ==== Espaces ==== ==== Espaces ====
   * Entourer les opérateurs d'espaces, sauf pour des groupements mathématiques et dans les arguments/paramètres de fonctions,  et pas à l’intérieur de parenthèses, crochets ou accolades. Exemples :   * Entourer les opérateurs d'espaces, sauf pour des groupements mathématiques et dans les arguments/paramètres de fonctions,  et pas à l’intérieur de parenthèses, crochets ou accolades. Exemples :
-<sxh python>+<code python>
 variable = 'valeur de variable' variable = 'valeur de variable'
 if a == b: if a == b:
Ligne 593: Ligne 894:
 def fonction(arg='val'): def fonction(arg='val'):
 [x**2 for x in range(20)] [x**2 for x in range(20)]
-</sxh>+</code>
  
 ==== Retours à la ligne ==== ==== Retours à la ligne ====
Ligne 610: Ligne 911:
   * utiliser uniquement des minuscules et le caractère de soulignement (underscore "_") pour les modules, variables, fonctions et méthodes   * utiliser uniquement des minuscules et le caractère de soulignement (underscore "_") pour les modules, variables, fonctions et méthodes
   * Pour les "constantes" : majuscules et underscore   * Pour les "constantes" : majuscules et underscore
-  * Noms de classe en [[http://fr.wikipedia.org/wiki/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 ====
 +  * [[https://pycodestyle.readthedocs.io/en/latest/|pycodestyle]]
 +  * [[https://github.com/PyCQA/pyflakes|pyflakes]]
  
 +Référence :
 +  * [[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)
 +  * [[https://somacdivad.medium.com/3-tips-for-writing-pythonic-code-b090956a6107|3 Tips For Writing Pythonic Code]] David Amos, Medium, 17/03/2022
 +  * [[https://realpython.com/learning-paths/writing-pythonic-code/|Write More Pythonic Code - Learning Path ⋅ Skills: Best Practices, Writing Idiomatic Python]] (Real Python)
  • teaching/progappchim/notions_fondamentales.1483656202.txt.gz
  • Dernière modification : 2017/01/05 23:43
  • de villersd