Contenu | Rechercher | Menus

Annonce

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.

À propos de l'équipe du forum.

#1 Le 09/03/2019, à 20:20

piter42

"RESOLU" blocage script python

bonsoir,j aurai besoin de votre aide pour ce script de gérard swinnen

#!/usr/home/programmation/env python3
# -*- coding = utf-8 -*-

def encodage():
    #   renvoie la liste des entrées ou une liste vide
    print("veuillez entrer des valeurs ou <inter> pour quitter :")
    while 1 :   # condition de la boucle
        nom = input("nom : ")
        if nom == "":
            return[]
        prenom = input("prénom : ")
        adresse = input("adresse : ")
        cpostal = input("code postal : ")
        ntel = input("n° de tel : ")
        print(nom,prenom,adresse,cpostal,ntel)
        verif = input("si ok <inter> sinon <n>")
        if verif == "":
            break
    return[nom,prenom,adresse,cpostal,ntel]
    
print(encodage())

 #  enregistrer avec '*' en début de mots  
def enregistrer(liste): 
    i = 0
    while i < len(liste):
        f.write(liste[i] + '*')
        i += 1
    f.write("\n") # caractère fin de ligne
    
nomf = input("nom fichier destinataire: ")       
f = open(nomf,"a")
while 1:
    tt = encodage()
    if tt == []:
        break
    enregistrer(tt)
      
print( enregistrer(tt))
    

f.close()
 

   


Pourquoi le" print enregistre(tt)" de la fin ne me retourne rien ? j ai écrit le "print encodage() "pour essai et lui me retourne une liste.Comme si la fonction enregistrer() ne fonctionnait pas ?? j ai  écrit les codes  pour les exercices  suivants qui sont en rapport avec cet exercice là ,mais ils ne me retournent rien car il doit y avoir un souci avec celui là.
merci pour votre aide

Dernière modification par piter42 (Le 11/03/2019, à 12:04)

Hors ligne

#2 Le 09/03/2019, à 20:35

melixgaro

Re : "RESOLU" blocage script python

Bonsoir,

Ta fonction encodage renvoie une liste alors que ta fonction enregistrer ne renvoie rien (pas d'instruction return).


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#3 Le 10/03/2019, à 09:59

piter42

Re : "RESOLU" blocage script python

melixgaro a écrit :

Bonsoir,

Ta fonction encodage renvoie une liste alors que ta fonction enregistrer ne renvoie rien (pas d'instruction return).

est ce que ça veut dire qu elle ne fonctionne pas ?

Hors ligne

#4 Le 10/03/2019, à 10:31

pingouinux

Re : "RESOLU" blocage script python

Bonjour,

piter42 #3 a écrit :

est ce que ça veut dire qu elle ne fonctionne pas ?

Elle fonctionne en ce sens qu'elle écrit sur le fichier, mais comme elle ne renvoie rien, tu obtiens None si tu essayes d'imprimer le résultat.

Remarques :

1) Au lieu de

print(encodage())

il vaut mieux imprimer tt dans la dernière boucle while, sinon tu dois à nouveau rentrer des valeurs.

2)Tu peux remplacer

    i = 0
    while i < len(liste):
        f.write(liste[i] + '*')
        i += 1

par

    f.write('*'.join(liste))

ou, si tu veux le * final

    f.write('*'.join(liste) + '*')

Hors ligne

#5 Le 10/03/2019, à 11:52

piter42

Re : "RESOLU" blocage script python

merci pingouinux,

j ai essayé un print(tt) à la fin de la derniere boucle while et il me renvoie une liste vide ?

Dernière modification par piter42 (Le 10/03/2019, à 12:15)

Hors ligne

#6 Le 10/03/2019, à 12:45

pingouinux

Re : "RESOLU" blocage script python

piter42 #5 a écrit :

j ai essayé un print(tt) à la fin de la derniere boucle while et il me renvoie une liste vide ?

Si tu as mis le print après la boucle while, c'est normal, car tu ne sors de la boucle que lorsque la liste est vide.
Sinon, montre exactement ce que tu as fait.

Hors ligne

#7 Le 10/03/2019, à 18:04

piter42

Re : "RESOLU" blocage script python

#!/usr/home/programmation/env python3
# -*- coding = utf-8 -*-

def encodage():
    #   renvoie la liste des entrées ou une liste vide
    print("veuillez entrer des valeurs ou <inter> pour quitter :")
    while 1 :   # condition de la boucle
        nom = input("nom : ")
        if nom == "":
            return[]
        prenom = input("prénom : ")
        adresse = input("adresse : ")
        cpostal = input("code postal : ")
        ntel = input("n° de tel : ")
        print(nom,prenom,adresse,cpostal,ntel)
        verif = input("si ok <inter> sinon <n>")
        if verif == "":
            break
    return[nom,prenom,adresse,cpostal,ntel]
    
print(encodage())

 #  enregistrer avec '*' en début de mots  
def enregistrer(liste): 
    f.write("*".join(liste))
    f.write("\n") # caractère fin de ligne
    
    
nomf = input("nom fichier destinataire: ")       
f = open(nomf,"a")
while 1:
    tt = encodage()
    if tt == []:
        break
    enregistrer(tt)
print(tt)  

    

f.close()

Hors ligne

#8 Le 10/03/2019, à 18:16

pingouinux

Re : "RESOLU" blocage script python

piter42 #7 a écrit :
while 1:
    tt = encodage()
    if tt == []:
        break
    enregistrer(tt)
print(tt)

C'est ce que je t'ai expliqué en #6 : tu ne sors de la boucle while que lorsque la liste tt est vide.
Si tu veux voir quelque chose, il faut mettre le print dans la boucle. Par exemple

