Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

nombre réponses : 25

#0 -1 »  Conseil sur livres/docs POO » Le 19/10/2017, à 08:39

paul18
Réponses : 6

Bonjour,

J'ai toujours utilisé une approche procédurale dans ma programmation, et pour un gros développement, je pense qu'il me faut explorer d'autres voies : la programmation orientée objet et l'UML.

Des conseils sur des livres et autres documents (tutos, cours en ligne), pour qu'un novice apprenne seul ?

Merci

Paul

#1 Re : -1 »  Conseil sur livres/docs POO » Le 19/10/2017, à 13:29

paul18
Réponses : 6
Vobul a écrit :

Quel language ?

C'est python qui m'intéresse pour ses librairies scientifiques (matplotlib par exemple), mais je pensais que c'était indépendant du langage big_smile

#2 -1 »  [résolu] Python et POO: premier essai » Le 18/08/2017, à 11:24

paul18
Réponses : 2

Salut,

Je m'essaie à la POO (pure débutant) : un cours dans une main, le clavier dans l'autre; je n'arrive pas à comprendre pourquoi le code 1 me renvoie bien les valeurs, alors que le second me retourne les adresses mémoire : à côté de quoi je suis passé ?

Merci par avance

Paul

Code1:

class Voiture:
  
  def __init__(self):           ## les valeurs sont initialisées par défaut
    self.marque = "no_marque"
    self.couleur = "no_couleur"
    self.reserveessence = 0.

  def demarrer(self):
    if self.reserveessence > 0. :
      print("Je démarre")
    else:
      print("Je ne peux pas démarrer (réserve = 0)")
      
      
  def rouler(self,nbre_Km):
    self.nbre_Km = float(nbre_Km)
    self.reserveessence = (self.reserveessence - 5.*self.nbre_Km/100.)
    

## main
ma_caisse = Voiture()               ## appel de la classe
ma_caisse.reserveessence = 30       ## initialisation reserveessence
ma_caisse.demarrer()                ## demarrage -> la class vérifie si c'est possible (fct demarrer)
ma_caisse.rouler(100)               ## on roule 100 Km -> remise à jour de "reserveessence"
print(ma_caisse.reserveessence)     ## affiche la nouvelle valeur

## on parcours à nouveau 100 Km
ma_caisse.rouler(100)               ## on roule 100 Km -> remise à jour de "reserveessence"
print(ma_caisse.reserveessence)     ## affiche la nouvelle valeur --> garde bien en mémoire l'historique !!!!!!!

## on parcours à nouveau 400 Km
ma_caisse.rouler(400)               ## on roule 400 Km -> remise à jour de "reserveessence"
print(ma_caisse.reserveessence)     ## affiche la nouvelle valeur --> réserve tombe à zéro !!!!

ma_caisse.demarrer()                ## la voiture ne peut plus démarrer :-) 

Code 2:

class Temperature:
  
  ## constructeur ##
  def __init__(self, laValeur = 0):
    self.__valeur = float(laValeur)  ## valeur est ici privée
    
  ## méthodes publiques: accès aux attributs (uniquement)
  ## accesseurs
  def getValeur(self):
    return self.__valeur      ## on accède à la valeur de "__valeur"
                              ## on ne fait que retourner une valeur
                              
#  ## mutateur = setter
#  def setValeur(self,value):  ## "__valeur" était initalement privée, on la rend indirectement public via "setValeur"
#                              ## "value" est passée en argument ... puisque qu'on mute "__valeur" --> via self
#    self.__valeur = value


  ## Méthodes publiques: opérations
  def getValeurC(self):
    return (self.__valeur - 273.16)         ## Calcul de T en °C depuis la valeur en K

  def getValeurF(self):
    return (1.8 * self.getValeurC() + 32)   ## on appelle ici la T en °C -> on pointe sur getValeurC




## main
eauChaude = Temperature(310)    ## Calcul l'objet eauChaude
print(eauChaude.getValeurC)
print(eauChaude.getValeurF)
print(eauChaude.getValeur)      ## vérif sur valeur initiale

