Python>>> Jongler avec les données

Fermé
sebsauvage - 2 avril 2002 à 12:59
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 - 2 juin 2008 à 16:15
(N'ayant trouvé aucun forum Python vraiment bien, je viens faire découvrir Python ici, avec des exemples ; Je viendrai poster de nouveaux exemples de temps en temps).


En Python, en plus des types de données standards (entier, chaîne, etc.), il y a 3 type de données bigrement pratiques: les listes, tuples et dictionnaires.

Avec les tuples par exemple, il est facile de créer une fonction qui renvoie plusieurs valeurs:

>>> def mafonction( a ):
________return (a*2, a-3)

>>> ( b, c ) = mafonction(5)
>>> print b
10
>>> print c
2


Le type liste permet de manipuler les listes avec une désarmante facilité :

>>> import string
>>> texte = "rouge/vert/bleu"
>>> maliste = string.split(texte,"/")
>>> print maliste
['rouge', 'vert', 'bleu']
>>> print maliste[1]
vert
>>> maliste.append("rose")
>>> print maliste
['rouge', 'vert', 'bleu', 'rose']
>>> print len(maliste)
4
>>> print string.join(maliste," - ")
rouge - vert - bleu - rose
>>> maliste.sort()
>>> print maliste
['bleu', 'rose', 'rouge', 'vert']


On peut faire des listes de n'importe quoi, mélangeant chaînes, entier, etc..
Par exemple, voici une liste qui contient une chaîne, un entier, une autre liste et un tuple:

>>> liste2 = [ 'coucou' , 5 , [1,3,5], (12,24) ]
>>> print liste2
['coucou', 5, [1, 3, 5], (12, 24)]
>>> print liste2[2]
[1, 3, 5]


Ces 3 types (tuple, dictionnaire, liste) peuvent être utilisés partout, y compris dans les valeurs d'entrée et sortie des fonctions.

On peut donc très bien faire des fonctions qui prennent en paramètre (ou donnent en sortie) des dictionnaires de liste contenant des tuples qui contiennent des chaînes, entiers, d'autres listes, etc.


ça permet de manipuler facilement des structures de données complexes, sans avoir à faire appel à des pointeurs, des tableaux alloués dynamiquement, des boucles pour balayer ces tableaux, etc.


Je vous encourage à faire des essais vous-même en tapant directement dans l'interpréteur de commande Python.

:-)

6 réponses

sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
2 juin 2008 à 16:15
Le code suivant marche bien:

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
class clients:
    def __init__(self):
        self.clients=[]

    def newth(self,N,P,A,T):
        self.clients.append({'nom':N,'prenom':P,'adresse':A,'tel':T})


c = clients();
c.newth("HERMAN","Pee-wee","5 allée des corbeau","12345678")
c.newth("COLLINS","Phil","7 rue des charmes","77665544")
print c.clients


Ce qui affiche:

[{'nom': 'HERMAN', 'tel': '12345678', 'adresse': '5 all\xe9e des corbeau', 'prenom': 'Pee-wee'}, 
 {'nom': 'COLLINS', 'tel': '77665544', 'adresse': '7 rue des charmes', 'prenom': 'Phil'} ]


Attention: self n'est à utiliser que quand on créé une classe.
1
Merci pour tout.

Sa a l'air pratique comme langage, je connaisais pas.
0
Bonjour,

Petite question sur les dictionnaires.

Je sauvegarde un dictionnaire dans un fichier, mais je n'arrive pas à le lire!

Voici un bout de code:

clients       = {}

def AjouteUser(self):
        self.clients[self.user] = self

def readFile(self):
        try:
            f=open(FICHIER,"r")
            self.clients = pickle.loads(f)
            f.close()
        except IOError:
                f=open(FICHIER,"w")
                f.close()

def saveToFile(self):        
        f=open(FICHIER,"w")
        pickle.dump(self.clients, f)
        f.close() 


Si il y un dictionnaire d'enrégistrer, et que je veux le lire avec la méthode readFile() j'obtient ce message:

File "G:\B63\SiteWeb\cgi-bin\Vins\log2.py", line 35, in readFile
self.clients = pickle.loads(f)
File "C:\Python23\lib\pickle.py", line 1393, in loads
file = StringIO(str)
TypeError: expected read buffer, file found


Quelqu'un a une idée?

OctetPlus
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
15 sept. 2005 à 13:25
Hello, OctetPlus.

Ton code me paraît curieux: Tu utilises le mot 'self' alors que tu n'as défini aucune classe. (à moins que le code ci-dessus soit un extrait de ta classe ?)

Exemple de (dé)sérialisation d'un dictionnaire:

import pickle

# On créé un dictionnaire
mondict = { 'bleu':5, 'rouge':7, 'vert':3 }

# Sauvegarder:
fichier = open('mondictionnaire.dat','w+b')
pickle.dump(mondict,fichier)
fichier.close()

# Charger:
fichier2 = open('mondictionnaire.dat','rb')
mondict2 = pickle.load(fichier2)
fichier2.close()
print mondict2
0
OctetPlus Messages postés 41 Date d'inscription dimanche 11 septembre 2005 Statut Membre Dernière intervention 27 août 2007 8
17 sept. 2005 à 14:13
Les fonctions sont des méthodes d'un objet, d'où "self"

Merci vous m'avez aidé!

Juste une petite question!

La fonction "open" prend un paramètre le type d'ouverture d'accès au fichier. Toutefois, j'utilisait seulement:

w : pour créer et écrire dans un fichier
r: pour lire
a: pour ajouetr dans un fichier

Mais là:
w+b : ???
rb : ????


Il y a d'autres comme ça?

OctetPlus
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
17 sept. 2005 à 18:08
w : en écriture
+ : effacer le fichier s'il existe déjà
b : en mode binaire (sinon, mode texte)
0
tsic Messages postés 20 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 20 juin 2008
2 juin 2008 à 12:26
Bonjour sebsauvage,
Je traite une liste de dictionnaire. prenons l'exemple suivant:
hh=[{'id':9,'u':0},{'id':8,'u':6},{'id':5,'u':1}]


1)def modif(self,val,ide):
=>comment pourrais-je accéder au contenu de la liste pour chercher l'élément qui a comme 'id'=ide pour changer la valeur de son u=val(nouvelle valeur)

dans plusieurs exemples que j'ai vu le seul accès à la liste est par son index (càd hh[0])

merci pour votre aide.
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
2 juin 2008 à 13:12
S'il s'agit de stocker des couples (id,valeur), ta structure de données hh ne me semble pas vraiment optimale.
J'aurais fait:
hh2 = { 9:0, 8:6, 5:1 }

Comme ça pour modifier une valeur, il aurait suffit de faire:
hh2[8]=3



Avec ta structure, c'est moins pratique parcequ'il faut boucler sur tous les éléments:
for d in hh:
    if d['id']==8:
        d['u'] = 3
0
tsic Messages postés 20 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 20 juin 2008 > sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019
2 juin 2008 à 15:53
Merci pour ta reponse mais ce n'est pas tout à fait ça.
Comme par exemple un client qui doit avoir un nom,un prénom, une adresse,un tel
Maintenant j'ai fait à chaque nouveau thread
//self.clients est une liste de dictionnaires qui représentent les coordonnées des différents clients.
def __init__(self):
self.clients=[]

def newth(N,P,A,T)
self.clients.append({'nom':N,'prenom':P,'adresse':A,'tel':T})
print self.client

La fct newth m'écrase tjs les données du précédent client et le remplace par les nouveaux données.
Pourquoi "append" ne fonctionne pas correctement.
Merci
0