while 1:
    tt = encodage()
    print(tt)
    if tt == []:
        break
    enregistrer(tt)

Hors ligne

#9 Le 10/03/2019, à 20:42

piter42

Re : "RESOLU" blocage script python

bonsoir pingouix,
j ai testé et ça me renvoie toujours une liste vide ?

Hors ligne

#10 Le 10/03/2019, à 21:12

pingouinux

Re : "RESOLU" blocage script python

piter42 #9 a écrit :

j ai testé et ça me renvoie toujours une liste vide ?

Tant que tu donnes des valeurs, la liste n'est pas vide, mais la dernière, correspondant à nom=="", le sera effectivement.

Dernière modification par pingouinux (Le 10/03/2019, à 21:14)

Hors ligne

#11 Le 10/03/2019, à 21:43

Roschan

Re : "RESOLU" blocage script python

J'ai commenté mes modifications

#!/usr/bin/env python3
# -*- coding = utf-8 -*-

# Je ne sais pas à quel point ton système est anormal, mais théoriquement "/home"
# ne contient PAS les binaires des utilitaires systèmes comme `env`, et surtout
# ce n'est pas un sous-dossier de "/usr" !
# Le shebang correct pour l'exécution d'un script python3 est bien `#!/usr/bin/env python3`

def encodage():
    # renvoie la liste des entrées ou None. None est conçu pour représenter
    # l'absence de valeur, comme expliqué ici https://docs.python.org/3.2/library/constants.html
    # Il est souvent une bonne idée d'utiliser dans son propre code des conventions semblables
    # à celles du langage qu'on utilise : renvoyer une liste vide n'aurait de sens
    # que si on y ajoutait quelque chose par la suite par exemple. Ici c'est juste pour
    # tester le contenu de la variable : pourquoi allouer de la mémoire à une liste
    # qu'on n'utilisera pas, alors qu'on peut renvoyer None ?
    print("veuillez entrer des valeurs, ou <entrée> pour quitter :")
    verif = "n"
    while verif != "" :   # condition de la boucle
        nom = input("nom : ")
        if nom == "":
            return None
        prenom = input("prénom : ")
        adresse = input("adresse : ")
        cpostal = input("code postal : ")
        ntel = input("n° de tel : ")
        print(nom, prenom, adresse, cpostal, ntel)
        verif = input("si c'est ok <entrée>, sinon <n>")
    return [nom, prenom, adresse, cpostal, ntel]

# enregistrer avec '*' en début de mots
def enregistrer(liste):
    # La boucle while s'utilise quand le nombre de tours à effectuer est
    # inconnu. Ici, on sait qu'on va avoir autant de tours que d'éléments
    # dans la liste. On pourrait faire
#    for i in range(0, len(liste)):
#        f.write(liste[i] + '*')
    # Mais ce serait se compliquer la vie pour rien puisque Python propose la
    # syntaxe suivante pour parcourir une liste :
    for element in liste:
        f.write(element + '*')
    f.write("\n") # caractère fin de ligne

nomf = input("nom fichier destinataire : ")
f = open(nomf,"a")
while True: # Utiliser des types qui ont du sens aide beaucoup à la compréhension
# du code : une condition prend un booléen, pas un entier.
    tt = encodage()
    # C'est souvent une mauvaise idée de polluer le terminal avec des print dénués
    # d'explications. On décrit donc ce qu'on va print :
    print("Encodage pas encore écrit dans le fichier : " + str(tt))
    if tt is None:
        break
    enregistrer(tt)
f.close()

Je l'exécute :

 
roschan@debian:~$ ./test.py 
nom fichier destinataire : exemple.txt
veuillez entrer des valeurs, ou <entrée> pour quitter :
nom : Dupont
prénom : Jean
adresse : eeeeeeeeee eeee e eeee
code postal : 55555
n° de tel : 0000000000
Dupont Jean eeeeeeeeee eeee e eeee 55555 0000000000
si c'est ok <entrée>, sinon <n>
Encodage pas encore écrit dans le fichier : ['Dupont', 'Jean', 'eeeeeeeeee eeee e eeee', '55555', '0000000000']
veuillez entrer des valeurs, ou <entrée> pour quitter :
nom : ffffffffffffffffffff
prénom : 
adresse : 
code postal : 
n° de tel : 
ffffffffffffffffffff    
si c'est ok <entrée>, sinon <n>n
nom : 
Encodage pas encore écrit dans le fichier : None
roschan@debian:~$ 

Ici les print fonctionnent tous comme prévu. Le fichier exemple.txt contient bien :

Dupont*Jean*eeeeeeeeee eeee e eeee*55555*0000000000*

Dernière modification par Roschan (Le 10/03/2019, à 21:48)

Hors ligne

#12 Le 10/03/2019, à 21:48

Compte supprimé

Re : "RESOLU" blocage script python

Bonsoir,
@piter42,
Je ne sais pas si tu connais pythontutor  http://pythontutor.com/visualize.html#mode=edit  .
Cet outil permet de visualiser l'exécution d'un code ligne par ligne.
C'est bien pratique pour 'voir' ce qui se passe...

#13 Le 11/03/2019, à 08:39

pingouinux

Re : "RESOLU" blocage script python

Suite à mes réponses en #8 et #10 :
Si tu ne veux pas voir la dernière liste vide

while 1:
    tt = encodage()
    if tt == []:
        break
    print(tt)
    enregistrer(tt)

Hors ligne

#14 Le 11/03/2019, à 11:51

piter42

Re : "RESOLU" blocage script python

merci à tout les 3 pour votre aide précieuse,je regarde cela

Dernière modification par piter42 (Le 11/03/2019, à 12:02)

Hors ligne