Problèmes programme python
Fermé
honey
-
22 nov. 2009 à 16:41
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 - 24 nov. 2009 à 11:49
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 - 24 nov. 2009 à 11:49
A voir également:
- Attributeerror: 'list' object has no attribute 'split'
- Ce programme est écrit en python ✓ - Forum Python
- Python est introuvable. exúcutez sans argument pour procúder ó l - Forum Python
- Programme demarrage windows 10 - Guide
- Ce programme est écrit en python. ✓ - Forum Python
- Programme bonjour ✓ - Forum Windows
4 réponses
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
23 nov. 2009 à 13:44
23 nov. 2009 à 13:44
je ne comprend pas pourquoi je dois mettre les parenthèses pour les print sinon ça ne fonctionne pas.
C'est certainement parce que tu es sous Python 3, alors que je suis toujours sous Python 2.6
https://www.local-guru.net/blog/2009/02/09/whats-new-in-python-3-0
http://docs.python.org/dev/3.0/whatsnew/3.0.html
-------------------------------------------
Tu ne veux pas remplacer
par
?
On peut même condenser en
et on peut même aller jusqu'à
C'est clean , non ?
Si ça ne te plait pas, on peut aussi procéder autrement.
Est-ce que tu connais la fonction map() ?
Regarde ce qui se passe par exemple avec
map(f,li) applique la fonction f sur chaque élément de li et renvoie la liste li transformée
Donc dans ton cas, on peut s'en servir pour écrire
et en condensant:
Comme ça , il n'y a même pas de création de l, ses valeurs sont immédiatement traitées par map().
--------------
Pour l'affichage, y a de l'idée, mais ça cafouille un peu.
D'abord, si tu fais renvoyer lgrille par la fonction lire(), et l'imprimer par print lire(...), certes tu as l'écriture de lgrille à l'écran. Mais une fois ceci fait, lgrille ne se trouve plus accessible parce que c'était une variable locale, c'est à dire interne a lire().
Donc il faut l'enregistrer à l'extérieur:
Faire
Ensuite je ferais comme ça:
- afficher "-"*25
- pour chaque sous-liste de lgrille (c'est à dire une ligne), afficher la succession de chiffres et de '|' c'est à dire la ligne de chiffres proprement dite bien formatée
puis en dessous afficher "-"*25
Il faut savoir que sous Python 2.6 en tous cas, print fait revenir à la ligne donc
va malheureusement faire afficher
l[e] sur une ligne
puis '|' à la ligne suivante
Pour contrecarrer ça, il faut faire
La virgule empêche le retour à la ligne. Ça marche aussi si on écrit
Mais il reste un ennui: print a,b fait affichér a et b avec touours un blanc entre les deux.
Pour éviter ceci il faut alors écrire print a+b, mais cela n'est possible que si a et b sont des chaînes. Si b est un entier par exemple, il suffit d'écrire print a+str(b).
Et hop.
Ceci dit, Python 3 a vu une augmentation notable des possibilités de la fonction print, et les pratiques sont sans doute différentes et plus simples à mettre en place. À toi de regarder tout ça et de te débrouiller avec mes indications pour arriver à écrire ta fonction d'affichage.
Pense aussi au fait que Python permet de jouer très facilement avec des indices.
Par exemple
Allez, j'arrête là, on peut dire des tonnes de choses encore.
------------------------
pour garder l'indentation des lignes qui sont du code, dans le message ue tu postes, il faut sélectionner les lignes en question et appuyer sur le bouton à icône de page blanche qui se trouve juste après les icônes G I S
C'est certainement parce que tu es sous Python 3, alors que je suis toujours sous Python 2.6
https://www.local-guru.net/blog/2009/02/09/whats-new-in-python-3-0
http://docs.python.org/dev/3.0/whatsnew/3.0.html
-------------------------------------------
Tu ne veux pas remplacer
l=ligne.split() lgrille.append([]) for e in l: lgrille [-1].append(int(e))
par
l=ligne.split() sous-liste = [ int(u) for u in l ] lgrille.append(sous-liste)
?
On peut même condenser en
l=ligne.split() lgrille.append([ int(u) for u in l ])
et on peut même aller jusqu'à
def lire (fic): lgrille=[] fp=open (fic,'r') ligne=fp.readline() while ligne: lgrille.append([int(u) for u in ligne.split()]) ligne=fp.readline() fp.close() return lgrille
C'est clean , non ?
Si ça ne te plait pas, on peut aussi procéder autrement.
Est-ce que tu connais la fonction map() ?
Regarde ce qui se passe par exemple avec
li = ['23','4','123','890','45'] print li li = map(int,li) print li
map(f,li) applique la fonction f sur chaque élément de li et renvoie la liste li transformée
Donc dans ton cas, on peut s'en servir pour écrire
def lire1 (fic): lgrille=[] fp=open (fic,'r') ligne=fp.readline() while ligne: l=map(int,ligne.split()) lgrille.append(l) ligne=fp.readline() fp.close() return lgrille
et en condensant:
def lire1 (fic): lgrille=[] fp=open (fic,'r') ligne=fp.readline() while ligne: lgrille.append(map(int,ligne.split())) ligne=fp.readline() fp.close() return lgrille
Comme ça , il n'y a même pas de création de l, ses valeurs sont immédiatement traitées par map().
--------------
Pour l'affichage, y a de l'idée, mais ça cafouille un peu.
D'abord, si tu fais renvoyer lgrille par la fonction lire(), et l'imprimer par print lire(...), certes tu as l'écriture de lgrille à l'écran. Mais une fois ceci fait, lgrille ne se trouve plus accessible parce que c'était une variable locale, c'est à dire interne a lire().
Donc il faut l'enregistrer à l'extérieur:
Faire
lgrille = lire(...) print lgrille
Ensuite je ferais comme ça:
- afficher "-"*25
- pour chaque sous-liste de lgrille (c'est à dire une ligne), afficher la succession de chiffres et de '|' c'est à dire la ligne de chiffres proprement dite bien formatée
puis en dessous afficher "-"*25
Il faut savoir que sous Python 2.6 en tous cas, print fait revenir à la ligne donc
print (l[e]) print ("|")
va malheureusement faire afficher
l[e] sur une ligne
puis '|' à la ligne suivante
Pour contrecarrer ça, il faut faire
print (l[e]),("|")
La virgule empêche le retour à la ligne. Ça marche aussi si on écrit
print (l[e]), print ("|")
Mais il reste un ennui: print a,b fait affichér a et b avec touours un blanc entre les deux.
Pour éviter ceci il faut alors écrire print a+b, mais cela n'est possible que si a et b sont des chaînes. Si b est un entier par exemple, il suffit d'écrire print a+str(b).
Et hop.
Ceci dit, Python 3 a vu une augmentation notable des possibilités de la fonction print, et les pratiques sont sans doute différentes et plus simples à mettre en place. À toi de regarder tout ça et de te débrouiller avec mes indications pour arriver à écrire ta fonction d'affichage.
Pense aussi au fait que Python permet de jouer très facilement avec des indices.
Par exemple
l = [0,0,1,4,0,3,0,3,8] for i in (0,3,6): print l[i:i+3],
Allez, j'arrête là, on peut dire des tonnes de choses encore.
------------------------
pour garder l'indentation des lignes qui sont du code, dans le message ue tu postes, il faut sélectionner les lignes en question et appuyer sur le bouton à icône de page blanche qui se trouve juste après les icônes G I S