Python - Apprendre à programmer en Python

../aubade/lecon-139.jpg

Éditée le : 2020-12-20

../images/warning.gif A compter de la version 2021.01 tous les appels à la bibliothèque use se feront par go.

Apprendre à programmer en Python

Notre propos est de voir rapidement et succinctement comment élaborer des programmes en Python

Table des matières

Table des matières ici

 

Pourquoi Python

Parce que ...:

c'est à date (fin 2020) le language à la mode

c'est un language freeweare dès son origine

soutenu par une grande communauté

c'est un language interprété comme javascript ou visual basic

il est  facile à debugger (interpréteur)

il est également possible de le pré-compiler comme java

il est possible de créer des programmes exécutables indépendant de votre installation Python, comme en visual basic

il est multi-plateforme, windows, unix, lunix, mac, os, android, iOS...
../images/warning.gif l'utilisation de bibliothèques spécifiques reste toutefois nécessaire pour chaque environnement.

les scripts Python sont de plus en plus utilisés sur les serveurs web à l'instar de php

le langage est plutôt naturel, proche du langage humain, quoique!

il est possible d'y adjoindre de nombreuses bibliothèques et de créer ses propres bibliothèques.

...

Notre but

Pouvoir rapidement et simplement programmer de petits utilitaires et les distribuer à nos amis.

Tout au long de cet article nous allons nous appuyer sur l'ancien site du zero, https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python

Le site de https://openclassrooms.com/fr se veut très pédagogique et nous guidera au travers multiples exemples sur la façon de programmer en Python.

Pour notre part notre objectif est de tester rapidement les possibilités d'un développement en Python.

Notre article ne cherche pas vraiment la pédagogie mais plutôt d'aller à l'essentiel pour mettre en place un environnement de travail avec Python.

Créer un environnement de travail

Installation de Python

Nous sommes sous windows 10

Python s'installe de maière classique une fois récupérer la dernière version sur le web

Lors de l'installation choisir personnalisé, ne pas accepter l'installation par défaut

Ceci pour 2 raisons

Une fois l'installation de Python terminée chercher dans votre ordinateur un fichier cmd.exe, copier le, et coller sa copie dans le dossier d'installation de Python
Ne pas couper coller le fichier cmd.exe ou coller un raccourci; c'est bien une copie du fichier cmd.exe qu'il faut copier dans le dossier d'installation de Python

Un fois ce cmd.exe copier dans le dossier d'installation de Python, lancer ce fichier depuis le dossier d'installation de Python.

cela ouvre une fenêtre Dos (console Dos) avec pour dossier par défaut votre dossier d'installation de Python (soit c:\Python pour nous)

Depuis cette fenêtre taper

python --version (suivi de la touche entrée)

puis

pip --version (suivi de la touche entrée)

normalement la fenêtre vous répond en spécifiant

le numéro de version de Python si Python est effectivement installé

le numéro de version de pip si la bibliothèque pip est installée; elle est généralement fournie par défaut avec Python

 

Bibliothèque externe disponible depuis le web

Depuis le dossier d'installation de Python, pour mémoire pour nous c'est c:\Python

lancer une copie de cmd.exe que vous aurez préalablement copier dans ce dossier

Dans les exemples suivant theBibliotheque est le nom de la bibliothèque à installer, mettre à jour ou déinstaller

Ces codes suppose que Python soit installer avec la création d'une variable d'environnement, très fortement recommandé!

installation d'une bibliothèque

pip install theBibliotheque

Mise à jour, actualisation

pip install theBibliotheque -upgrade

désintallation, retrait de la bibliothèque

pip uninstall theBibliotheque

Bibliothèque pour créer un exe cx-Freeze

Cette bibliothèque permet de générer un fichier exe à partir d'un fichier py, voire d'un fichier d'installation en msi

Pour installer la bibliothèque cx_freeze faire depuis votre console Dos

python -m pip install cx_Freeze --upgrade

Pour vérifier que cx_Freeze est bien installé, faire

cx_Freeze --version

Si cx_Freeze est bien installé, vous obtiendrez le n° de version

 

Pour concevoir vos programmes sous Python vous avez accès à 2 types de console:

 

Bibliothèque de gestion de Disk wmi

La bibliothèque wmi permet de gérer vos disques (disk dur ou USB, voire carte SD) ../images/warning.gif sous Windows uniquement .
Pour les autres système d'exploitation il vous faudra une bibliothèque spécifique à chacun de ces système d'exploitation!
pip install wmi
Pour tester son installation, lancer dans votre console Python ces quelques lignes:
import wmi
c = wmi.WMI()
for os in c.Win32_OperatingSystem():
    print os.Caption

Elle doit alors lors de son exécution le nom de votre sustème d'exploitation

Bibliothèque Graphique wxPython

Cette bibliothèque est une bibliothèque Graphique; elle permet de créer et gérer des fenêtres, menus, barres d'icone sous plusieurs OS

pip install -U wxPython

https://www.wxpython.org/

Pour tester son installation, depuis votre console msDos sous le dossier d'installation de Python (c:\Python\cmd.exe)

wxget

 

Bibliothèque clipboard pyperclip

La bibliothèque pyperclip permet une gestion simplifiée du presse-papier (copier coller) en mode texte

Pour l'installer faire

pip install Pyperclip

Son utilisation reste des plus simple et permet de plus de tester son installation correcte.

import pyperclip # gestion simple presse-papier en mode texte;
texte = "un texte"
pyperclip.copy(texte) # copy dans le presse-papier en tant que texte
spam = pyperclip.paste() # colle depuis le presse-papier en tant que texte dans la variable spam
print(spam) # pour test final

Nous avons testé avec un tableur, fonctionne bien dans les 2 sens,
récupère la valeur texte du presse-papier
ou permet un collage du presse-papier dans une cellule du texte; dito avec les éditeurs de texte à notre disposition.

Pour autant cette bibliothèque ne permet pas à priori d'action graphique avec le presse-papier.

 

L'interpréteur de commande

Comme son nom l'indique vous pourrez saisir dans ce module vos commandes.

Une fois ouvert ce module présente les lignes suivantes:

Python 3.9.1 (tags/v3.9.1:1e5d33e, Dec  7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

Vous devez saisir votre ligne de commande après les >>>

comme ceci:

Python 3.9.1 (tags/v3.9.1:1e5d33e, Dec  7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print("hello")

Si vous appuyer sur entrée vous obtenez:

Python 3.9.1 (tags/v3.9.1:1e5d33e, Dec  7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print("hello")
hello
>>>

L'interpréteur de commande a écrit dans sa console le résultat de votre ligne de commande, à savoir hello

et attend une nouvelle instruction >>>

Ce dispositif est très pratique pour tester de petites lignes de commandes, mais il ne conviendra pas pour l'écriture d'un programme plus ambitieux

D'autre part il ne permet pas de sauvegarde du code source de votre programme.

../images/warning.gif Il n'est possible de copier coller les lignes de commande que une par une; pas de coller de plusieurs lignes de commande simultanément.

La console IDLE

Si vous l'ouvrez directement sans appel à un fichier *.py vous obtenez un fonctionnement identique à l'interpréteur de commande.

Pour modifier ce comportement:

  1. enregistrer un fichier via le menu "fichier" "save" 
    donner lui un nom, par exemple "essai.py"
    Ce fichier sera vide. 
  2. fermer votre console IDLE 
  3. Ouvrez à nouveau la console IDLE et faite "open" 
  4. choisissez votre fichier vide "essai.py" 
  5. une nouvelle console s'ouvre avec votre fichier et maintenant un menu run apparaît. 
  6. ce menu run vous permettra de lancer votre fichier "essai.py" dès que vous y aurez entrez des instructions, des lignes de commande 
  7. commencer par supprimer toute l'entête qui apparaît (CTRL+A puis suppr) 
  8. puis insérer une ligne de commande
    par exemple
    print("hello")
    faite entrée, (appuyé sur la touche entrée, retour chariot) 
  9. lancer le menu run - run Module
    le programme vous propose d'enregistrer les modifications. 
  10. Une nouvelle console s'ouvre pour afficher le résultat.

Un peu fastidieux.

Vous pouvez via le bloc note de windows créer un fichier "essai.py" et l'ouvrir dans la console IDLE,
ainsi vous arrivez directement à l'étape 8 de notre précédente liste

Utiliser notepad ++

cet éditeur fonctionne comme le bloc note de windows en plus puissant toutefois.

Préparation de notepad++

Dans son installation rechercher le fichier "shortcuts.xml"

voici notre fichier "shortcuts.xml"

 

 Nous allons nous intéresser aux lignes relatives à Python à savoir:

               <Command name="---Python-------" Ctrl="yes" Alt="yes" Shift="yes" Key="">&quot;&quot;</Command>
                <Command name="Launch in Python" Ctrl="yes" Alt="yes" Shift="yes" Key="80">powershell.exe -noexit -command . \"$(FULL_CURRENT_PATH)\"</Command>
                <Command name="Launch in Python  B" Ctrl="yes" Alt="yes" Shift="yes" Key="80">&quot;$(FULL_CURRENT_PATH)&quot;</Command>
                <Command name="Console IDLE Python" Ctrl="yes" Alt="yes" Shift="yes" Key="67">C:\Python\pythonw.exe "C:\Python\Lib\idlelib\idle.pyw" "$(FULL_CURRENT_PATH)" </Command>
                <Command name="Console IDLE Python PowerShell" Ctrl="yes" Alt="yes" Shift="yes" Key="67">powershell.exe "C:\Python\Lib\idlelib\idle.pyw" "$(FULL_CURRENT_PATH)" </Command>
                

La première ligne ne sert à rien, juste à indiquer que les lignes suivantes concernent Python

la deuxième ligne "Launch in Python" lance notre fichier py en cours dans la console python

la troisième ligne "Launch in Python  B" a le même effet si py est associé au programme python
son action est donc identique à un double click sur le fichier.py

la quatrième ligne "Console IDLE Python" ouvre la console IDLE avec le fichier py en cours d'édition dans notepad++
le menu run permet alors de l'éxécuter.

la 5ième ligne a le même effet que la 4ième, mais elle enregistre le fichier py avant l'appel de la console python IDLE

le principe est le suivant:

"$(FULL_CURRENT_PATH)" est une variable d'environnement de notepad++ qui fournit le chemin complet du fichier en cours d'édition sous notepad++

cette instruction est précédée du code appelant du programme à exécuter et auquel on doit transmettre le fichier en cours d'édition.

key est un code fournissant un raccourci clavier pour lancer cet ordre.

Le fichier shortcuts.xml vient modifier le menu Execution de notepad++ qui est configurable via ce biais.

 

../images/warning.gif Le fichier shortcuts.xml ne doit pas être modifier avec notepad++, mais plutôt avec le bloc note de windows pour éviter tout conflit.
En effet  shortcuts.xml vient modifier les menu de notepad++ !

Insérer ces lignes dans votre fichier  shortcuts.xml
au besoin modifier le  code appelant du programme à exécuter selon votre propre installation de Python
Vous pouvez vous aider des raccourcis créés lors de l'installation de Python

Une fois ces modifications effectuées vous êtes prêt à travailler avec Python et notepad++
Vous bénéficier ainsi de la puissance de l'éditeur notepad++
Vous pouvez tester votre programme py directement dans la console ou encore via la console IDLE (la 4ième ligne ou 5ième ligne)
cette dernière option est la plus pertinente car elle permet de modifier votre fichier py en cours de test et de récupérer les modifications dans notepad++

../images/warning.gif avant de lancer votre fichier py dans la console Python, penser à l'enregistrer.

Enregistrement auto si perte focus

Sous Notepad++ aller dans le menu "Modules d'extension", puis "gestionnaire des modules d'extension"

aller dans l'onglet disponible

Installer le module "AutoSave"

Puis revenir dans le menu "Modules d'extension", AutoSave apparaît dans ce menu, cliquez sur ces options et cocher la case "Notepadd++loses focus"

sélectionner "current file only"...

 

Réglage indentation pour Python

Pour Python il est recommandé de remplacer les tabulations par des espaces (4 espaces pour une tabulation)

Pour ce faire aller dans le menu "Paramètres", puis le sous menu "Préférences"

Vérifier que à droite dans la partie Tabulation, Python soit bien avec Taille:4 et insérer des espaces.

 

Créer vos fichiers Python avec notepad++

une fois votre fichier shortcuts.xml modifier, enregistrer le et fermer notepad; reouvrez notepad++

  1. ouvrer ou créer un nouveau fichier
    si nouveau fichier, lui donner une extension py, exemple "essai.py" 
  2. commencer à saisir vos lignes de code
  3. puis via le menu  Execution de notepad++choisissez une des options pour lancer Python, soit en console via le programme "powershell.exe", soit en console IDLE

../images/warning.gif avant de lancer votre fichier py dans la console Python, penser à l'enregistrer.

../images/idea.png Si vous lancer la console IDLE, vous pouvez modifier directement votre fichier py
et retrouver ces modifications dans notepad++

Même si cette méthode demande plus de préparation suite à la modification du fichier  shortcuts.xml
cette méthode est ensuite la plus rapide et la plus puissante

Nous préconisons  donc l'utilisation de notepad++

Précautions avec la console

En fait ces précautions ne sont pas spécifiques à notepad++, mais à tous les éditeurs de textes externes ainsi qu'à la console Python.

La console IDLE ouvre le fichier py et permet de le lancer.

Par contre un double click sur un fichier py appelle la console Python, et non pas la console IDLE

le fichier est alors instantanément exécuté lors de ce double click.

ceci peut être très rapide et la console python se ferme sans que l'utilisateur ne voit quoi que ce soit.

Pour éviter ceci nous pouvons par exemple demander à notre programme de marquer une pause

Pour cela il faut utiliser par exemple:

os.system("pause") # propose une pause et demande d'appuyer sur n'importe qu'elle touche pour poursuivre.

ou encore demande à l'utilisateur de compléter une saisie via une boite de dialogue.

Trame d'un fichier Python

Ces quelques lignes vont constituer un squelette de base pour nos futurs fichiers Python.

Elles tiennent compte de nos précédentes remarques.

""" Squelette d'un fichier Python
encodage utf-8
"""


# -*- coding: utf-8 -*-

import os # import des fonctions de la bibliothèque python Operating System intégrée à Python
import random
# import fonctions hasard, aléatoire, intégrée à Python
import math
# import fonctions mathématique intégrée à Python

# votre code ici

os.system("pause") # propose une pause et demande d'appuyer sur n'importe qu'elle touche pour poursuivre.

 

En bleu une description du rôle de ce fichier Python, les fonctions intégrées... En fait c'est un commentaire d'un type particulier.

en rouge l'encodage des caractères accentués

en rose les imports des bibliothèques

en noir vos lignes de commandes

en vert la mise en pause du programme qui demande l'appui sur une lettre pour continuer,
ce qui vous laisse le temps de visualiser le résultat de votre code

en orange et commençant par # les commentaires

Ces lignes seront la base de notre fichier Trame.py

 

Créer un fichier exécutable

Python permet de créer un fichier.exe sous windows ou tout autre exécutable sous unix...

Pour cela il faut utiliser la bibliothèque cxfreeze

Ensuite dans votre dossier de travail, celui qui contient vos fichiers.py, copier coller un fichier cmd.exe

lancer ce fichier cmd.exe depuis votre dossier de travail

Nous avons plusieurs options pour générer un exe

Pour tester tout cela Download exemaker.7z

Ce zip contient tous les fichiers nécessaires au test, notamment le fichier setup.py qui permet

 

Pense bête

partie entière d'une division: 10//3 =>3

modulo, reste d'une division: 10%3 => 1 et non pas 0,33...; en fait 10 = 3*3 +1; reste donc 1

échapement du caractère ' ou "
v = 'j\'aime'
v = "je cite \"vous êtes...\" dans ce texte"
l'échappement se fait via un anti-slash ALTGR+8 \

Permutation de variables
a,b = b,a # a prend la valeur de b et inversement

x=y=3 # affecte la valeur 3 à x et à y

écriture d'une variable sur plusieurs lignes
a + b \
+ c => a+b+c avec un anti-slash pour sauter à la ligne suivante

Type d'une variable
type(a) => int, float, str

Conditions
if a>0:
   #
elif a = 0: # on peut mettre plusieurs elif
   #
else:
   # sera toujours en fin de condition, équivallent à default value en quelque sorte!

opérateurs de comparaison
<; >; <=; >=; ==; !=
 ../images/warning.gif = est une affectation de valeur; == est une comparaison entre 2 valeurs comme en javascript

Booleen True False ../images/warning.gif toujours la première lettre en majuscule; autrement erreur python

opérateurs and; or; not; is not
a >= 2 and a <= 8 signifie que a appartient à l'intervalle [2, 8]
a < 2 or a > 8 signifie que a n'appartient pas à l'intervalle [2, 8]
not a = 5 est équivallent à a != 5 # soit si a différent de 5; on préfère la dernière écriture qui s'adapte mieux à certains type de variables, donc a != 5 de préférence
majeur is not True # littéralement la variable nommée majeur n'est pas vraie, ne contient pas vrai, son résultat n'est pas vrai, donc est False

demander une saisie utilisateur
a = input("faite votre saisie")
a sera toujours de type str; donc type(a) => str

Transformer le type d'une variable exemple type str en int ou float
a = input("faite votre saisie") # on saisie 5
a = int(a) # pour obtenir le nombre entier 5

Les boucles en python

la boucle while ...
i = 0
while i<= 10:
   #
   i +=1 # incrémenter i de 1 à chaque passage dans la boucle
../images/warning.gif Il faut penser à incrémenter (faire varier) la valeur de i pour ne pas tomber dans une boucle infinie!
On peut aussi utiliser les mot clef break et continue dans une boucle while

Boucle while et mot clef break en python
while 1: # 1 est toujours vrai -> boucle infinie
   lettre = input("Tapez 'Q' pour quitter : ")
   if lettre == "Q":
       print("Fin de la boucle")
       break

break mais fin à la boucle
Le mot-clé break arrête une boucle quelle que soit la condition de la boucle.
Python sort immédiatement de la boucle et exécute le code qui suit la boucle, s'il y en a.

Boucle while et mot clef continue en python
i = 1
while i < 20: # Tant que i est inférieure à 20
   if i % 3 == 0:
       i += 4 # On ajoute 4 à i
       print("On incrémente i de 4. i est maintenant égale à", i)
       continue # On retourne au while sans exécuter les autres lignes Partie 1 :
       print("La variable i =", i)
       i += 1 # Dans le cas classique on ajoute juste 1 à i

Le mot-clé continue permet de poursuivre une boucle, en repartant directement à la ligne du while ou du for.

la boucle for in elts
chaine = "une lettre"
for lettre in chaine:
   print(lettre)

Définir une fonction en python

Méthode classique avec def fonction
def maFonction(param, param2="vous"): # "vous" est la valeur par défaut de param2, donc si param2 est omis, param2 vaut "vous"
   print(param)
   return param2

maVariable= maFonction("bonjour", "toi") # maVariable contient "toi"
nous aurions pu écrire également
maVariable = maFonction(param="bonjour", param2="toi") #définit le / les paramètres directement dans l'appel de la fonction!

L'instruction return signifie qu'on va retourner la valeur, pour pouvoir la stocker dans une variable.
return arrête le déroulement de la fonction, le code situé après le return ne s'exécutera pas.

Avec return, on peut retourner plusieurs valeurs que l'on sépare par des virgules;
on peut capturer ces valeurs dans des variables également séparées par des virgules!

Autre solution pour définir une fonction, plus compacte, lambda, mais moins souple au niveau des options
myFonction = lambda x, y : x*x # retourne le carré de x
myFonction(4) # retourne 16

 

Les commentaires

Python distingue 2 types d'écriture de commentaires et 4 significations pour ces commentaires;
la 3ième signification correspond à l'emploi sous Python de la commande help()
la 4ième forme permet curieusement de définir le codage des caractères accentués

les 2 types d'écriture sont:

""" commentaires """

# commentaires

Considérons le code suivant

""" Commentaires sur fichier Python
encodage utf-8

"""


# -*- coding: utf-8 -*-

import os # import des fonctions de la bibliothèque python Operating System intégrée à Python
import random # import fonctions hasard, aléatoire, intégrée à Python
import math # import fonctions mathématique intégrée à Python

# votre code ici

""" autres commentaires pour documenter votre code
ne passent pas avec la commande help("commentaires") """


os.system("pause") # propose une pause et demande d'appuyer sur n'importe qu'elle touche pour poursuivre.

Nous avons marqué en orange tous les commentaires quelque soit leur type d'écriture

# permet d'écrire un commentaire sur une ligne ou après une ligne de commande, venant ainsi documenter cette ligne de commande

""" ... """ permet d'écrire des commentaires sur plusieurs lignes

 

 

Cas particuliers de commentaires - aide - help()

Créer une aide accessible via help()

En fait l'aide est le premier commentaire du fichier ou de la fonction
écrit entre les guillemets
avant toute lignes de code

exemples:

"""

help for file

a help texte

"""

import claudecnx.useIt2021_01 as go # module externe de claudecnx; namespace = go

import itertools # module interne, voir <class 'generator'>

Aide sur un fichier.py

appel avec:

help("fichier") # aide sur le "fichier.py"

"""

module externe de claudecnx

D:\\python\\ExemplesPython\\use_it\\go_2021_01.py

 

Python 3 suppose que votre code source - c'est-à-dire chaque fichier .py -

est encodé en UTF-8 par défaut

"""

import os # module interne; os.system("pause")

import collections.abc # module interne, collections.abc.Iterable

Aide sur un fichier.py importé
comme namespace nommé go par exemple

help(go)

 

ou directement sur le fichier

help("claudecnx.useIt2021_01") # aide sur un fichier.py contenu dans un sous-dossier

def isIterable(elt): # indique si un elt est iterable, enumerable; as booleen

    """

    help() pour isIterable() hors de ce module: help(go.isIterable) # go as namespace

    :param elt: indique si un elt est iterable, enumerable; as booleen True or False

    import collections.abc # module interne, collections.abc.Iterable

    """

    if isinstance(elt, collections.abc.Iterable):

Aide sur une fonction

Aide sur une fonction dans le fichier importé comme namespace

help(go.isIterable)

 ou directement depuis le fichier

help("claudecnx.useIt2021_01.isIterable") # aide sur une fonction contenue dans le sous-dossier

Dans le code du fichier faire

help(isIterable) # depuis le code source du fichier contenant la fonction

 

Les textes en vert apparaîtront comme une aide lors de l'appel de help()

 

Aide sur un fichier.py - help()

Pour appeler une aide sur un fichier, un module tapez la commande help("module") ou module est le nom du fichier sans son extension.

help("nom_du_fichier") # si votre fichier s'appelle "nom_du_fichier.py";
le nom du fichier sans son extension doit être passé as String à la fonction help()

Vous verrez alors apparaître la documentation mise à disposition par le programmeur située dans les premières lignes du fichier
sous forme de commentaire

Dans notre cas il s'agit des lignes en gras, italique, souligné et orange en tête du fichier

../images/warning.gif seul le premier commentaire avant toute ligne de commande est pris en compte par la commande help()
Ce commentaire peut être de la forme """ commentaires """ ou # commentaires
La forme """ commentaires
permet d'écrire sur plusieurs lignes """; mais le premier """ doit être impérativement suivi d'une lettre pour être pris en compte par la commande help()

../images/idea.png suggestions, prenez l'habitude de mettre votre documentation dès la première ligne du fichier sur plusieurs lignes, privilégier la forme """ commentaires """

 Rappel: help() attend une String comme paramètre; cette String est le nom du fichier, du module sans son extension.

En language Python nous utiliserons indifféremment le terme module pour désigner un fichier python (extension py)

Aide sur un namespace - help()

Lorsque par exmple vous utiliser la ligne

import claudecnx.useIt2021_01 as go # module externe de claudecnx; namespace = go

vous définissez pour le moduule additionnel importé un namespace, ici nommé go

Pour obtenir l'aide sur ce module externe faire

help( go ) # le nom du namespace

Ici on passe un object et non plus une String à help()

Aide sur une fonction du namespace - help()

soit la fonction isIterable() définie dans un fichier.py importé via import claudecnx.fichier as go

claudecnx est le sous-dossier contenant le fichier.py

go est le nom du namespace attribué lors de l'import

help(go.isIterable) # aide sur la fonction isIterable

Résumé - Aide sur les fichiers et fonctions - help()

help("essai05_iterator_generator") # aide sur un fichier, ici essai05_iterator_generator.py

help("claudecnx.useIt2021_01") # aide sur un fichier.py contenu dans un sous-dossier

help(go.isIterable) # aide sur la fonction isIterable du namespace go

help(go) # aide sur le namespace nommé go

help("claudecnx.useIt2021_01.isIterable") # aide sur une fonction contenue dans le sous-dossier

help(isIterable) # depuis le code source du fichier contenant la fonction

help() peut aussi être intégrée dans votre code comme ceci

"""
help for file "test_help.py"
a help texte
"""

import claudecnx.useIt2021_01 as go # module externe de claudecnx; namespace = go

def myf02(): # pour exemple
    """
    ceci est l'aide de myf02()
    """

    a=5
    return a

help(myf02) # depuis le code du fichier

tab = [1, 2, 3, 4, 5, 6, 7]
print("valeur de tab ", go.strc(tab) )
print()

 

help("test_help") # aide sur un fichier, ici test_help.py

help("claudecnx.useIt2021_01") # aide sur un fichier.py contenu dans un sous-dossier

help(go.isIterable) # aide sur la fonction isIterable du namespace go

help(go) # aide sur le namespace nommé go

help("claudecnx.useIt2021_01.isIterable") # aide sur une fonction contenue dans le sous-dossier

 

"""
return(distance,angle,TX)
distance,angle,TX=data(distance,angle,TX)
print("la distance est : ",distance,".")
print(" l angle est : ",angle,".")
"""

 

 

Gérer les bibliothèques

Python permet une gestion relativement simple des bibliothèques.

Ces bibliothèques se présentent généralement sous forme de fichiers *.py

Dans tous les cas l'intégration, l'import d'une bibliothèque à votre programme sera identique.

Import d'une bibliothèque

le terme d'import permet d'ajouter une bibliothèque à votre programme, de la rendre disponible pour votre code.

il y a 2 manières de procéder à un import de bibliothèque externe à votre programme.

soit en écrivant

  1. import os # import de toutes les fonctions de la bibliothèque python Operating System intégrée à Python
  2. from os import * # import de toutes les fonctions de la bibliothèque python Operating System intégrée à Python

La première méthode importe toutes les fonctions de la bibliothèque.

La deuxième méthode offre la possibilité de n'importer qu'une seule fonction de la bibliothèque en procédant comme suit:

from os import system # ne va importer que la fonction system du module os

Avec la 2ième méthode on peut également écrire:

from os import * # importera toutes les fonctions du module os comme le fait l'expression import os

Le choix sur la manière d'importer vos bibliothèques n'est pas neutre sur l'écriture de la suite de votre code

impact de la méthode d'import sur le code Python

Avec la première méthode: import biblio

import os # import de toutes les fonctions de la bibliothèque python Operating System intégrée à Python

la fonction sera appelée comme suit

os.system("pause")

on fait donc obligatoirement référence à la bibliothèque suivi du nom de la fonction à appeler, le tout étant séparé par un point

Avec la deuxième méthode: from biblio import

from os import * # import de toutes les fonctions de la bibliothèque python Operating System intégrée à Python

la fonction sera appelée comme suit:

system("pause")

Avec la 2ième méthode on ne précise plus l'origine de la fonction.

Cela peut être pratique, code plus court, mais on risque également de ne plus savoir la provenance de la fonction ainsi ajoutée par la bibliothèque

 

Créer vos propres bibliothèques Python

Une bibliothèque est en fait un fichier Python *.py

Le concept de bibliothèque suppose un fichier maitre en Python

et un autre fichier Python qui contiendra les fonctions de notre bibliothèque

A ce stade nous avons un choix à faire en matière d'organisation de notre code

  1. Soit le fichier maitre.py et biblio.py sont au même niveau d'arborescence sur notre disque dur
  2. Soit le fichier biblio.py est dans un sous-dossier du répertoire contenant maitre.py

ici aussi ce choix aura un impact sur votre code et ce choix va dépendre également de votre manière d'importer les bibliothèques

Exemple de fichier maitre

Examinons le fichier maitre.py suivant, c'est lui qui importe nos bibliothèques

""" Ajoute vos bibliothèques à ce module

ajoute la fonction tableAddition() depuis le fichier biblio01.py
tableAddition(n, max)
ou n est le nombre dont on souhaite voir la table d'addition
max est la valeur à ajouter à n, par défaut de 1 à 10, peut être omis

ajoute la fonction tableSoustraction() depuis le sous-dossier Biblio contenant le fichier biblio02.py

encodage utf-8
"""


# -*- coding: utf-8 -*-

import os # import des fonctions de la bibliothèque python Operating System intégrée à Python
#import random # import fonctions hasard, aléatoire, intégrée à Python
#import math # import fonctions mathématique intégrée à Python


# import de vos propres biblio
from biblio01 import tableAddition # ajout d'une biblio depuis un fichier.py
import Biblio.biblio02 # ajout des fonctions du fichier biblio02.py situé dans le dossier Biblio

# votre code ici
print("Table d'addition")
tableAddition(3, 20) # la fonction étant ajoutée via from Module import
# il ne faut pas spécifier l'origine de la bibliothèque
# mais seulement le nom de la fonction et ses paramètres

""" si nous avions utiliser la forme
import biblio01
nous aurions appelé notre fonction par
biblio01.tableAddition(3, 20)
pour mémoire le module biblio01 est le fichier biblio01.py
"""


os.system("pause") # propose une pause et demande d'appuyer sur n'importe qu'elle touche pour poursuivre.

print("Table de soustraction")
Biblio.biblio02.tableSoustraction(3, 20)
""" la fonction est ajoutée via un sous-dossier Biblio
ce dossier contient le fichier biblio02.py
qui lui-même comporte la fonction tableSoustraction()
comme nous avons utiliser import et non pas from Mod import *
nous devons pour appeler la fonction faire référence
à son emplacement complet
"""


os.system("pause") # propose une pause

exemple de fichier biblio01.py

""" Module additionnel en Python

 

ajoute la fonction tableAddition(n, max)

ou n est le nombre dont on souhaite voir la table d'addition

max est la valeur à ajouter à n, par défaut de 1 à 10, peut être omis

 

ajoute la fonction tableMultiplication(n, max)

ou n est le nombre dont on souhaite voir la table de multiplication

max est la valeur à multiplier à n, par défaut de 1 à 10, peut être omis

 

encodage utf-8

"""

 

# -*- coding: utf-8 -*-

 

import os

 

def tableAddition(nb, max=10):

    """Fonction affichant la table d'addition de nb de

    nb + 1 jusqu'à nb + max

        par défaut max vaut ici 10

        """

    i = 0

    while i < max:

        print(nb, "+", i + 1, "=", (i + 1) + nb)

        i += 1

 

# test de la fonction tableAddition en local

if __name__ == "__main__":

    tableAddition(4)

    os.system("pause")

 

def tableMultiplication(nb, max=10):

    """Fonction affichant la table de multiplication de nb

    nb * 1 jusqu'à nb * max

        par défaut max vaut ici 10

        """

    i = 0

    while i < max:

        print(nb, "*", i + 1, "=", (i + 1) * nb)

        i += 1

 

# test de la fonction tableMultiplication en local

if __name__ == "__main__":

    tableMultiplication(4)

    os.system("pause")          

 

exemple de fichier Biblio/biblio02.py

""" fichiers de biblio Python dans un sous-dossier

 

ajoute la table de soustraction

tableSoustraction(nb, max=10)

où n est le nombre à soustraire

max la valeur à soustraire de nb

 

encodage utf-8

"""

 

# -*- coding: utf-8 -*-

 

import os # import des fonctions de la bibliothèque python Operating System intégrée à Python

#import random # import fonctions hasard, aléatoire, intégrée à Python

#import math # import fonctions mathématique intégrée à Python

 

# votre code ici

def tableSoustraction(nb, max=10):

    """Fonction affichant la table de sosutraction de nb

    nb - 1 jusqu'à nb - max

    par défaut max vaut ici 10

    """

    i = 0

    while i < max:

        print(nb, "-", i + 1, "=", nb - (i + 1) )

        i += 1

 

# test de la fonction tableSoustraction en local

if __name__ == "__main__":

    tableSoustraction(4)

    os.system("pause")

 

 

   

Trame de fichiers bibliothèque

Examinons maintenant cette trame pour créer un fichier de bibliothèque

""" Trame d'un fichier Python de type bibliothèque
encodage utf-8
"""


# -*- coding: utf-8 -*-

import os # import des fonctions de la bibliothèque python Operating System intégrée à Python
#import random # import fonctions hasard, aléatoire, intégrée à Python
#import math # import fonctions mathématique intégrée à Python


# vos fonctions ici
def maFonction():
        print("ma Fonction")
        
# test de la fonction en local
if __name__ == "__main__":
    maFonction()
    os.system("pause") # propose une pause


""" pour obtenir de l'aide sur le mode d'emploi d'un fichier Python faire:
help("nom_du_fichier") # sans l'extension python """

les lignes en rouge vous permettrons de tester votre fonction en local
sans avoir à importer la bibliothèque dans un fichier maitre
mais en l'exécutant directement dans la console Python ou la console IDLE Python.

 

Appel des fonctions de nos bibliothèques

bibliothèque ajoutée via: form biblio import *

l'appel de la fonction se fera directement avec son nom quelque soit la position du fichier biblio.py par rapport à maitre.py

maFonction()

bibliothèque ajoutée via: import biblio

l'appel de la fonction fera apparaître l'arborescence de votre fichier biblio.py par rapport au fichier maitre.py

maitre.py et biblio.py sont au niveau  dans l'arborescence de vos fichiers

biblio.maFonction()

où biblio correspond au fichier biblio.py

biblio.py est dans un sous-dossier par rapport à maitre.py

Biblio.biblio.maFonction()

où Biblio est le nom du sous dossier en question
et biblio le nom du fichier biblio.py

../images/warning.gif bien respecter les majuscules et minuscules (la casse) dans l'appel de vos fonctions
En effet Python étant multi systèmes certains operating System respecte la casse contrairement à Windows

Donc si vous voulez éviter des erreurs en fonction du système d'exploitation, il faut respecter la casse des dossiers, fichiers et bien sûr dans le nom de vos fonctions

Tester ses propres fonctions dans vos fichiers bibliothèque

Un fichier de bibliothèque est un fichier normal en Python

Toutefois si nous voulons tester directement une fonction de ce fichier cela peut se réserver un peu difficile

soit on crée un fichier maitre.py qui importe la bibliothèque et l'on teste la fonction dans le fichier maitre

mais nous avons aussi la possibilité de tester la dite fonction directement dans le fichier biblio.py

pour cela procéder comme suit

 # test de la fonction en local
if __name__ == "__main__":
    maFonction()
    os.system("pause") # propose une pause

 Pour tester localement vos fonctions, c'est à dire sans document maitre

il suffit de rajouter ces lignes (ici en rouge)

maFonction sera remplacé par le nom de la fonction à tester, pensez également à adapter les paramètres!

Ainsi vous pouvez tester vos fonctions de bibliothèque directement via la console (IDLE) Python

 

Gestion des caractères accentués

Python 3 suppose que votre code source est encodé en UTF-8 par défaut .

Pour les versions antérieures et ou pour éviter les erreurs avec les accents il est conseillé d'ajouter dans votre fichier la ligne

# -*- coding: utf8 -*-

Comme ceci

""" Gestion des caractères accentués sous Python
encodage utf-8
"""

# -*- coding: utf-8 -*-

import os # import des fonctions de la bibliothèque python Operating System intégrée à Python
import random # import fonctions hasard, aléatoire, intégrée à Python
import math # import fonctions mathématique intégrée à Python

# votre code ici

os.system("pause") # propose une pause et demande d'appuyer sur n'importe qu'elle touche pour poursuivre.

Pour autant sous Python version 3 nous n'avons pas détecté de problèmes avec les accents même si cette ligne est omise

que ce soit avec un caractère accentué dans le nom de la variable ou dans son contenu.

En fait Python 3 considère par défaut que l'encodage des caractères est utf-8

""" Gestion des caractères accentués sous Python

sous python3

encodage utf-8

par défaut

"""

# -*- coding: utf-8 -*-

import os # import des fonctions de la bibliothèque python Operating System intégrée à Python

# votre code ici

print("pour gérer les caractères accentués sous Python")

print(" # -*- coding: utf-8 -*- ")

os.system("pause") # propose une pause et demande d'appuyer sur n'importe qu'elle touche pour poursuivre.

 

 

Les variables

Elles sont de plusieurs sortes, catégories

type d'une variable

Les variables peuvent être de plusieurs types: str, int, float,bool, list, tuple, type ...

Pour connaître le type d'une variable faire:

type(variable)

pour obtenir cette information sous forme d'une String, de type str, écrire plutôt

type(elt).__name__  # type as string
elt().__class__.__name__  # si elt est une class

variable Itérable

Certaines variables sont Iterables, enumérables, comme les list, les tuples, les String ...

nous pouvons donc lister, énumérer leurs composants lors d'une itération

La manière la plus classique de réaliser cette itération est:

separateur = "," # "" ou "," ou ";" ou " " ou "a" etc...
strListeElements = separateur.join(str(e) for e in elt) # ou elt est la variable à itérer

Ainsi "ma chaine" deviendra "m,a,c,h,a,i,n,e"

L'itération fonctionne pour les object de type list, tuple, String

../images/idea.png via les itérations il est possible dans de nombreux cas de convertir un type donné en une String

 Source inspiration

https://www.google.com/search?client=firefox-b-d&q=tuple+tjours+iterable%3F

http://sametmax.com/les-trucmuchables-en-python/

https://openclassrooms.com/forum/sujet/tuple-liste-dico-difference

type str "a"

le type string renvoie str lors d'un appel à type(variable); c'est une chaine de caractères

maChaine = "une chaine" # est de type str

le type str permet une utilisation avec la méthode print

print(machaine)

print(machaine + " est OK")

print(machaine, " est OK")

Apparemment la méthode print n'accepte que les types str, à l'exception du type bool

le type str est iterable; son itération renvoie chacune des lettres, une par une.

 

type int 3

type(variable) renvoie int; c'est un entier

n=1 # est de type int

c'est l'absence de . indiquant une décimale qui détermine le type int ou float

ainsi

n=1 # est de type int

mais

n=1.0 # est de type float

pourtant la vleur est toujours 1!

sous python l'indicateur des décimales est toujours le point . système anglo saxon

n'est pas iterable

retourne une erreur avec print()

pour l'afficher avec print() il faut le convertir en str comme ceci

chaine = str(n) # où n est de type int

 

Type float 3.14159

la fonction type() retourne float

n=1.0 # et de type float car il y a la présence du point . indicateur des décimales dans le système anglo saxon

n'est pas itérable

print() retourne une erreur avec le type float

conversion en str: chaine = str(n) # où n est un float

 

Type bool True, False

c'est un boolen, True, False; la fonction type() renvoie bool

sous python True et False commence toujours avec une majuscule, autrement erreur!

n'est pas itérable

print() fonctionne, bien que le type ne soit pas str (apparemment c'est la seule exception pour la méthode print() qui n'accepte que des str)

La conversion de bool vers int et inversement donne pour résultat

n = 0
b=bool(n)
print(b) # False

n = -2 # différent de 0 en fait
b=bool(n)
print(b) # True

b=True
n=int(b)
c=str(n)
print(n) # 1

b=False
n=int(b)
c=str(n)
print(n) # 0

n'importe quel nombre transformé en bool donne True sauf 0 qui donne False; dito pour 0.0 qui donne aussi False, etc

True transformé en nombre donne 1

False transformé en nombre donne 0

 

Type list [a, b]

c'est ce qui ressemble le plus à un tableau, à un array en javascript

déjà ressemblance dans sa forme, son écriture

liste = [1, 2, 3] # as list, type() renvoie list

le type list est itérable comme ceci:

separateur = "," # separateur peut être constitué de plusieurs caractères, exemple; separateur = ", "
strListe = separateur.join(str(e) for e in liste) # fonctionne aussi bien avec les int que les str; retourne une str de type "1,2,3"

print(list) retourne une erreur si on essaie de le concaténer avec un autre type; il faut le convertir en str par exemple; voir la méthode ci-dessus avec itération

Pour la conversion en str on peut aussi utilser:

chaine = "%s" % liste # [list]; les crochets apparaissent "[1,2,3]"

Pour plus d'informations vous pouvez consulter

source inspiration

https://openclassrooms.com/fr/courses/1206331-utilisation-avancee-des-listes-en-python

https://python.doctor/page-apprendre-listes-list-tableaux-tableaux-liste-array-python-cours-debutant

 

Convertir list in str

############ convert list to str

tab = [1, 2, 3, 4, 5, 6] # as list, type() renvoie list
strTab = strC(tab)

separateur = ", "
chaine = separateur.join(str(e) for e in tab) # fonctionne aussi bien avec les int que les str
print(strTab, " converted in str " + chaine) # 1, 2, 3, 4, 5, 6

# ou encore

chaine = "%s" % tab               # les crochets apparaissent dans la chaine de caractères
print(strTab, " converted in str 2nd méthode " + chaine) # [1, 2, 3, 4, 5, 6]

########## Conversion list <=> str
print("### Conversion list <==> str")

chaine = "Olivier:ENGEL:Strasbourg"
print("chaine à convertir ", chaine)

arr = list(chaine)
print("avec arr = list(chaine) str =>list ", strC(arr) ) # convert str to list
print("arr = list(chaine) fonctionne mais ce n'est pas la bonne méthode car on ne peut pas définir de séparateur!")

arr = [i for i in chaine if i!=" "]
print("avec [i for i in chaine if i!=' '] ", strC(arr) )
print(" cette méthode ne spécifie pas de séparateur, i!=' ' permet de supprimer les espaces ")

separateur = ":" # c'est le séparateur présent dans chaine!
arr = chaine.split(separateur) # Transformer une string en liste
print("avec chaine.split(separateur) str => list ", strC(arr) ) # convert str to list ['Olivier', 'ENGEL', 'Strasbourg']

separateur = ":" # c'est le séparateur qui sera appliqué dans chaine
chaine = separateur.join(str(e) for e in arr) # convert list to string
print("avec chaine = separateur.join(str(e) for e in arr) list => str ", chaine) # convert list to str 'Olivier:ENGEL:Strasbourg'

print(" avec '%s' % arr list =>str ", "%s" % arr ) # convert list to str

 l'expression str(e) for e in tab dans la fonction join() permet de traiter simultanément divers type de valeurs, de données par exemple de str et int

la variable separateur peut être constituée de plusieurs caractères

l'expression"%s" % tab fait également apparaître les crochets [] encadrants les valeurs du list

 

Parcourir un object list

tab = [1, 2, 3, 4, 5, 6] # as list, type() renvoie list
strTab = strC(tab)
print(strTab)

for x in tab:
    print("for x in tab: ", x)

animaux = ['girafe', 'tigre', 'singe', 'souris']
chaine = strC(animaux)
print("animaux = ", chaine)

for animal in animaux[1:3]:
    print("for animal in animaux[1:3]: ", animal)

  1.     #tigre
  2.     #singe

for i in range(4):
    print("for i in range(4): ", animaux[i])

  1.     #girafe
  2.     #tigre
  3.     #singe
  4.     #souris

for i in range(0,3):
    print("for i in range(0,3): ", animaux[i])

  1.     #girafe
  2.     #tigre
  3.     #singe

 

for i, animal in enumerate(animaux):
    print( "L'animal {} est un(e) {}".format(i, animal) )

  1.     #L'animal 0 est un(e) girafe
  2.     #L'animal 1 est un(e) tigre
  3.     #L'animal 2 est un(e) singe
  4.     #L'animal 3 est un(e) souris

 

Invertion du contenu d'un object list

 ################### Inversion du contenu d'un list

print("###### Inversion du contenu d'un list")
tab = [1, 2, 3, 4, 5, 6] # as list, type() renvoie list
strTab = strC(tab)
print("valeur initiale de tab ", strTab)

tab2 = list( reversed(tab) ) # inversion avec création d'une nouvelle liste - <class 'list_reverseiterator'>
print(" avec list( reversed(tab) ", strC(tab2), " la valeur de tab est conservée", strC(tab) ) # [6, 5, 4, 3, 2, 1] est de type list_reverseiterator - iterable? True

# ou encore
tab2 = tab[::-1]
print(" avec tab[::-1] ", strC( tab2), " la valeur de tab est conservée ", strC( tab) )

# ou encore
tab.reverse()
print(" autre méthode avec tab.reverse() ",  strC( tab ), " la valeur de tab est modifiée et tab.reverse() retourne none" ) # tab est modifié

 Nous voyons ici plusieurs méthodes pour inverser les valeurs dans un list

newTab = tab[::-1] est la plus utilisée; elle ne modifie pas tab

newTab = list(reverse(tab)) retourne un nouvel object list; tab n'est pas modifié;
reverse(tab) retourne lui un object list_reverseiterator qui est iterable

tab.reverse() inverse la valeur de tab et retourne none, object NoneType

 

Lier 2 itérables

 ########## lier 2 itérables
print("Lier 2 itérables")

tab3 = list(zip('AZERTY', (100, 300, 600))) # lier deux itérables
print( strC(tab3) ) # [('A', 100), ('Z', 300), ('E', 600)] est de type list - iterable? True
print( isWhat( zip('AZERTY', (100, 300, 600)) ) ) # est de type zip - iterable? True

Au passage nous noterons que l'expression zip() est de type zip et iterable

elle est facilement convertie en list via list( zip() )

 

Trier un object list

############ trier un list

print(" Trier un list")

tab = ["b", "1", "3", "abc", "2", "a", "c", "ab", "bc"]
print("valeur initiale de tab ", strC(tab) )

tab5 = sorted( tab )    # tri et génère une nouvelle liste
print("avec sorted( tab )  ", strC(tab5), "la valeur de tab n'est pas modifiée ", strC(tab) )   # ['1', '2', '3', 'a', 'ab', 'abc', 'b', 'bc', 'c']
# tous les types doivent être identiques
# TypeError: '<' not supported between instances of 'int' and 'str'

a = tab.sort()   #  tri et modifie la list
print("avec tab.sort() ", strC(tab), " la valeur de tab est modifiée")   # ['1', '2', '3', 'a', 'ab', 'abc', 'b', 'bc', 'c']
print( type(a) ) # <class 'NoneType'>

 Plusieurs méthodes ici aussi

newTab = sorted(tab) retourne une nouvelle list triée, tab n'est pas modifiée
../images/warning.gif toutes les valeurs doivent être de même type, autrement risque d'erreurs

tab.sort() trie et modifie tab; la valeur retournée est none, <class 'NoneType'>

 

Accéder aux éléments de l'object list - Sliceable

########### accès aux elt du list

print("accés aux elt du list")

tab = ["b", "1", "3", "abc", "2", "a", "c", "ab", "bc"]
print("valeur initiale de tab ", strC(tab) )

print("avec tab[1] ", strC( tab[1] ) ) # l'index 1 soit la valeur "1"

print("avec tab[-1] ",   strC( tab[-1] )  ) # renvoie la dernière occurence, ici "bc"; -2 l'avant-dernière valeur; etc... 

print("avec tab[:] ",  strC( tab[:] )  ) # Affiche toutes les occurences: ["b", "1", "3", "abc", "2", "a", "c", "ab", "bc"] 

print("avec tab[2:4] ",   strC( tab[2:4] ) ) # affiche les elt entre les index 2 inclus et 4 exclu (index 3 inclu donc); ['3', 'abc']

print("avec tab[:4] ", strC( tab[:4] ) ) # de l'index 0 à 3 inclus ['b', '1', '3', 'abc'], soit les 4 premières valeurs

print("avec tab[4:] ", strC( tab[4:] ) ) # de l'index 4 inclu juqu'à la fin du list; les 4 premières valeurs sont ignorées; ['2', 'a', 'c', 'ab', 'bc']

 La aussi de multiples écritures sont possibles qui renvoient tantôt un autre object list, cas où plusieurs elts sont retournés,
ou alors un object ou valeur unique

 

Modification, Ajout, Suppression dans un object list

voir également les opérations sur les ensembles qui permettent des opérations comme l'union, l'intersection, la différence, le ou exclusif

Ajout d'elt dans un object list

############# ajout d'elt dans un object list

print("#### ajout d'elt dans un object list")

tab = [1, 2, 3, 4, 5, 6] #
strTab = strC(tab)
print("valeur initiale de tab ", strC(tab) )

tab.append("fin")     # ajoute un elt à la fin
print("avec tab.append('fin') ",  strC(tab))    # [1, 2, 3, 4, 5, 6, 'fin'] 

tab.insert(0,'debut')     # ajoute "debut" à la position 0, soit en début du list
print("avec tab.insert(0,'debut') ", strC(tab) ) # ['debut', 1, 2, 3, 4, 5, 6, 'fin'] 

tab.insert(2,'c')     # ajoute "c" à l'index 2, soit en 3ième position
print("avec tab.insert(2,'c') ", strC(tab) ) # ['debut', 1, 'c', 2, 3, 4, 5, 6, 'fin'] 

tab.insert(tab.index('c')+1,'d')    # insère à la position index de la valeur +1
print("avec tab.insert(tab.index('c')+1,'d')  ", strC(tab) )   # ['debut', 1, 'c', 'd', 2, 3, 4, 5, 6, 'fin']

####### somme multiplication

print("## somme multiplication ")

x = [1, 2, 3, 4]
y = [4, 5, 1, 0]
print("x initial ", strC(x) )
print("y initial ", strC(Y) ) 

x.extend(y) # ajouter, concatener, agrandir une liste avec une autre liste
print("avec x.extend(y) ", strC(x) ) # [1, 2, 3, 4, 4, 5, 1, 0]

z = x + y  # ajouter, concatener, agrandir une liste avec une autre liste
print("avec x+y ", strC(z) ) # [1, 2, 3, 4, 4, 5, 1, 0]

x = [1, 2]
print("x initial ", strC(x) )
z = x*5 # Vous pouvez même mutiplier une liste:
print("avec x*5 ", strC(z) ) # [1, 2, 1, 2, 1, 2, 1, 2, 1, 2]

Plusieurs méthodes donc, append() ou insert()

append(valeur) ajoute en fin de list

insert(position, valeur) ajoute ou plutôt insère un elt à la position indiquée

noter également le mot clef index qui retourne la position d'une valeur dans le list

Pour mémoire l'index 0 est la première position dans le list

 extend() ou + permettent d'additionner 2 object list pour en créer un 3ième

* permet de "multiplier" 2 object list entre eux

 

Supprimer elt dans un object list

############# supprimer un elt

print("#### supprimer un elt")

tab = ['debut', 1, 'c', 'd', 2, 3, 4, 5, 6, 'fin']
print("valeur initiale de tab ", strC(tab) )

tab.remove("d")   # supprime la première valeur "d" rencontrée
print("avec tab.remove('d') ", strC(tab) )    # ['debut', 1, 'c', 2, 3, 4, 5, 6, 'fin'] 

del tab[2]    # supprime l'élément situé à l'index 2 (3ième position donc)
print("avec del tab[2] ", strC(tab) )    # ['debut', 1, 2, 3, 4, 5, 6, 'fin']

Plusieurs méthodes

remove(valeur) qui permet de supprimer la première occurrence valeur rencontrée

del tab(2) qui supprime l'élément, la valeur située ici à l'index2 soit en 3ième position dans tab

../images/warning.gif Attention les list commencent à la position 0; donc [2] sera en réalité le 3ième elt

 

Les ensembles (set) Union, Intersection, Différence OU exclusif

source d'inspiration:

https://openclassrooms.com/fr/courses/1206331-utilisation-avancee-des-listes-en-python

######## les ensembles (set) Union, Intersection, Différence OU exclusif
print("#### les ensembles  (set) Union, Intersection, Différence OU exclusif")

tab1 = [1, 2, 3, 4, 5, 6, "a", "b", "c"]
tab2 = [2, 3, 4, "a", "b"]
tab3 = [6, 7, 8, 9, "a"]

#convert object list en object set
ens1 = set(tab1)
ens2 = set(tab2)
ens3 = set(tab3)

print("avec ens1 & ens2 ", strC( ens1 & ens2 ) ) # {2, 3, 4, 'b', 'a'} Intersection, car ce sont les seuls à être en même temps dans ens1 et ens2

print("avec ens1 | ens3 ", strC( ens1 | ens3 ) ) # {1, 2, 3, 4, 5, 6, 'c', 7, 8, 9, 'b', 'a'}, les deux réunis, Union, OU Inclusif

print("avec ens1 & ens3 ", strC( ens1 & ens3 ) ) # {6, 'a'}, même raison que deux lignes au dessus

print("avec ens1 ^ ens3 ", strC( ens1 ^ ens3 ) ) # {1, 2, 3, 4, 5, 7, 8, 9, 'c', 'b'}, OU Exclusif, l'union moins les éléments communs

print("avec ens1 - ens2 ", strC( ens1 - ens2 ) ) # {1, 'c', 5, 6}, on enlève les éléments de ens2, Différence

######### convert object set en object list

ens = ens1 & ens2 # for test
print ("avec ens = ens1 & ens2 ",  isWhat( ens ) )
tab = list(ens)
print("avec list(ens) ", isWhat(tab) )

ici on utilise les object set pour faire des opérations sur les object list

en premier lieu il faut convertir un object list en object set

myset = set(mylist)

puis on peut traiter les opérations sur les ensembles comme l'union, l'intersection, la diffrénce ou exclusif

ces opérations nous donne un nouvel object set

pour le convertir en object list faire

mylist = list(myset)

nota: les object set tout comme les object list sont iterables

 

Multiplexage d'object list

Obtenir toutes les combinaisons possibles des valeurs de 2 object list

########### Multiplexage object list
print("### Multiplexage object list")

from itertools import product

tab1 = ['a', 'b']
tab2 = ['c', 'd', 2]
print("valeur initiale de tab1 ", strC(tab1) )
print("valeur initiale de tab2 ", strC(tab2) )

tab3 = list( product(tab1, tab2) ) # afficher tous les cas possibles d'une liste elle-même composée de liste; Multiplexage
print("avec list( product(tab1, tab2) ) ", strC(tab3) ) # [('a', 'c'), ('a', 'd'), ('a', 2), ('b', 'c'), ('b', 'd'), ('b', 2)]

les object itertools.product sont itérables

les object itertools.product se transforme facilement en object list

Permet de créer facilement un object list de depth, dimension 2

 

Savoir si une valeur (un elt) existe dans l'object list

 ############## vérifier l'existence d'une valeur
print("#### vérifier l'existence d'une valeur")

tab = ["b", "a", "3", "abc", "2", "a", "c", "a", "bc"]
print("valeur initiale de tab ", strC(tab) )

print( tab.count("a") ) # connaitre le nombre d'occurences d'une valeur dans une liste; donc il existe

print( "a" in tab ) # savoir si un élément est dans une liste; renvoie True or False

print( tab.index("a") ) # position de la valeur "a" dans le list; première occurrence rencontrée

 Plusieurs méthodes sont ici présentées
chacune à sa manière permet de savoir si une valeur existe, est présente dans l'object list

 

id - identifiant de l'object list

############### identifiant de l'object list
print("##### identifiant de l'object list")

tab = ["b", "a", "3", "abc", "2", "a", "c", "a", "bc"]
print("valeur initiale de tab ", strC(tab) )

print( id(tab) ) # identificateur unique de l'object tab: 2293464768768

 

Nombre d'éléments dans un object list

############## nbr d'elts, de valeurs dans un object list
print("#### nbr d'elts, de valeurs dans un object list")

tab = ["b", "a", "3", "abc", "2", "a", "c", "a", "bc"]
print("valeur initiale de tab ", strC(tab) )

n= len(tab) # nombre d'éléments dans tab
print(n)

 

 

Copier un object list

on peut réaliser soit une copie dépendante (toute modification de l'un des list impacte le 2nd et inversement)

ou des copies indépendantes, les modifications de l'un des object list ne se répercutent pas sur les autres object list.

########### copier un object list
print("### copier un object list")

tab = ["b", "a", "3", "abc", "2", "a", "c", "a", "bc"]
print("valeur initiale de tab ", strC(tab) )

tab8 = tab # copy tab dans tab8 - c'est une copie dépendante
print("avec tab8 = tab ",strC(tab8) ) # ['b', 'a', '3', 'abc', '2', 'a', 'c', 'a', 'bc']
tab8[0] = "debut"
print("tab8[0] = 'debut', modifie tab ", strC(tab) ) #  tab a également était modifié
tab[-1] = "fin"
print("tab[-1] = 'fin' modifie tab8 ", strC(tab8) )

tab9 = tab[:] # copy indépendante de liste dans liste9
print("avec tab9 = tab[:] ", strC(tab9) ) # ['d', 1, 2, 3, 4]
tab9[0] = "d"
print("tab9[0] = 'd' ne modifie pas tab ", strC(tab) )

import copy # module interne - copie indépendante
tab10 = copy.deepcopy(tab) # Pour des données plus complexes, vous pouvez utiliser la fonction deepcopy du module copy
print("avec tab10 = copy.deepcopy(tab) ", strC(tab10) ) # ['d', 1, 2, 3, 4]
tab10[0] = "d"
print("tab10[0] = 'd' ne modifie pas tab ", strC(tab) )

Plusiers types de copies

une copie dépendante où toute modification de l'un des list impacte le 2ième

une copie indépendante, les modifications n'impacte que l'object list modifié

notez deepcopy() du module interne copy permet de faire des copies indépendantes sur des object complexes
cette fonction nécessite l'import du module interne copy

 

Générer rapidement un object list for test

########### générer rapidement un list
print("### générer rapidement un list")

r = range(10) # La fonction range génère une liste composée d'une simple suite arithmétique.
# r est de type range
tab = list(r) # convert object range en object list
print("avec tab = list( range(10) ) ", strC(tab) ) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print("avec [0] * 5 ", strC([0] * 5 ) ) # [0, 0, 0, 0, 0]

 ce ne sont que des méthodes parmi d'autre.

 

fonction qui appelle une autre fonction

# fonctions communes pour applicatif avec map ou filter ou reduce

def carre(x):
    return x ** 2 # x ** 2 = x puissance 2

def carreOptionnel(x, opt=1): return x ** 2 # x ** 2 = x puissance 2; opt est optionnel de sorte que carreOptionnel(7) fonctionnera

def petit_carre(x): return x ** 2 < 16 # nombres dont les carrés sont inférieurs à 16.

def puissance(x, exponent): return x ** exponent

def pair(x): return not bool(x % 2)

def addition(x, y): return x + y

def produit(x, y): return x * y

def appcarre(element, liste): return liste + [element ** 2] # ne fonctionne pas avec reduce en Python version 3

########### fonction qui exécute une autre fonction

print("### fonction qui exécute une autre fonction")

def appliquer_fonction(fonc, valeur):
    return fonc(valeur) # On utilise la fonction callback fonc avec comme paramètre valeur.

print( appliquer_fonction(carre, 3, 2) ) # Affiche 9, c'est à dire mettre_au_carre(3)
# Python ne fait pas de différence entre une variable et une fonction, comme javascript

 la fonction appliquer_fonction() telle quelle ne peut pas appeler addition()
en effet addition() attend 2 paramètres.

Pour y remedier nous pourrions modifier appliquer_fonction()  et carre() comme suit

########### fonction qui exécute une autre fonction

print("### fonction qui exécute une autre fonction")

def appliquer_fonction(fonc, valeur, opt=1):
    return fonc(valeur, opt) # On utilise la fonction callback fonc avec comme paramètre valeur.

print( appliquer_fonction(carreOptionnel, 3, 2) ) # Affiche 9, c'est à dire mettre_au_carre(3)

print( appliquer_fonction(addition, 5, 8) )  # affiche 13

 Nous utilisons ici la possibilité de Python d'avoir des paramètres optionnel pour les fonctions.

 Ce chapitre bien qu'ayant à priori peu à voir avec les object list va nous permettre d'aborder
le concept des fonctions prototype applicables aux object list

 

fonction prototype de map

########### fonction prototype de map
def mapProto(callback, liste): # équivallent à map()
    nouvelle_liste = []
    for element in liste:
       nouvelle_liste.append(callback(element))
    return nouvelle_liste

 

fonction prototype de filter

############ fonction prototype de filter
def filterProto(callback, liste): # équivallent à filter
    nouvelle_liste = []
    for element in liste:
       if callback(element): nouvelle_liste.append(element)
    return nouvelle_liste

 

fonction prototype de reduce

########### fonction prototype de reduce
def reduceProto(callback, liste, valeur_initiale):
    if liste == []: return valeur_initiale
    else: return callback(liste[0], my_reduce(callback, liste[1:], valeur_initiale))

 

utiliser map avec les object list

########## application de map

tab = [1, 2, 3, 4, 5]
print("valeur de tab ", strC(tab) )

a_map = map(carre, tab)  # Affiche [1, 4, 9, 16, 25], c'est à dire le carré de chaque élément
print("avec map(carre, tab) ", strC(a_map) ) # ecrit Object map, pas de détails des données
print( isWhat( a_map) )

print("avec map(pair, tab) ", strC( map(pair, tab) ) ) # Affiche [False, True, False, True, False], c'est à dire si le nombre est pair.

print("avec mapProto(carre, tab) ", strC( mapProto(carre, tab) ) ) # Affiche [1, 4, 9, 16, 25], c'est à dire le carré de chaque élément

print("avec mapProto(pair, tab) ", strC( mapProto(pair, tab) ) ) # Affiche [False, True, False, True, False], c'est à dire si le nombre est pair.

Nous pouvons constater à l'éxécution du code que mapProto() et map() retourne bien les mêmes valeurs

utiliser filter avec les object list

########### application de filter
print("### application de filter")

tab = [1, 2, 3, 4, 5]
print("valeur de tab ", strC(tab) )

a_filter = filter(petit_carre, tab)  # Affiche [1, 2, 3], c'est à dire les nombres dont les carrés sont inférieurs à 16.
print("avec filter(petit_carre, tab) ", strC(a_filter) )
print( isWhat(a_filter) )

print("avec filter(pair, tab) ", strC( filter(pair, tab) ) ) # Affiche [2, 4], c'est à dire les nombres pairs de la liste.

print("avec filterProto(petit_carre, tab) ", strC( filterProto(petit_carre, tab) ) ) # Affiche [1, 2, 3], c'est à dire les nombres dont les carrés sont inférieurs à 16.

print("avec filterProto(pair, tab) ", strC( filterProto(pair, tab) ) ) # Affiche [2, 4], c'est à dire les nombres pairs de la liste.

Nous pouvons constater à l'éxécution du code que filterProto() et filter() retourne bien les mêmes valeurs

 

utiliser reduce avec les object list

########## application de reduce
print("### application de reduce")

from functools import reduce # pour python 3
from six.moves import reduce

tab = [1, 2, 3]
print("valeur de tab ", strC(tab) )

print("avec reduce(addition, tab, 0) ",  strC( reduce(addition, tab, 0) ) ) # Équivaut à ((0 + 1) + 2) + 3

print("reduce(produit, tab, 1) ", strC( reduce(produit, tab, 1) ) ) # Équivaut à ((1 * 1) * 2) * 3

# print( reduce(appcarre, [1, 2, 3], []) ) # Équivaut à map(carre, [1, 2, 3]) ;)
# TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'

print("avec reduceProto(addition, tab, 0) ", strC( reduceProto(addition, tab, 0) ) ) # Équivaut à ((0 + 1) + 2) + 3   => 6

print("avec reduceProto(produit, tab, 1) ", strC( reduceProto(produit, tab, 1) ) ) # Équivaut à ((1 * 1) * 2) * 3   => 6

print("avec reduceProto(appcarre, tab, []) ", strC( reduceProto(appcarre, tab, []) ) ) # Équivaut à map(carre, [1, 2, 3]) ;)   => [9, 4, 1]
print("cette dernière expession fonctionne avec reduceProto() mais pas avec reduce")
print(" avec reduce nous obtenons: # TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'")

print( isWhat( reduce(addition, tab, 0) ) )
print("reduce ne renvoie pas de type reduce comme map ou filter, mais renvoie le type du rsultat calculé!")

De nos essais il ressort que la fonction reduceProto() est plus "souple" et permissive que reduce

D'autre part reduce() nécessite l'import d'un module interne comme functools ou encore six.moves pour fonctionner

reduceProto() ne nécessite aucun module interne ou externe, la fonction se suffit à elle-même.

 

utiliser des <<list comprehension>> avec les object list

########### utilisation des list comprehensions avec les object list
"""Les compréhensions de liste (list comprehensions en anglais)
sont des outils très puissants
permettant d'utiliser map et filter (vues au dessus)
avec une syntaxe plus proche de celle habituelle en Python.
De plus, elles permettent de combiner un map et un filter en même temps
"""

print("### utilisation des list comprehensions avec les object list")

tab = [1, 2, 3, 4, 5, 6, 7]
print("valeur de tab ", strC(tab) )

print("Affiche les carrés des éléments")
print(" [x ** 2 for x in tab] ")
print( [x ** 2 for x in tab] ) # Équivaut à notre map, en plus lisible et plus simple :) .
# [1, 4, 9, 16, 25, 36, 49]

print("Affiche les nombres pairs")
print(" [x for x in tab if x % 2 == 0] ")
print( [x for x in tab if x % 2 == 0] ) # Plus simple que filter, également :)
# [2, 4, 6]

print("Affiche les carrés des nombres pairs (combinaison des deux)")
print(" print( [x ** 2 for x in tab if x ** 2 % 2 == 0] ) ")
print( [x ** 2 for x in tab if x ** 2 % 2 == 0] )# [4, 16, 36] ou
print(" [x for x in [a ** 2 for a in tab] if x % 2 == 0] ")
print( [x for x in [a ** 2 for a in tab] if x % 2 == 0] ) # [4, 16, 36]

Ne nécessite pas d'import de module particulier, forme d'écriture un peu plus compacte,
mais pas forcément plus facile à lire

Examen du code type <<list comprehensions>>

Prenons la ligne de code suivante:

[x ** 2 for x in tab if x ** 2 % 2 == 0]

elles se lit de la façon suivante

x**2    Mettre x à la puissance 2 (donc x²)

for x in tab    Nous indique les éléments x sur lesquels agir, ici tous les éléments de tab, tab est un object list

if x**2 %2 ==0    Spécifie la condition, le filtre pour que x soit pris en compte dans la réponse; ici x puissance 2 est pair
nous aurions pu également écrire x % 2 == 0 comme condition ou filtre

En résumé:

opération, calcul, formule, sur x

définit ce qui est x, en général x est un elt de tab, object list

conditions ou filtre à appliquer, sur x ou le calcul effectué sur x, à préciser sur quoi porte le test .

 

liste 2ème partie - fonctions communes

 

"""

tester les list [a, b]

"""

import claudecnx.useIt2021_01 as go # module externe claudecnx as namespace go

import copy # module interne; copy.deepcopy()

 

obj01 = [1, 2, 3, 2.5, "a", "per"]

obj02 = [1, 2, 3, 2.5]

obj03 = ["a", "per"]

 

"""

all()

"""

print(" all() ")

bValeur = all(obj01)

print( bValeur ) # True

"""

all()

returns True if all elements of the set are true (or if the set is empty).

"""

 

"""

any()

"""

print(" any() ")

 

bValeur = any( obj01 )

print( bValeur ) # True

"""

any()

Returns True if any element of the set is true. If the set is empty, returns False.

"""

 

"""

enumerate()

"""

print(" enumerate() ")

 

obj = enumerate(obj01)

 

print( type(obj) ) # <class 'enumerate'>

print( go.typeIs(obj) ) # enumerate

print( go.isWhat(obj) ) # {} est de type enumerate - iterable? True

print( go.strc(obj) ) # {}

 

obj04 = copy.deepcopy(obj)

print( type(obj) ) # <class 'enumerate'>

print( obj ) # <enumerate object at 0x00000242929B5DC0>

print("enumerate as dict ", dict(obj04) ) # {0: 1, 1: 2, 2: 3, 3: 'per', 4: 'a'}; vide obj02

obj04 = copy.deepcopy(obj)

print("enumerate as list ", list(obj04) ) # [(0, 1), (1, 2), (2, 3), (3, 'a'), (4, 'per')];

# l'ordre reste aléatoire, vide obj

"""

enumerate()

Returns an enumerate object. It contains the index and value for all the items of the set as a pair.

attention l'application de list() ou dict() sur cet object enumerate vide cet objet

il faut donc utiliser copy.deepcopy() pour obtenir une copie indépendante de l'objet enumerate

need to import:

import copy # module interne; copy.deepcopy()

"""

 

 

"""

len() nombre d'éléments dans un object

"""

print(" len() nombre d'éléments dans un object")

 

print( len(obj01) ) #

"""

len()

Returns the length (the number of items) in the set.

"""

 

"""

max() le plus grand item

"""

print("max() le plus grand item")

 

print( max(obj02) ) # 3

print( max(obj03) ) # "per"

try:

    print( max(obj01) ) # Something is not defined '>' not supported between instances of 'str' and 'int'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

"""

max()

Returns the largest item in the set.

on ne peut pas mélanger des str avec des int

"""

 

 

"""

min() le plus petit item

"""

print("min() le plus petit item")

 

print( min(obj02) ) # 1

print( min(obj03) ) # "a"

try:

    print( min(obj01) ) # Something is not defined '>' not supported between instances of 'str' and 'int'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

"""

min()

Returns the smallest item in the set.

on ne peut pas mélanger des str avec des int

"""

 

"""

sorted()

"""

print(" sorted()")

 

list02 = sorted( obj02 )

print( list02 ) # [1, 2, 2.5, 3]

list03 = sorted( obj03 )

print( list03 ) # ['a', 'per']

 

try:

    print( sorted(obj01) ) # Something is not defined '>' not supported between instances of 'str' and 'int'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

 

"""

sorted()

Returns a new sorted list from elements in the set(does not sort the set itself).

on ne peut pas mélanger des str avec des int ou float

"""

 

 

"""

sum()

"""

print(" sum() ")

 

valeur02 = sum( obj02 )

print( valeur02 ) # 8.5

 

 

try:

    print( sum(obj03) ) # Something is not defined '>' Something is not defined unsupported operand type(s) for +: 'float' and 'str'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

 

try:

    print( sum(obj01) ) # Something is not defined '>' Something is not defined unsupported operand type(s) for +: 'float' and 'str'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

 

"""

sum()

Returns the sum of all elements in the set.

on ne peut pas mélanger des str avec des int ou float; error

ne sait pas faire une somme de str; error

"""

 

 

"""

source inspiration

https://www.programiz.com/python-programming/set

"""

 

 

Type tuple (a, b)

Un tuple permet de créer une collection ordonnée de plusieurs éléments.

on ne peut pas modifier les tuples une fois qu’ils ont été créés; On dit qu’un tuple n’est pas mutable.

On le définit avec des parenthèses.

tp01 = (1,2,3)

mais on peut aussi écrire:

a, b  = 1, 2

c'est équivallent à:

(a, b) = (1, 2)

tp01 = (10, 20)

x, y = tp01

implique que

x=10

y=20

"""

tester les tuple

tuple object n'est pas modifiable, immutable

"""

# import claudecnx.useIt2021_01 as go # module externe claudecnx as namespace go

 

tp01 = (3, 4, 7)

"""

print( type(tp01) ) # <class 'tuple'>

print( go.typeIs(tp01) ) # tuple

print( go.isWhat(tp01) ) # (3,4,7) est de type tuple - iterable? True

print( go.strc(tp01) ) # (3,4,7)

"""

print()

"""

Créer un tuple - formes d'écriture

"""

print("Créer un tuple #formes d'écriture")

tp01 = (3, 4, 7)

tp02 = ()

tp03 = 1, 2, 3 # parenthèses non obligatoires, mais conseillées

a, b  = 100, 200 # affectation multiple

print( type( (a, b) ) ) # <class 'tuple'>

tp04 = (a, b)

print ( type(tp04) ) # <class 'tuple'>

tp05 = tuple(("apple", "banana", "cherry")) # tuple() Constructor - note the double round-brackets

tp06 = ("abc", 34, True, 40.25, "chaine") # tuple with strings, integers, float and boolean

 

print()

"""

Récupérer, obtenir les valeurs du tuple

"""

tp01 = (10, 20)

x, y = tp01 # renvoie le couple x, y qui contient les valeurs respectives du tuple

print(x)

print(y)

print()

"""

Créer une fonction qui renvoie un tuple

"""

print("Créer une fonction qui renvoie un tuple")

# Il suffit d’indiquer ce tuple après return.

def test01():

    return 3, 4 # retourne plusieurs valeurs  as tuple lors de l'appel d'une fonction

a, b = test01() # a et b contiennent les valeurs du tupe (a, b) retourné par la fonction tes01()

print(a)

print(b)

print()

"""

Parcourir, Itérer sur les éléments d’un tuple

"""

print("Itérer sur les éléments d’un tuple")

tp02 = (1,2,3,4,5,6)

for i in tp02:

    print(i)

"""

Itérer sur les éléments d’un tuple

1

2

3

4

5

6

"""

print()

"""

Obtenir la valeur d’un élément du tuple

"""

print("Obtenir la valeur d’un élément du tuple")

print( tp02[2] ) # 3 on peut accèder à la valeur d'un élément du tuple via son indice; indice = 0 => premier elt du tuple

print()

"""

Créer un tuple avec un seul élément

"""

print("Créer un tuple qui contient un seul élément ")

tp03 = (5,) # il faut mettre la virgule après ce seul et unique argument

print( type(tp03) ) # <class 'tuple'>

"""

Récupérer, Obtenir la valeur d'un tuple à 1 seul élément

"""

print("Récupérer la valeur dans un tuple à 1 seul élément")

valeur = tp03[0] # avec son indice; comme un seul elt, indice = 0

print( valeur ) # 5

valeur, = tp03

print( valeur ) # 5

list01 = [5]

v, = list01 # fonctionne aussi pour les list

print ( v ) # 5

print( type(v) ) # <class 'int'>

print( type(v,) ) # <class 'int'>

print()

"""

Nombre d'éléments dans un tuple

"""

print("Nombre d'éléments dans un tuple")

print( len( tp02) ) # 6

 

"""

source inspiration

https://courspython.com/tuple.html

"""

 

 

tuple 2ème partie - fonctions communes

"""

tester les tuple (a, b)

tuple object n'est pas modifiable, immutable

"""

 

import claudecnx.useIt2021_01 as go # module externe claudecnx as namespace go

import copy # module interne; copy.deepcopy()

obj01 = (1, 2, 3, 2.5, "a", "per")

obj02 = (1, 2, 3, 2.5)

obj03 = ("a", "per")

"""

all()

"""

print(" all() ")

bValeur = all(obj01)

print( bValeur ) # True

"""

all()

returns True if all elements of the set are true (or if the set is empty).

"""

 

"""

any()

"""

print(" any() ")

 

bValeur = any( obj01 )

print( bValeur ) # True

"""

any()

Returns True if any element of the set is true. If the set is empty, returns False.

"""

 

"""

enumerate()

"""

print(" enumerate() ")

 

obj = enumerate(obj01)

 

print( type(obj) ) # <class 'enumerate'>

print( go.typeIs(obj) ) # enumerate

print( go.isWhat(obj) ) # {} est de type enumerate - iterable? True

print( go.strc(obj) ) # {}

 

obj04 = copy.deepcopy(obj)

print( type(obj) ) # <class 'enumerate'>

print( obj ) # <enumerate object at 0x00000242929B5DC0>

print("enumerate as dict ", dict(obj04) ) # {0: 1, 1: 2, 2: 3, 3: 'per', 4: 'a'}; vide obj02

obj04 = copy.deepcopy(obj)

print("enumerate as list ", list(obj04) ) # [(0, 1), (1, 2), (2, 3), (3, 'a'), (4, 'per')];

# l'ordre reste aléatoire, vide obj

"""

enumerate()

Returns an enumerate object. It contains the index and value for all the items of the set as a pair.

attention l'application de list() ou dict() sur cet object enumerate vide cet objet

il faut donc utiliser copy.deepcopy() pour obtenir une copie indépendante de l'objet enumerate

need to import:

import copy # module interne; copy.deepcopy()

"""

 

"""

len() nombre d'éléments dans un object

"""

print(" len() nombre d'éléments dans un object")

 

print( len(obj01) ) #

"""

len()

Returns the length (the number of items) in the set.

"""

 

"""

max() le plus grand item

"""

print("max() le plus grand item")

 

print( max(obj02) ) # 3

print( max(obj03) ) # "per"

try:

    print( max(obj01) ) # Something is not defined '>' not supported between instances of 'str' and 'int'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

"""

max()

Returns the largest item in the set.

on ne peut pas mélanger des str avec des int

"""

 

"""

min() le plus petit item

"""

print("min() le plus petit item")

 

print( min(obj02) ) # 1

print( min(obj03) ) # "a"

try:

    print( min(obj01) ) # Something is not defined '>' not supported between instances of 'str' and 'int'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

"""

min()

Returns the smallest item in the set.

on ne peut pas mélanger des str avec des int

"""

 

"""

sorted()

"""

print(" sorted()")

 

list02 = sorted( obj02 )

print( list02 ) # [1, 2, 2.5, 3]

list03 = sorted( obj03 )

print( list03 ) # ['a', 'per']

 

try:

    print( sorted(obj01) ) # Something is not defined '>' not supported between instances of 'str' and 'int'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

 

"""

sorted()

Returns a new sorted list from elements in the set(does not sort the set itself).

on ne peut pas mélanger des str avec des int ou float

"""

 

 

"""

sum()

"""

print(" sum() ")

valeur02 = sum( obj02 )

print( valeur02 ) # 8.5

 

try:

    print( sum(obj03) ) # Something is not defined '>' Something is not defined unsupported operand type(s) for +: 'float' and 'str'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

 

try:

    print( sum(obj01) ) # Something is not defined '>' Something is not defined unsupported operand type(s) for +: 'float' and 'str'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

 

"""

sum()

Returns the sum of all elements in the purple

on ne peut pas mélanger des str avec des int ou float; error

ne sait pas faire une somme de str; error

"""

 

"""

source inspiration

https://www.programiz.com/python-programming/set

"""

 

 

Type set , ensemble {a, b}

 les set() ou ensemble présente quelques avantages

Tous les principes sur la théorie des ensembles s'appliquent aux set(), union, intersection...

un set() ne contient pas de doublons, chaque valeur est unique ;
tout doublon est supprimé pour ne laisser qu'une seule valeur unique

Aussi pour obtenir les valeurs uniques d'un list par exemple il suffit de le transformer en set, puis de revenir au list

"""

tester les set {a, b}

set object n'est pas modifiable, immutable, unchangeable

Once a set is created, you cannot change its items, but you can add new items

set object n'est pas ordonné, on ne sait pas dans quel ordre apparaissent les éléments

set object Duplicates Not Allowed, conséquence du fait que set n'est pas modifiable

pas de doublons, chaque valeur est unique

"""

import claudecnx.useIt2021_01 as go # module externe claudecnx as namespace go

import copy # module interne; copy.deepcopy()

set01 = {"pomme", "banane", "cerise"}

"""

print( type(set01) ) # <class 'set'>

print( go.typeIs(set01) ) # set

print( go.isWhat(set01) ) # {'pomme', 'cerise', 'banane'} est de type set - iterable? True

print( go.strc(set01) ) # {'pomme', 'cerise', 'banane'}

"""

 

"""

Créer un set

"""

print("Créer un set")

set01 = {"abc", 34, True, 40.25, "male", ("a", "b"), "chaine"}# les set acceptent de multiples types de données

# list, dict ne sont pas admis comme elt dans un set

print(set01)

set02 = set(("apple", "banana", "cherry")) # set() Constructor - note the double round-brackets

print(set02)

set03 = set([1, 2, 3, 2]) # création depuis un list, transforme list en set

print(set03) # {1, 2, 3} les valeurs dupliquées sont ignorées

dict04 = {} # dict vide, ce n'est pas un set

print( type(set04) ) # <class 'dict'>

set05 = set() # set vide

print( type(set05) ) # <class 'set'>

"""

Longueur d'un set, nombre d'éléments

"""

print("Longueur d'un set, nombre d'éléments")

print( len(set02) )

"""

Duplicates Not Allowed unicité, unique

"""

print("Duplicates elt Not Allowed")

set03 = {"apple", "banana", "cherry"}

set03 = {"apple", "banana", "cherry", "apple"}

print( set03 ) # {'cherry', 'apple', 'banana'}; apple n'apparaît qu'une seule fois

print( len(set03) ) # 3

"""

dans un set chaque elt est unique et ne peut pas être dupliqué

toutefois cela ne génère pas d'erreur

mais l'elt dupliqué n'apparaît qu'une seule fois

de même l'elt dupliqué n'est pris qu'une seule fois en compte pour la longueur du set

"""

 

"""

ajouter des elt

"""

print("ajouter des elt")

set01 = { "a", "b"}

set01.add("c") # {'c', 'a', 'b'}

print( set01 )

list01 = [2, 3, 4]

set01.update( list01 )

print( set01) # {2, 3, 4, 'c', 'a', 'b'}

set02 = {10, 11, 12}

list02 = [20, 21,22]

set01.update( list02, set02 )

print( set01 ) # {2, 3, 4, 10, 11, 12, 20, 21, 22, 'c', 'a', 'b'}

"""

2 méthodes pour ajouter des elt

add() ajoute un seul elt

add()

Adds an element to the set

update() ajoute plusieurs elt simultanéments

update()

Updates the set with the union of itself and others

"""

 

"""

Supprimer retirer des elt

"""

print("Supprimer retirer des elt")

set01 = {1, 2, 3, 4, 5, 6, "a"}

valeur = 4

set01.discard(valeur) # discard() supprime une valeur

print( set01) # {1, 2, 3, 5, 6}

print ( set01.discard("b") ) # ne provoque pas d'erreur si valeur n'existe pas!

"""

discard()

Removes an element from the set if it is a member.

(Do nothing if the element is not in set); not raises a KeyError

"""

valeur = 2

set01.remove(valeur) # remove() supprime une valeur

print( set01 ) # {1, 3, 5, 6}

"""

remove()

Removes an element from the set.

If the element is not a member, raises a KeyError

"""

try:

    print( set01.remove("b") ) # provoque une erreur si elt n'existe pas

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) # Something is not defined 'b'  

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

"""

clear() supprime tous les elts

"""

set01.clear() # clear() supprime tous les elts

print( set01 ) # set()

"""

clear()

Removes all elements from the set

"""

 

set01 = {"a", 1, 2, 3, "b"}

valeur = set01.pop() # supprime un elt de manière aléatoire et retourne sa valeur

print( valeur ) # 1

print( set01 ) # {2, 3, 'a', 'b'}

"""

Résumé pour suppr elt in a set

  • set01.discard("b")  # ne provoque pas d'erreur si valeur n'existe pas!
  • set01.remove(valeur) # provoque une erreur si valeur n'existe pas
  • set01.clear() # clear() supprime tous les elts
  • valeur = set01.pop() # supprime un elt de manière aléatoire et retourne sa valeur

"""

 

"""

Union de set()

"""

print("Union de set()")

set01 = {1,2,3}

set02 = {3,4,5}

set03 = set01 | set02

print( set03 ) # {1, 2, 3, 4, 5}

set04 = set01.union(set02)

print( set04 ) # {1, 2, 3, 4, 5}

"""

union()

Returns the union of sets in a new set

"""

set08 = {1,2,3}

set09 = {3,4,5}

set08.update( set09 )

print("union with update() ", set08 ) # {1, 2, 3, 4, 5}

"""

Updates the set with the union of itself and others

"""

 

"""

Intersection  de  set()

"""

print("Intersection  de  set()")

set01 = {1,2,3}

set02 = {3,4,5}

set03 = set01 & set02

print( set03 ) # {3}

set04 = set01.intersection(set02)

print( set04 ) # {3}

"""

intersection()

Returns the intersection of two sets as a new set

"""

set08 = {1,2,3}

set09 = {3,4,5}

set08.intersection_update( set09 ) # {3}

print("intersection_update() with update() ", set08 )

"""

Updates the set with the intersection of itself and another

"""

 

"""

Difference de  set()

"""

print("Difference de  set()")

set01 = {1,2,3}

set02 = {3,4,5}

set03 = set01-set02 # elt dans set01 seulement et non compris dans set02

print( set03 ) # {1, 2}

set04 = set01.difference(set02)

print( set04 ) # {1, 2}

"""

difference()

Returns the difference of two or more sets as a new set

"""

set08 = {1,2,3}

set09 = {3,4,5}

set08.difference_update( set09 ) # {1, 2}

print("difference_update() with update() ", set08 )

"""

difference_update()

Removes all elements of another set from this set

"""

 

"""

Symmetric Difference de set()

"""

print(" Symmetric Difference de set()")

set01 = {1,2,3}

set02 = {3,4,5}

set03 = set01^set02

print( set03 ) # {1, 2, 4, 5}

set04 = set01.symmetric_difference(set02)

print( set04 ) # {1, 2, 4, 5}

"""

Symmetric Difference de A et B est un set()

constitué des elements de  A et B mais pas des éléments commun à A et B

(excluding the intersection).

"""

set08 = {1,2,3}

set09 = {3,4,5}

set08.symmetric_difference_update( set09 )

print("difference_update() with update() ", set08 ) # {1, 2, 4, 5}

"""

symmetric_difference_update()

Updates a set with the symmetric difference of itself and another

"""

 

"""

Copie d'un set()

"""

print("Copie d'un set()")

set01 = {1,2,3}

set02 = set01.copy() # copie indépendante du set()

set01.add("a")

print( set01 ) # {'a', 1, 2, 3}

print( set02 ) # {1, 2, 3}

"""

copy()

Returns a copy of the set

"""

 

"""

isdisjoint()

"""

print("isdisjoint()")

set01 = {1,2,3}

set02 = {3,4,5}

boolValeur = set01.isdisjoint( set02 )

print ( boolValeur ) # False

"""

isdisjoint()

Returns True if two sets have a null intersection

"""         

 

"""

issubset()

"""

print("issubset() ")

set01 = {1, 2, 3, 4, 5, 6}

set02 = {3, 4, 5}

boolValeur = set02.issubset(set01)

print(boolValeur) # True; set02 est inclus dans set01

"""

issubset()

Returns True if another set contains this set

"""

 

"""

issuperset()

"""

print("issuperset()")

set01 = {1, 2, 3, 4, 5, 6}

set02 = {3, 4, 5}

boolValeur = set01.issuperset( set02 )

print( boolValeur ) # True, set01 contient set02

"""

issuperset()

Returns True if this set contains another set

"""

 

"""

Contient elt, ne contient pas

"""

print("Contient elt")

set01 = {"a", "b", "c"}

print( "b" in set01 ) # True contient elt

print("d" in set01 ) # False

set02 = set("apple")

print('a' in set02) # True

print('p'  in set02) # True

print('p' not in set02) # False, ne contient pas

 

"""

parcourir un set

"""

print("parcourir un set")

set01 = {1, 2, 3, 4, 5, 6, "a", "per"}

for elt in set01:

    print(elt)

"""

parcourir un set

1

2

3

4

5

6

per

a

"""

 

"""source inspiration

https://www.w3schools.com/python/python_sets.asp

https://www.programiz.com/python-programming/set

"""

 

 

set 2ème partie - fonctions communes

 

"""

tester les set {a, b}

set object n'est pas modifiable, immutable, unchangeable

Once a set is created, you cannot change its items, but you can add new items

set object n'est pas ordonné, on ne sait pas dans quel ordre apparaissent les éléments

set object Duplicates Not Allowed, conséquence du fait que set n'est pas modifiable

"""

import claudecnx.useIt2021_01 as go # module externe claudecnx as namespace go

import copy # module interne; copy.deepcopy()

"""

all()

"""

print(" all() ")

set01 = {1, 2, 3, 4, 5, 6, "a", "per"}

bValeur = all(set01)

print( bValeur ) # True

"""

all()

returns True if all elements of the set are true (or if the set is empty).

"""

 

"""

any()

"""

print(" any() ")

set01 = {1, 2, 3, 4, 5, 6, "a", "per"}

bValeur = any( set01 )

print( bValeur ) # True

"""

any()

Returns True if any element of the set is true. If the set is empty, returns False.

"""

 

"""

enumerate()

"""

print(" enumerate() ")

set01 = {1, 2, 3, "a", "per"}

obj = enumerate(set01)

 

print( type(obj) ) # <class 'enumerate'>

print( go.typeIs(obj) ) # enumerate

print( go.isWhat(obj) ) # {} est de type enumerate - iterable? True

print( go.strc(obj) ) # {}

 

obj02 = copy.deepcopy(obj)

print( type(obj) ) # <class 'enumerate'>

print( obj ) # <enumerate object at 0x00000242929B5DC0>

print( dict(obj02) ) # {0: 1, 1: 2, 2: 3, 3: 'per', 4: 'a'}; vide obj02

obj02 = copy.deepcopy(obj)

print( list(obj02) ) # [(0, 1), (1, 2), (2, 3), (3, 'a'), (4, 'per')];

# l'ordre reste aléatoire, vide obj

"""

enumerate()

Returns an enumerate object. It contains the index and value for all the items of the set as a pair.

attention l'application de list() ou dict() sur cet object enumerate vide cet objet

il faut donc utiliser copy.deepcopy() pour obtenir une copie indépendante de l'objet enumerate

need to import:

import copy # module interne; copy.deepcopy()

"""

 

 

"""

len() nombre d'éléments dans un object

"""

print(" len() nombre d'éléments dans un object")

set01 = {1, 2, 3, "a", "per"}

print( len(set01) ) #

"""

len()

Returns the length (the number of items) in the set.

"""

 

"""

max() le plus grand item

"""

print("max() le plus grand item")

set01 = {1, 2, 3, "a", "per"}

set02 = {1, 2, 3, 2.5}

set03 = {"a", "per"}

print( max(set02) ) # 3

print( max(set03) ) # "per"

try:

    print( max(set01) ) # Something is not defined '>' not supported between instances of 'str' and 'int'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

"""

max()

Returns the largest item in the set.

on ne peut pas mélanger des str avec des int

"""

 

"""

min() le plus petit item

"""

print("min() le plus petit item")

set01 = {1, 2, 3, "a", "per"}

set02 = {1, 2, 3, 2.5}

set03 = {"a", "per"}

print( min(set02) ) # 1

print( min(set03) ) # "a"

try:

    print( min(set01) ) # Something is not defined '>' not supported between instances of 'str' and 'int'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

"""

min()

Returns the smallest item in the set.

on ne peut pas mélanger des str avec des int

"""

 

"""

sorted()

"""

print(" sorted()")

set01 = {1, 2, 3, 2.5, "a", "per"}

set02 = {1, 2, 3, 2.5}

set03 = {"a", "per"}

list02 = sorted( set02 ) # retourne un object list

print( list02 ) # [1, 2, 2.5, 3]

list03 = sorted( set03 )

print( list03 ) # ['a', 'per']

 

try:

    print( sorted(set01) ) # Something is not defined '>' not supported between instances of 'str' and 'int'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

 

"""

sorted()

Returns a new sorted list from elements in the set(does not sort the set itself).

on ne peut pas mélanger des str avec des int ou float

"""

 

 

"""

sum()

"""

print(" sum() ")

set01 = {1, 2, 3, 2.5, "a", "per"}

set02 = {1, 2, 3, 2.5}

set03 = {"a", "per"}

valeur02 = sum( set02 )

print( valeur02 ) # 8.5

 

try:

    print( sum(set03) ) # Something is not defined '>' Something is not defined unsupported operand type(s) for +: 'float' and 'str'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

 

try:

    print( sum(set01) ) # Something is not defined '>' Something is not defined unsupported operand type(s) for +: 'float' and 'str'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

 

"""

sum()

Returns the sum of all elements in the set.

on ne peut pas mélanger des str avec des int ou float; error

ne sait pas faire une somme de str; error

"""

 

"""

source inspiration

https://www.programiz.com/python-programming/set

"""

 

 

type dict, dictionnaire { key: value }

Dans un object dictionnaire les données sont délimitées par des accolades { ...}

elles sont définies par paires

exemple:

mydict = {"mamifère": "Baleine", "poisson": "requin"}

mamifère et poisson sont dites key ou cle

Baleine et requin sont les valeurs respectives de chacune de ces cle

Dans un object dictionnaire, chaque elt est donc défini en précisant une clé au moyen d’une chaîne de caractères suivie de : puis de la valeur associée à cette cle

On accède à une valeur du dictionnaire en utilisant la clé entourée par des crochets comme ceci

valeur = mydict["mamifere"] # retourne la valeur "Baleine"

Pour ajouter un élément à un dictionnaire, il suffit d’affecter une valeur pour la nouvelle clé.

mydict["oiseau"] = "Aigle"

il est posible de créer un dictionnaire vide

mydict02 = {}

puis d'y ajouter les paires key, item comme précédemment

mydict02["couleur"] = "verte"

Tester les dictionnaires

"""
tester les dictionnaires
"""

import claudecnx.useIt2021_01 as go # module externe claudecnx as namespace go

dico01 = {"Mammifère marin": "Baleine", "Oiseau": "Aigle", "Poisson": "Requin"}

"""
print( type(dico01) ) # <class 'dict'>
print( go.typeIs(dico01) ) # dict
print( go.isWhat(dico01) ) # {'Mammifère marin': 'Baleine', 'Oiseau': 'Aigle', 'Poisson': 'Requin'} est de type dict - iterable? True
print( go.strc(dico01) ) # {'Mammifère marin': 'Baleine', 'Oiseau': 'Aigle', 'Poisson': 'Requin'}
"""

 

Parcourir un dictionnaire

print()
print("Parcourir un dictionnaire")

for i in dico01.items():
    print(i)
"""
Parcourir un dictionnaire
('Mammifère marin', 'Baleine')
('Oiseau', 'Aigle')
('Poisson', 'Requin')
"""

print("Parcourir dict avec cle et valeur")
for key, value in dico01.items():
    print("la cle est: ", key, "associée à la valeur ", value)
"""
Parcourir dict avec cle et valeur
la cle est:  Mammifère marin associée à la valeur  Baleine
la cle est:  Oiseau associée à la valeur  Aigle
la cle est:  Poisson associée à la valeur  Requin
"""

 

Ajouter une paire, un élément, à un object dict

print()
print("Ajouter une paire à dict")

dico01["Serpent"] = "Cobra" # ajoute la paire Serpent, Cobra
print ( "%s" % dico01 ) # dict  as str
"""
Ajouter une paire à dict
{'Mammifère marin': 'Baleine', 'Oiseau': 'Aigle', 'Poisson': 'Requin', 'Serpent': 'Cobra'}
"""

 

Créer un dict vide et y ajouter des valeurs

print()
print("Créer un dict vide, y ajouter des paires, méthode avec {}")

# Créer un dict vide, y ajouter des paires, méthode avec {}

dico02 = {} # dict vide
dico02["Mammifere"] = "Chien"
print ( "%s" % dico02 ) # dict  as str
"""
Créer un dict vide, y ajouter des paires
{'Mammifere': 'Chien'}
"""

print("Créer un dict vide, y ajouter des paires, méthode avec dict()")

# Créer un dict vide, y ajouter des paires, méthode avec dict()

dico03 = dict() # new dict vide
dico02["Mammifere"] = "Chien"
print ( "%s" % dico03 ) # dict as str
"""
Créer un dict vide, y ajouter des paires
{'Mammifere': 'Chien'}
"""

 

Récupérer une valeur dans un dict

print()
print("récupérer une valeur dans un dict")

print( dico01["Serpent"] ) # Cobra

 

print("récupérer une valeur dans un dict")

print( dico01.get("Serpent") ) # Cobra

2 méthodes

valeur = dico[key] # key as str

valeur = dico.get(key) # key as str

 

Vérifier la présence d'une clé dans un dict

print()
print("vérifier la présence d'une clé dans un dict")

# print( dico01.hasKey("Serpent") ) # ne fonctionne plus sous Python3 ../images/stop.png

print( 'Serpent' in dico01 )  # True

 

Convertir dict en list

print()
print("Convertir dict en list")

list01 = list( dico01.items() )

print( list01)

"""
Convertir dict en list
[('Mammifère marin', 'Baleine'), ('Oiseau', 'Aigle'), ('Poisson', 'Requin'), ('Serpent', 'Cobra')]
"""

 

Supprimer une entrée dans un dict

print("supprimer une entrée dans un dict")

del dico01["Serpent"]

print ( "%s" % dico01 ) # dict as str

"""
supprimer une entrée dans un dict
{'Mammifère marin': 'Baleine', 'Oiseau': 'Aigle', 'Poisson': 'Requin'}
"""

 

Récupérer les clés d'un dict

print("Récupérer les clés d'un dict")

for cle in dico01.keys():

    print(cle)

"""
récupérer les clés d'un dict
Mammifère marin
Oiseau
Poisson
"""

 

Récupérer les valeurs d'un dict

print("Récupérer les valeurs d'un dict")

for valeur in dico01.values():

    print(valeur)

"""

récupérer les valeurs d'un dict

Baleine

Aigle

Requin

"""

 

Récupérer les clés et les valeurs d'un dict

print("Récupérer les clés et les valeurs d'un dict")

for cle,valeur in dico01.items():

    print( cle, valeur )

"""

récupérer les clés et les valeurs d'un dict

Mammifère marin Baleine

Oiseau Aigle

Poisson Requin

"""

 

Utiliser des tuples comme clé dans un dict

print("Utiliser des tuples comme clé dans un dict")

dico04 = {}

dico04[(3, 2)]=12

dico04[(4, 5)]=13

print( dico04 )

print("utile dans l'utilisation de coordonnées ! ") ../images/idea.png

"""

utiliser des tuples comme clé dans un dict

{(3, 2): 12, (4, 5): 13}

"""

 

Créer une copie indépendante d'un dict

print("Créer une copie indépendante d'un dict")

dico05 = dico01.copy()

dico01["Oiseau"] = "Faucon"

print(dico05)

print(dico01)

"""

créer une copie indépendante d'un dict

{'Mammifère marin': 'Baleine', 'Oiseau': 'Aigle', 'Poisson': 'Requin'}

{'Mammifère marin': 'Baleine', 'Oiseau': 'Faucon', 'Poisson': 'Requin'}

"""

 

Fusionner des dict

dico01.update(dico02)

print(dico01)

"""

 fusionner des dict

{'Mammifère marin': 'Baleine', 'Oiseau': 'Faucon', 'Poisson': 'Requin', 'Mammifere': 'Chien'}

"""

Fusionner, ajouter ou concaténer des dict ensemble!

 

Compter les nombre d'éléments, de paires, dans un dict

print("Compter les nombre d'éléments, de paires, dans un dict")

print( len(dico01) ) # 4 paires après le update

 

 

Résumé sur l'objet dict

 

"""

tester les dictionnaires

"""

 import claudecnx.useIt2021_01 as go # module externe claudecnx as namespace go

 dico01 = {"Mammifère marin": "Baleine", "Oiseau": "Aigle", "Poisson": "Requin"}

 """

print( type(dico01) ) # <class 'dict'>

print( go.typeIs(dico01) ) # dict

print( go.isWhat(dico01) ) # {'Mammifère marin': 'Baleine', 'Oiseau': 'Aigle', 'Poisson': 'Requin'} est de type dict - iterable? True

print( go.strc(dico01) ) # {'Mammifère marin': 'Baleine', 'Oiseau': 'Aigle', 'Poisson': 'Requin'}

"""

 print()

print("Parcourir un dictionnaire")

for i in dico01.items():

    print(i)

"""

Parcourir un dictionnaire

('Mammifère marin', 'Baleine')

('Oiseau', 'Aigle')

('Poisson', 'Requin')

"""

print("Parcourir dict avec cle et valeur")

for key, value in dico01.items():

    print("la cle est: ", key, "associée à la valeur ", value)

"""

Parcourir dict avec cle et valeur

la cle est:  Mammifère marin associée à la valeur  Baleine

la cle est:  Oiseau associée à la valeur  Aigle

la cle est:  Poisson associée à la valeur  Requin

"""

 print()

print("Ajouter une paire à dict")

dico01["Serpent"] = "Cobra" # ajoute la paire Serpent, Cobra

print ( "%s" % dico01 ) # dict as str

"""

Ajouter une paire à dict

{'Mammifère marin': 'Baleine', 'Oiseau': 'Aigle', 'Poisson': 'Requin', 'Serpent': 'Cobra'}

"""

 print()

print("Créer un dict vide, y ajouter des paires, méthode avec {}")

dico02 = {} # dict vide

dico02["Mammifere"] = "Chien"

print ( "%s" % dico02 ) # dict as str

"""

Créer un dict vide, y ajouter des paires

{'Mammifere': 'Chien'}

"""

print("Créer un dict vide, y ajouter des paires, méthode avec dict()")

dico03 = dict() # new dict vide

dico02["Mammifere"] = "Chien"

print ( "%s" % dico03 ) # dict as str

"""

Créer un dict vide, y ajouter des paires

{'Mammifere': 'Chien'}

"""

 print()

print("récupérer une valeur dans un dict")

print( dico01["Serpent"] ) # Cobra

 

print("récupérer une valeur dans un dict")

print( dico01.get("Serpent") ) # Cobra

 

print()

print("vérifier la présence d'une clé dans un dict")

# print( dico01.hasKey("Serpent") ) # ne fonctionne plus sous Python3

print( 'Serpent' in dico01 )  # True

 

print()

print("Convertir dict en list")

list01 = list( dico01.items() )

print( list01)

"""

Convertir dict en list

[('Mammifère marin', 'Baleine'), ('Oiseau', 'Aigle'), ('Poisson', 'Requin'), ('Serpent', 'Cobra')]

"""

 print()

print("supprimer une entrée dans un dict")

del dico01["Serpent"]

print ( "%s" % dico01 ) # dict as str

"""

supprimer une entrée dans un dict

{'Mammifère marin': 'Baleine', 'Oiseau': 'Aigle', 'Poisson': 'Requin'}

"""

 print()

print("récupérer les clés d'un dict")

for cle in dico01.keys():

    print(cle)

"""

récupérer les clés d'un dict

Mammifère marin

Oiseau

Poisson

"""

print()

print("récupérer les valeurs d'un dict")

for valeur in dico01.values():

    print(valeur)

"""

récupérer les valeurs d'un dict

Baleine

Aigle

Requin

"""

print()

print("récupérer les clés et les valeurs d'un dict")

for cle,valeur in dico01.items():

    print( cle, valeur )

"""

récupérer les clés et les valeurs d'un dict

Mammifère marin Baleine

Oiseau Aigle

Poisson Requin

"""

print()

print("utiliser des tuples comme clé dans un dict")

dico04 = {}

dico04[(3, 2)]=12

dico04[(4, 5)]=13

print( dico04 )

print("utile dans l'utilisation de coordonnées ! ")

"""

utiliser des tuples comme clé dans un dict

{(3, 2): 12, (4, 5): 13}

"""

print()

print("créer une copie indépendante d'un dict")

dico05 = dico01.copy()

dico01["Oiseau"] = "Faucon"

print(dico05)

print(dico01)

"""

créer une copie indépendante d'un dict

{'Mammifère marin': 'Baleine', 'Oiseau': 'Aigle', 'Poisson': 'Requin'}

{'Mammifère marin': 'Baleine', 'Oiseau': 'Faucon', 'Poisson': 'Requin'}

"""

print()

print(" fusionner des dict")

dico01.update(dico02)

print(dico01)

"""

 fusionner des dict

{'Mammifère marin': 'Baleine', 'Oiseau': 'Faucon', 'Poisson': 'Requin', 'Mammifere': 'Chien'}

"""

print()

print("Compter les nombre d'éléments, de paires, dans un dict")

print( len(dico01) ) # 4 paires après le update

 

 

dict 2nd partie

 

"""

tester les dictionnaires {"key": "valeur"}

les fonctions communes ci-dessous s'appliquent sur key uniquement

"""

 

import claudecnx.useIt2021_01 as go # module externe claudecnx as namespace go

import copy # module interne; copy.deepcopy()

 

obj01 = {0:1, 1:2, 2:3, 3:2.5, 4:"a", 5:"per"}

obj02 = {0:1, 1:2, 2:3, 3:2.5}

obj03 = {4:"a", 5:"per"}

 

"""

all()

"""

print(" all() ")

bValeur = all(obj01)

print( bValeur ) # false

"""

all()

returns True if all elements of the set are true (or if the set is empty).

"""

 

"""

any()

"""

print(" any() ")

 

bValeur = any( obj01 )

print( bValeur ) # True

"""

any()

Returns True if any element of the set is true. If the set is empty, returns False.

"""

 

"""

enumerate()

"""

print(" enumerate() ")

 

obj = enumerate(obj01)

 

print( type(obj) ) # <class 'enumerate'>

print( go.typeIs(obj) ) # enumerate

print( go.isWhat(obj) ) # {} est de type enumerate - iterable? True

print( go.strc(obj) ) # {}

 

obj04 = copy.deepcopy(obj)

print( type(obj) ) # <class 'enumerate'>

print( obj ) # <enumerate object at 0x00000242929B5DC0>

print("enumerate as dict ", dict(obj04) ) # {0: 1, 1: 2, 2: 3, 3: 'per', 4: 'a'}; vide obj02

obj04 = copy.deepcopy(obj)

print("enumerate as list ", list(obj04) ) # [(0, 1), (1, 2), (2, 3), (3, 'a'), (4, 'per')];

# l'ordre reste aléatoire, vide obj

"""

enumerate()

Returns an enumerate object. It contains the index and value for all the items of the set as a pair.

attention l'application de list() ou dict() sur cet object enumerate vide cet objet

il faut donc utiliser copy.deepcopy() pour obtenir une copie indépendante de l'objet enumerate

need to import:

import copy # module interne; copy.deepcopy()

"""

 

"""

len() nombre d'éléments dans un object

"""

print(" len() nombre d'éléments dans un object")

 

print( len(obj01) ) #

"""

len()

Returns the length (the number of items) in the set.

"""

 

"""

max() le plus grand item

"""

print("max() le plus grand item")

 

print( max(obj02) ) # 3

print( max(obj03) ) # "per"

try:

    print( max(obj01) ) # Something is not defined '>' not supported between instances of 'str' and 'int'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

"""

max()

Returns the largest item in the set.

on ne peut pas mélanger des str avec des int

"""

 

 

"""

min() le plus petit item

"""

print("min() le plus petit item")

 

print( min(obj02) ) # 1

print( min(obj03) ) # "a"

try:

    print( min(obj01) ) # Something is not defined '>' not supported between instances of 'str' and 'int'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

"""

min()

Returns the smallest item in the set.

on ne peut pas mélanger des str avec des int

"""

 

"""

sorted()

"""

print(" sorted()")

 

list02 = sorted( obj02 )

print( list02 ) # [1, 2, 2.5, 3]

list03 = sorted( obj03 )

print( list03 ) # ['a', 'per']

 

try:

    print( sorted(obj01) ) # Something is not defined '>' not supported between instances of 'str' and 'int'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

 

"""

sorted()

Returns a new sorted list from elements in the set(does not sort the set itself).

on ne peut pas mélanger des str avec des int ou float

"""

 

 

"""

sum()

"""

print(" sum() ")

 

valeur02 = sum( obj02 )

print( valeur02 ) # 8.5

 

 

try:

    print( sum(obj03) ) # Something is not defined '>' Something is not defined unsupported operand type(s) for +: 'float' and 'str'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

 

try:

    print( sum(obj01) ) # Something is not defined '>' Something is not defined unsupported operand type(s) for +: 'float' and 'str'

except ZeroDivisionError as err:

    print('Handling ZeroDivisionError error:', err)

except StopIteration as err:

    print('Handling StopIteration error: ', err)

except (RuntimeError, TypeError, ValueError, NameError, KeyError) as err:

    print("Something is not defined", err) #

except:

    print("Something else went wrong")

finally:

    pass

    # print("The 'try except' is finished")

 

"""

sum()

Returns the sum of all elements in the set.

on ne peut pas mélanger des str avec des int ou float; error

ne sait pas faire une somme de str; error

"""

 

 

"""

source inspiration

https://www.programiz.com/python-programming/set

"""

 

 

 

source d'inspiration: https://courspython.com/dictionnaire.html

Convertir les types de variables

"""

convertir les principaux type entre eux

list tuple set dict

"""

import claudecnx.useIt2021_01 as go # module externe claudecnx as namespace go

#import copy # module interne; copy.deepcopy()

import itertools # convertir  en dict si data not paires

 

list01 = [3, 4, 5, "a", "l"]

tp01 = (1, 2, 3, "a", "tp")

set01= {1, 2, 3, "a", "s"}

dict01={"name": "briardind", "firstname":"claude", "age":75}

 

# convertir to list

print("convert to list")

print("tuple to list ", list(tp01), " ", tp01 ) # tuple to list  [1, 2, 3, 'a', 'tp']   (1, 2, 3, 'a', 'tp')

print("set to list ", list(set01), " ", set01 ) # set to list  [1, 2, 3, 'a', 's']   {1, 2, 3, 'a', 's'}

print("dict to list ", list(dict01), " ", dict01 ) # dict to list  ['name', 'firstname', 'age']   {'name': 'briardind', 'firstname': 'claude', 'age': 75}

 

# convert to tuple

print("convert to tuple")

print("list to tuple ", tuple(list01), " " , list01) # list to tuple  (3, 4, 5, 'a', 'l')   [3, 4, 5, 'a', 'l']

print("set to tuple ", tuple(set01), " " , set01) # set to tuple  (1, 2, 3, 'a', 's')   {1, 2, 3, 'a', 's'}

print("dict to tuple ", tuple(dict01), " " , dict01) # dict to tuple  ('name', 'firstname', 'age')   {'name': 'briardind', 'firstname': 'claude', 'age': 75}

 

# convert to set

print("convert to set")

print("list to set ", set(list01), " " , list01) # list to set  {3, 4, 5, 'l', 'a'}   [3, 4, 5, 'a', 'l']

print("tuple to set ", set(tp01), " " , tp01) # tuple to set  {1, 2, 3, 'tp', 'a'}   (1, 2, 3, 'a', 'tp')

print("dict to set ", set(dict01), " " , dict01) # dict to set  {'name', 'age', 'firstname'}   {'name': 'briardind', 'firstname': 'claude', 'age': 75}

 

# convert to dict

#print("list to dict ", dict(list01), " " , list01) # TypeError: cannot convert dictionary update sequence element #0 to a sequence

# print("tuple to dict ", dict(tp01), " " , tp01) # TypeError: cannot convert dictionary update sequence element #0 to a sequence

# print("set to dict ", dict(set01), " " , dict01) # TypeError: cannot convert dictionary update sequence element #0 to a sequence

 

# convert to dict: cas de data non appairée

print()

print("convert to dict")

print()

# convert list to dict

print("convert list to dict")

iter01 = iter(list01) # converting list to iterable to avoid repetition

dict_object01 = itertools.zip_longest(iter01, iter01, fillvalue=None) # converting the plain_list to dict

dict01 = dict(dict_object01) # convert the zip_longest object to dict using `dict`

print("list to dict converted ",dict01, " " , list01) # list to dict converted  {3: 4, 5: 'a', 'l': None}   [3, 4, 5, 'a', 'l']

 

# convert tuple to dict

print("convert tuple to dict")

iter01 = iter(tp01) # converting list to iterable to avoid repetition

dict_object01 = itertools.zip_longest(iter01, iter01, fillvalue=None) # converting the plain_list to dict

dict01 = dict(dict_object01) # convert the zip_longest object to dict using `dict`

print("tuple to dict converted ",dict01, " " , tp01) # tuple to dict converted  {1: 2, 3: 'a', 'tp': None}   (1, 2, 3, 'a', 'tp')

 

# convert set to dict

print ("convert set to dict")

iter01 = iter(set01) # converting list to iterable to avoid repetition

dict_object01 = itertools.zip_longest(iter01, iter01, fillvalue=None) # converting the plain_list to dict

dict01 = dict(dict_object01) # convert the zip_longest object to dict using `dict`

print("set to dict converted ", dict01, " " , set01) # set to dict converted  {1: 2, 3: 's', 'a': None}   {1, 2, 3, 's', 'a'}

 

# convert to dict: cas des paires; fonctionne avec [paires] (paires) {paire}

print()

print("cas des paires; fonctionne avec [paires] (paires) {paire}")

print(" avec les paires la fonction dict() fonctionne!")

list_of_tuples01 = [('a', 'A'), ('b', 'B'), ('c', 'C')]

dict01 = dict(list_of_tuples01)

print("convert list of tuple to dict ", dict01, " " , list_of_tuples01)

# convert list of tuple to dict  {'a': 'A', 'b': 'B', 'c': 'C'}   [('a', 'A'), ('b', 'B'), ('c', 'C')]

 

list_of_list01 = [['a', 'A'], ['b', 'B'], ['c', 'C']]

dict01 = dict(list_of_list01)

print("convert list of list to dict ", dict01, " " , list_of_list01)

# convert list of list to dict  {'a': 'A', 'b': 'B', 'c': 'C'}   [['a', 'A'], ['b', 'B'], ['c', 'C']]

 

list_of_set01 = [{'a', 'A'}, {'b', 'B'}, {'c', 'C'}]

dict01 = dict(list_of_set01)

print("convert list of set to dict ", dict01, " " , list_of_set01)

# convert list of set to dict  {'A': 'a', 'B': 'b', 'C': 'c'}   [{'A', 'a'}, {'B', 'b'}, {'C', 'c'}]

 

 

 

Les boucles

la boucle while

 

 

 

Les conditions

Sous Python les conditions usuelles s'écrivent:

if isinstance(elt, str):
        return elt # c'est déjà une String
elif isinstance(elt, int):
        return str(elt)
elif isinstance(elt, float):
        return str(elt)
else: # valeur par défaut pour les autres cas!
        return "cas non prévu"

 if, elif qui est une contraction de elseif et else

Pour l'heure pas d'instruction de type select case, mais une succession de elif

il est malgré tout possible d'écrire une instruction de type:    variable =  condition ? valeur si vrai: valeur si faux;

il faut procéder comme suit:

################ if else sur une même ligne   #########################
num = 42
num_type = 'pair' if num % 2 == 0 else 'impair' # even=pair; odd=impair
print("{} is an {} number".format(num, num_type))
"""
le premier
{} est remplacé par le contenu de num
le 2ième
{} est remplacé par le contenu de num_type
si la condition est vraie, num_type contient ici "pair"
si la condition est fausse, num_type contient alors "impair"
"""

en résumé, il faut écrire:

variable = "valeur si vrai" if condition else "valeur si faux"

valeur si vrai s'applique si condition est True

valeur si faux s'applique si condition = False

 

Les fonctions()

Définir une fonction

def myfonction():
    print("un texte")

 

Ajouter une aide sur une fonction

def myfonction():

    """
    texte d'aide sur mafonction(); sera renvoyé par help()
    """

    print("Bonjour")

 Pour plus de détails sur les aides et la fonction help()

 

fonction avec paramètres

def mafonction(valeur1, valeur2):
    mysomme = valeur1 + valeur2
    return mysomme

calcul = mafonction(1, 3)

 

fonction avec paramètres pré définis, optionnels, par défaut

def mafonction(valeur1, valeur2 = 5):
    mysomme = valeur1 + valeur2
    return mysomme

calcul = mafonction(2) # renvoie 2+5 = 7
calcul = mafonction(2,8) # renvoie 2+8=10

les valeurs définies par défaut sont toujours les derniers paramètres

Nous pouvons pré définir plusieurs paramètres à conditions de les mettre en fin de transmission dans l'ordre de passage des paramètres

les paramètres pré définis sont optionnels; si ils ne sont pas passés en paramètres c'est leur valeur par défaut qui est précise en compte par la fonction

il est possible de pré définir tous les paramètres

 

fonction avec un nombre variable de paramètres

Dans ce cas le nombre d'arguments transmis n'est pas connus par la fonction

2 cas de figure peuvent se présenter, transmission dite par simple splat ou transmission avec double splat

transmission avec simple *splat, indice

 

print()
print("avec splat et accès aux paramètres via leur indice")

def somme(*args):
    s=0
    for n in args:
        s += n
    print( "Somme : ", s)
    print("nombre de variables transmises : ", len(args) ) # nombre total d'arguments reçus
    valeur0 = args[0] # on accède via un indice de 0 à n-1 où n=len(args)
    valeur = valeur0+1
    return valeur

somme(1,2)
somme(1,2,3,4)
somme(30,100,2)

x= [1,2,3]
chiffre = somme(*x) # passage d'un list comme arguments de fonction
print("chiffre = ", chiffre)

 

def pgcd(*n): # calucl du Plus Grand Commun dénominateur
    def _pgcd(a,b):
        while b!=0:
            a,b = b,a%b
        return a
    p = _pgcd(n[0],n[1])
    for x in n[2:]:
        p = _pgcd(p,x)
    return p

print("PGCD = ", pgcd(165,515,225,65)) # Plus Grand Commun dénominateur

la syntaxe usuelle pour désigner un nombre variable d'arguments en simple splat est *args

pour autant args n'est pas un mot clef, nous pouvons très bien écrire *n, voir notre 2nd exemple dans la fonction pgcd()

pour autant c'est une convention usuelle que nous recommandons donc afin de faciliter la lecture de votre code

en fait l'important dans *args , c'est le symbole * (splat) qui indique que nos transmettons un nombre variable d'arguments à la fonction

les arguments sont transmis comme tuple ou list

voir la notation pour transmettre un object list comme liste variable d'arguments ex.: somme(*myList) # myList=[1,2,3]

alors que la transmission sous forme turple s'écrit simplement ex.: somme(1,2,3)

avec ce type de transmission nous pouvons accéder aux valeurs via un indice ex.: valeur = args[0]

nous pouvons connaître le nombre d'arguments passés len(args) , comme tjs en python indice varie de 0 à n-1 ou n est le nombre d'arguments transmis.

 

transmission avec double **splat key, item in items

 

print()
print("avec double splat")

def myf04(**kwargs):
    for i, j in kwargs.items():
        print(i, j)
    # valeur = valeur1 +3 # ne fonctionne pas, valeur1 is not defined
    # il faut écrire

    valeur = kwargs["valeur1"] # accès à une valeur via sa key
    return valeur

chiffre = myf04(prenom="Pierre", age=29, sport="trail", valeur1 = 10)
print("chiffre= ", chiffre)

 

def myf05(**p): # écrit a, b, c
    for key,value in p.items():
        print('{} -> {}'.format(key,value))
    #d = c+1 # NameError: name 'c' is not defined, ne fonctionne pas
    # il faut écrire

    my = p["c"] # accès à une valeur via sa key
    return my

valeur = myf05(a = 1, b = 2, c = 5)
print("valeur: ", valeur)

def myf07(**kwargs):
    for cle, valeur in kwargs.items():
        print("l'élément de clé", cle, "vaut", valeur )
    valeur = kwargs["camion"] # accès au contenu,  à la valeur, de "camion"
    return valeur    

myDict = {"voiture": "Renault", "camion": "Berliet"}
valeur = myf07(**myDict) # transmission d'un object dictionnaire comme arguments
print("valeur pour ['camion']", valeur)

a syntaxe usuelle pour désigner un nombre variable d'arguments en double splat est **kwargs

pour autant kwargs n'est pas un mot clef, nous pouvons très bien écrire **p, voir notre 2nd exemple dans la fonction myf05()

pour autant c'est une convention usuelle que nous recommandons donc afin de faciliter la lecture de votre code

en fait l'important dans **kwargs , c'est le double symbole ** (splat) qui indique que nos transmettons un nombre variable d'arguments à la fonction

ici la transmission se fait sous forme de paires key, item

ce type d'écriture est dit object dictionnaire

nous pouvons accéder à une valeur via sa key, comme ceci ex.: valeur = kwargs["nameKey"], le nom de la key est indiqué as str

nous pouvons savoir le nombre d'arguments transmis, le nombre de paires key, item, via len(kwargs), mais il ne semble pas possible d'exploiter ceci via un indice pour accéder aux éléments des paires, la seule possibilité de parcourir cet object semble être la boucle for in ...

notons également que si nous voulons transmettre un object dictionnaire comme arguments, il faut le faire précéder d'une double splat comme ceci:
myf07(**myDict) # transmission d'un object dictionnaire comme arguments où myDict = {"voiture": "Renault", "camion": "Berliet"}

remarquons dans ce cas la similitude avec la transmission d'un object list dans le cas d'une simple splat

 

Possibilité de transmission simultanées en simple et double splat

Voir cet exemple ci-dessous

print()
print("mélange de splat et double splat et accès aux paramètres via leur key")

def myf06(*args , **kwargs): # mélange de splat et double splat
    for i in args:
        print(i)
    for key,value in kwargs.items():
        print('{} -> {}'.format(key,value))
    print("nombre de variable key, item: ", len(kwargs) ) # nombre de vriables transmises en double splat
    valeurC = kwargs["c"]
    valeur = valeurC +1
    return valeur

chiffre = myf06(48 , 52 , 63 , a = 1, b = 2, c = 5)
print("chiffre = ", chiffre)

En fait la fonction fait elle-même le trie des arguments passés en simple splat avec ceux passés en double splat

 

fonction qui retourne plusieurs valeurs

def mydata(valeur1, valeur2):
    distance = valeur1 + valeur2
    angle = valeur1/valeur2
    TX = valeur1*valeur2
    return(distance,angle,TX)

distance,angle,TX = mydata(distance,angle,TX) # appel de la fonction

# exploitation des résultats
print("la distance est : ",distance,".")
print(" l'angle est : ",angle,".")

Tout est dans la ligne

return(data1, data2)

Résumé sur les fonctions

voir notre code de test python

"""
tester les fonctions
"""

# import claudecnx.useIt2021_01 as go # module externe claudecnx as namespace go

print()
print("fonctions avec paramètres")

def myf01(a, b=10):
    print("b=10 est pré défini donc optionnel: ", b)
    s= a+b
    return s

print( myf01(2) )
print( myf01(4,7) )

print()
print("fonction avec aide intégrée")

def myf02(): # pour exemple
    """
    ceci est l'aide de myf02()
    """

    a=5
    return a

help(myf02)

print()
print("fonction avec retour multiple de données")

def myf03(a, b):
    s = a+b
    p = a*b
    return(s, p) # retourne 2 variables

somme, produit = myf03(4, 6)
print("somme= ", somme, " produit = ",produit)

print()
print(" fonctions avec nombre variable d'arguments")

### fonctions avec nombre d'arguments variables
# https://www.mathweb.fr/euclide/2019/04/13/python-et-fonction-a-nombre-variable-darguments/
# https://riptutorial.com/fr/python/example/932/definir-une-fonction-avec-un-nombre-arbitraire-d-arguments

print()
print("avec splat et accès aux paramètres via leur indice")

def somme(*args):
    s=0
    for n in args:
        s += n
    print( "Somme : ", s)
    print("nombre de variables transmises : ", len(args) )
    valeur0 = args[0]
    valeur = valeur0+1
    return valeur

somme(1,2)
somme(1,2,3,4)
somme(30,100,2)

x= [1,2,3]
chiffre = somme(*x) # passage d'un object list comme arguments dans une simple splat
print("chiffre = ", chiffre)

 

def pgcd(*n): # calucl du Plus Grand Commun dénominateur
    def _pgcd(a,b):
        while b!=0:
            a,b = b,a%b
        return a
    p = _pgcd(n[0],n[1])
    for x in n[2:]:
        p = _pgcd(p,x)
    return p

print("PGCD = ", pgcd(165,515,225,65)) # Plus Grand Commun dénominateur

 

print()
print("avec double splat")

def myf04(**kwargs):
    for i, j in kwargs.items():
        print(i, j)
    # valeur = valeur1 +3 # ne fonctionne pas, valeur1 is not defined
    # il faut écrire

    valeur = kwargs["valeur1"]
    return valeur

chiffre = myf04(prenom="Pierre", age=29, sport="trail", valeur1 = 10)
print("chiffre= ", chiffre)

 

def myf05(**p): # écrit a, b, c
    for key,value in p.items():
        print('{} -> {}'.format(key,value))
    #d = c+1 # NameError: name 'c' is not defined, ne fonctionne pas
    # il faut écrire

    my = p["c"]
    return my

valeur = myf05(a = 1, b = 2, c = 5)
print("valeur: ", valeur)

 

def myf07(**kwargs):
    for cle, valeur in kwargs.items():
        print("l'élément de clé", cle, "vaut", valeur)
    valeur = kwargs["camion"]
    return valeur

myDict = {"voiture": "Renault", "camion": "Berliet"}
valeur = myf07(**myDict) # passage d'un object dict comme arguments pour double splat
print("valeur pour ['camion']", valeur)

 

print()
print("mélange de splat et double splat et accès aux paramètres via leur key")

def myf06(*args , **kwargs): # mélange de splat et double splat
    for i in args:
        print(i)
    for key,value in kwargs.items():
        print('{} -> {}'.format(key,value))
    print("nombre de variable key, item: ", len(kwargs) )
    valeurC = kwargs["c"]
    valeur = valeurC +1
    return valeur

chiffre = myf06(48 , 52 , 63 , a = 1, b = 2, c = 5)
print("chiffre = ", chiffre)

 

source d'inspiration:

https://riptutorial.com/fr/python/example/932/definir-une-fonction-avec-un-nombre-arbitraire-d-arguments

https://www.mathweb.fr/euclide/2019/04/13/python-et-fonction-a-nombre-variable-darguments/

 

 

Compatibilité de la page web

../images/idea.png ../images/warning.gif ../images/stop.png ../images/sensinterdit.png ../images/danger.png

../images/firefox_22.gif

../images/ie_22.gif

../images/chrome_22.gif

../images/opera_22.gif

../images/ie_22.gif

../images/safari_22.gif

Firefox: 52 et +

Edge

Chrome: 60 et +

Opéra: 49 et +

IE8 non testé

Safari non testé

 

Vous pouvez charger la bibliothèque use comme ceci entre vos balises <head>
<script src="../dossier/use.version.js"></script>
Dossier est le nom du répertoire où vous avez placé le fichier use;
et use.version.js le nom de ce fichier.
Pour nous contacter: claudecnx@blanquefort.net