#3 Re : -1 »  [résolu] Python et POO: premier essai » Le 18/08/2017, à 12:31

paul18
Réponses : 2

oui c'est bien ça; j'ai compris mon erreur: j'appelle une fonction/méthode et non une variable/instance

Merci

#4 Re : -1 »  Qeul Langage ? » Le 18/08/2017, à 10:05

paul18
Réponses : 9
baroul a écrit :

J'avoue que ma difficulté c'est POO. J'ai un peux de mal.

Personnellement j'ai toujours codé en utilisant un approche procédurale pour des programmes scientifiques de taille moyenne; je me suis mis à python il y a quelques semaines pour un plus gros projet spécifique et les certains programmes tournent; pour autant je trouve que ça tend doucement vers l'usine à gaz (c'est sûrement lié au programmeur également) : je m'interroge encore sur le fait d'utiliser la POO - après nombre outils/paquets Python comme Numpy par exemple, utilisent la  POO.

Pour moi la difficulté est de trouver de la documentation et des tutos qui expliquent des différentes philosophies, comment "réfléchi" son projet, et ça c'est pas évident. J'ai tout de même trouvé quelques références sur lesquelles je planche actuellement - je démarre, en autodidacte et oui c'est pas évident:
- Xavier Blanc sur youtube +++
- cours POO de Cédric Buche: pdf et slides
- Blog Sam et Max (on aime ou pas)

Si la communauté a d'autres sources, je suis également preneur wink

Paul

#5 Re : -1 »  [Python 3] Installation » Le 24/07/2017, à 11:12

paul18
Réponses : 19

Pas sûr de comprendre : tu as installé python (sudo apt-get ...) ou tu l'as compilé ?

Si compilé : tu supprimes le répertoire et les liens tongue
Si installé, une piste dans le lien ci-dessous (mon portable est en réparation et je ne peux pas tester) ; je m'inspire d'une instruction que j'utilise sous centOS :
yum history

Je ne suis sous python que depuis quelques semaines, mais pour éviter les problèmes et les conflits, j'utilise anaconda qui émule tous les outils python (numpy, pandas, astropy, et spyder comme gui par ex) - simplement dire "No" quand il propose de devenir le "python" pas défaut
anaconda

Peut-être d'autres donneront de meilleurs conseils

Paul

#6 Re : -1 »  [Python 3] Installation » Le 24/07/2017, à 17:17

paul18
Réponses : 19

oui tu as compilé big_smile

Dans le même répertoire et en tant que root, tu fais un :

make clean

puis

make clean all

normalement les liens sont supprimés; te reste à supprimer le répertoire (ou dossier comme tu l'appelles) dans lequel tu as lancé la compilation.

Je te conseille vivement d'utiliser anaconda; de cette façon tu te concentres sur le code et pas sur les packages

#7 Re : -1 »  [Python 3] Installation » Le 24/07/2017, à 20:53

paul18
Réponses : 19

"make clean all" est facultatif; c'est plus propre

Je rappelle que si tu te décides à installer anaconda, il va te demander si tu souhaites qu'il devienne la version par défaut de python (vers la fin de mémoire) : moi j'ai dit non et je conseille d'en faire de même (mais c'est mon avis)

#8 Re : -1 »  [Python 3] Installation » Le 26/07/2017, à 08:29

paul18
Réponses : 19

je pense que dans ton répertoire "/usr/local/bin" il doit traîner un fichier ou un lien qui pointe vers un fichier python 3.6 ; si oui supprime le/les (attention de ne pas supprimer les fichiers de la version courante ... "dans le doute, abstiens-toi")

#9 -1 »  [Résolu] Python : fichier ascii avec données au format binaire » Le 20/07/2017, à 18:50

paul18
Réponses : 8

Bonsoir,

J'utilise maintenant python/numpy pour écrire lire et traiter des données dans des fichiers ascii, et en écrire un nouveau fichier (toujours ascii) qui sera lu par un interpréteur. Pour gagner en temps de lecture, j'ai la possibilité d'écrire une grande partie des données (int et float) directement en binaire genre "sizeof" du C (je ne connais que très peu le C).

Je n'ai pas vu sur internet d'instruction simple pour cette conversion, mais je ne sais pas où chercher: est-ce possible sous python? si oui où regarder?

Merci

Paul

#10 Re : -1 »  [Résolu] Python : fichier ascii avec données au format binaire » Le 20/07/2017, à 21:28

paul18
Réponses : 8

merci pour la piste. Du coup je suis tombé aussi sur "bytes"

Par contre pour l'écriture, j'ai vu qu'il fallait déclarer la partie binaire comme un string: est-ce la bonne façon de procéder car j'ai un gros doute (j'ai fait un essai avec 1 million de lignes et le fichier ascii/binaire et plus gros qu'un simple 100% ascii?

import numpy as np
import os
import struct

PATH = str(os.path.abspath(''))
file = '/test_linaire.txt'

a = np.arange(1,5)
n = len(a)

with open(PATH + file, 'w') as f:
   for i in range(n):
       f.write("a = %s\n" %(struct.pack('l',a[i]))) ## l = entier sur 4 bits <> d = float en double
#       f.write("a2 = %s\n" %(bytes(a[i])))

ce qui donne

a = b'\x01\x00\x00\x00'
a = b'\x02\x00\x00\x00'
a = b'\x03\x00\x00\x00'
a = b'\x04\x00\x00\x00'

#11 Re : -1 »  [Résolu] Python : fichier ascii avec données au format binaire » Le 21/07/2017, à 07:37

paul18
Réponses : 8
pingouinux a écrit :
with open(PATH + file, 'wb') as f:
   for i in range(n):
       f.write(struct.pack('l',a[i]))

Ajouté :
Pour les entiers, tu as aussi ces 2 fonctions : int.to_bytes, int.from_bytes

en 'wb' le fichier est entièrement binaire, mais ce n'est pas ce que je cherche à faire ; je cherche à mélanger ascii et binaire dans un même fichier

with open(PATH + file, 'w') as f:

   for i in range(n):

       f.write("En-tete ascii et ensuite bloc en binaire")

       f.write(struct.pack('l',a[i])) ## l = entier sur 4 bits <> d = float en double

   f.write("fin bloc binaire")

#12 Re : -1 »  [Résolu] Python : fichier ascii avec données au format binaire » Le 21/07/2017, à 08:49

paul18
Réponses : 8

merci Pingouinux

effectivement ça fonctionne mieux; en revanche je m'attendais à avoir un fichier binaire de plus petite taille que l'équivalent en ascii et ce n'est pas le cas. Est-ce dans le choix des entiers (long ici)  ? je continue à creuser


import os
import struct
import binascii

PATH = str(os.path.abspath(''))
file = '/test_binaire.txt'
file2 = '/test_ascii.txt'

a = np.arange(1,1000000)
n = len(a)


with open(PATH + file, 'wb') as f:
   f.write(b"En-tete ascii et ensuite bloc en binaire\n")
   for i in range(n):
     f.write(struct.pack('l',a[i])) ## l = entier sur 4 bits <> d = float en double
     f.write(b"\n")
   f.write(b"fin bloc binaire\n")

with open(PATH + file2, 'w') as g:
  g.write("En-tete ascii et ensuite bloc en ascii\n")
  for i in range(n):
    g.write("%d\n" %a[i])
  g.write("fin bloc ascii\n")

#13 Re : -1 »  [Résolu] Python : fichier ascii avec données au format binaire » Le 21/07/2017, à 12:57

paul18
Réponses : 8

autant pour moi, j'ai mal calculer les bornes de l'ensemble de définition (sous 4 octets j'ai +/- 2 milliard contre +/- 9.E-19 sur 8 octets) tongue
Je vais pouvoir lancer de nouveaux essais
Merci pour le coup de main
Paul

#14 Re : -1 »  Quelle est le numero de version stable de python3 ? » Le 13/07/2017, à 15:17

paul18
Réponses : 3

Arrivé très récemment dans le monde "python", j'ai été confronté à ce problème de version (je suis sous CentOS 7 pour laquelle on est toujours en python 2.7 tongue - j'ai aussi une ubuntu 16.04 LTS sur mon portable perso).

J'ai installé (ana)conda 4.4.0 qui permet d'émuler tous les derniers outils python (python 3.6 - spyder 3 + numpy / pandas etc.), et ça sans toucher à la configuration par défaut  si on ne le souhaite pas ; pour info, sur ubuntu j'avais spyder 2 nettement moins bien que la 3.

Paul

#15 -1 »  [résolu] problème avec Readline() » Le 07/07/2017, à 08:24

paul18
Réponses : 5

Bonjour,

Désolé si ma question est triviale, mais je suis bloqué dessus depuis des heures & tous les exemples trouvés (idem dans les docs) fonctionnent pour le parcours complet d'un fichier.

Mon problème : je cherche à enregistrer la valeur sur la ligne juste après ##begin, mais de de toute évidence lors de son appel, readline() démarre au début du fichier (je n'ai donc pas compris son fonctionnement)

Une remarque : de gros fichiers textes à traiter, donc readlines() est à éviter (testé :-) )

Merci par avance pour toute suggestion

Paul


fichier ascii :

999
0
0
0
0
0
0
0
0
0
0
##BEGIN
42
1
6
12
47
2
46
3
51

Mon bout de code :

import time, sys, os
#from astropy.io import ascii
import itertools
import numpy as np

PATH = str(os.path.abspath(''))
input_file_name ='/tmp.txt'


## check if the file exists, then if it's empty or not
if (os.path.isfile(PATH + input_file_name)):
    if (os.stat(PATH + input_file_name).st_size > 0):
        
        ## go through the file in order to find specific sentences
        ## specific blocks will be defined afterward         
        Block_position = []; j=0;
        with open(PATH + input_file_name, "r") as data:
            for line in data:
                if '##BEGIN' in line:
                    Block_position.append(j)
                j=j+1 
           
        with open(PATH + input_file_name, "r") as data:
            TotalNumberOfLines = os.path.getsize(PATH + input_file_name)
            
            for j in range(TotalNumberOfLines):
                print ("j = ",j)
                if (j is (Block_position[0]+1)):
                    print( "je suis dedans\n"); print(j)
                    NumberOfNodes = int(data.readline()[:-1])
                j = j+1

       
    else:
        print "The file %s is empty : post-processing cannot be performed !!!\n" % input_file_name

            
else:
    print "Error : the file %s does not exist: post-processing stops !!!\n" % input_file_name

#16 Re : -1 »  [résolu] problème avec Readline() » Le 07/07/2017, à 08:53

paul18
Réponses : 5

je suis tombé sur itertools.islice(), mais ça répond partiellement à mon besoin; avec readline() je cherche à récupérer la valeur et directement l'écrire dans un fichier texte (sans charger un bloc complet en mémoire)

NumberOfNodes = int(next(itertools.islice(data,Node_position[0]+1,Node_position[0]+2),None))

#17 Re : -1 »  [résolu] problème avec Readline() » Le 07/07/2017, à 09:31

paul18
Réponses : 5

évidemment ça fonctionne, mais je suis perdu car dans mon esprit on est sur la ligne ###begin (avec if) et je n'arrive pas à comprendre qu'on enregistre la ligne suivante (????)

bon il y a plus de choses à revoir que je n'imaginais

Merci pour l'information

Paul

#18 Re : -1 »  [résolu] problème avec Readline() » Le 07/07/2017, à 11:03

paul18
Réponses : 5

@pinguinux: un grand merci ; c'est parfois dans la douleur qu'on apprend les choses wink

j'ai avancé d'un grand pas

Paul

#19 -1 »  exec() avec variable » Le 03/07/2017, à 22:19

paul18
Réponses : 6

Bon ça fait 2 heures que je cherche tout en tournant en rond, alors je finis une nouvelle fois par vous solliciter ; j'ai plusieurs array :

mat1 = np.random.rand(5,1); print ("mat1 : ", mat1)
mat2 = np.random.rand(5,1); print ("mat2 : ", mat2)
...
mat_n = np.random.rand(5,1); print ("mat_n : ", mat_n)

je souhaite utiliser une instruction du genre (et avec la variable i)  :

i = 1
exec("mat +str( i) + [0][0] = 100")

En dehors d'un pb de quote, comment implémenter i ? sur pas mal de forum, il est fortement déconseillé d'utiliser exec(), alors quoi employer ?

Merci par avance

Paul

#20 Re : -1 »  exec() avec variable » Le 04/07/2017, à 07:45

paul18
Réponses : 6

A tous,

Merci pour ces retour; j'ai oublié de préciser que je codais sous python et que je cherche une façon d'introduite une variable pour pointer sur le bon tableau:
- sur le tableau n°i (i de 1 à n), je veux affecter la valeur 100 en [0][0]
- l'idée est d'intégrer ça dans une boucle, puisque je ne connais pas le nombre de tableau (cela dépend de mon fichier initial)

Sur le net j'y ai vu exec(), avec effectivement des alertes quant à son utilisation- je suis preneur de toute suggestion afin de bien faire dès le départ

Paul

#21 Re : -1 »  exec() avec variable » Le 04/07/2017, à 09:09

paul18
Réponses : 6
pingouinux a écrit :

Tu peux aussi faire ceci :

tab=[]; n=3
for i in range(n): tab.append(np.random.rand(5,1)); print('tab%s\n%s\n'%(i,tab[i]))
i=2
tab[i][0][0]=555; print('tab%s\n%s\n'%(i,tab[i]))

Merci mais je ne suis pas sûr que cela corresponde à mon besoin - dans l'explorateur des variables, je n'ai que "tab" et "print" ne fait qu'afficher un indice / il ne pointe pas sur le tableau visé.

Pour reprendre l'exemple, les 3 tableaux 'tab' existent, et je veux pointer si tel ou tel tableau dans une boucle pour y affecter des données
(je me suis sûrement mal exprimé)

Paul

#22 Re : -1 »  [Résolu] re.finditer -> dans une variable » Le 03/07/2017, à 18:14

paul18
Réponses : 5

voilà

toto = []
ligne = 'je cherche à "enregistrer" la position des "double-quotes" ' 
resul=re.finditer('"',ligne)
for match in resul: 
    print(match.span())
    toto.append(match.span())

#23 Re : -1 »  pourquoi transposer ? » Le 03/07/2017, à 18:19

paul18
Réponses : 4

Par habitude j'ai posé le code suivant qui conduit à une erreur :

vect0 = np.random.rand(5,1); print vect0; print("\n")
mat = np.zeros((5,4),dtype=float)
mat[:,0]=vect0; print mat

mais où tu as raison c'est que si je ne reste sur un vecteur ligne, là il faut le boulot tout seul

vect0 = np.random.rand(5); print vect0; print("\n")
mat = np.zeros((5,4),dtype=float)
mat[:,0]=vect0; print mat

hmm

Merci pour le post

Paul

#24 Re : -1 »  pourquoi transposer ? » Le 03/07/2017, à 19:22

paul18
Réponses : 4
pingouinux a écrit :

Dans le premier cas en #3, ceci ne produit pas d'erreur :

vect0 = np.random.rand(1,5); print vect0; print("\n")

parce que là on reste sur un vecteur ligne !!
it doesn't matter - faut le savoir - mais ce n'est pas logique (à mon sens et comparativement à d'autres codes de calculs scientifiques)