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 19/06/2006, à 04:48

Shuriken

[Résolu]Premiers pas en python - retour chariot

Bonjour,

J'ai eu envie de commencer à apprendre la programmation avec python, parce que ça avait l'air chouette. Ça date d'à peine deux jours et je me casse déjà les dents sur un exercice pourtant fort simple, à savoir obtenir ce petit dessin en console :

*
**
***
****
*****
******
*******

J'ai pondu ça :

# -*- coding:Utf-8 -*-

i, j = 0, 0
while (i < 7):
	while (j <= i):
		print "*"
		j +=1
	j = 0
	print "" #retour chariot après chaque ligne
	i +=1

Mon problème est que l'usage de print force un retour chariot en fin d'instruction, et je ne sais pas comment passer outre cela (le résultat est que toutes mes lignes ne comportent qu'une seule étoile).
Bien que débutant en programmation, j'ai quand même des notions en C, et cet exercice ne me pose aucun problème dans cet autre langage :

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
	int i = 0, j = 0;
	while (i < 7)
	{
		while (j <= i)
		{
			printf("*");
			j ++;
		}
		j = 0;
		printf("\n"); /* retour chariot après chaque ligne */
		i ++;
	}
	return 0;
}

Comment obtenir l'équivalent de ce code source C en python ?
Merci, je tourne en rond là. smile

Dernière modification par Shuriken (Le 19/06/2006, à 11:11)


Don't mess with the penguins!

Hors ligne

#2 Le 19/06/2006, à 07:02

deconnect

Re : [Résolu]Premiers pas en python - retour chariot

Bien le bonjour à toi.

Ben écoute, je viens de regarder le code de mon projet python que j'ai du faire et j'ai des retour chariot en faisait

print 'Toto'

Donc en utilisant des simple quote ( ' ) plutôt que les doubles ( " ), je ne sais pas si c'est ça le problème, mais chez j'ai le retour chariot.

A plus

Hors ligne

#3 Le 19/06/2006, à 07:35

Shuriken

Re : [Résolu]Premiers pas en python - retour chariot

Salut,

Les simples quotes et les doubles quotes ont le même fonction - j'ai déjà vu les deux dans des exemples.
En fait, j'en ai conclu que les doubles ont l'avantage de pourvoir inclure la simple quote ' dans la chaîne de caractères, par exemple :
variable = "J'aime le Python"

Mais ma question n'était pas comment faire un retour chariot (puisque print en rajoute un automatiquement après la chaîne de caractères), mais au contraire comment afficher successivement le contenu d'un (ou plusieurs) print sans avoir un retour chariot entre chacun d'entre eux (cf. mon dilemme dans le petit exercice).


Don't mess with the penguins!

Hors ligne

#4 Le 19/06/2006, à 08:51

node

Re : [Résolu]Premiers pas en python - retour chariot

for i in range(7):
  print "*" * (i + 1)

Hors ligne

#5 Le 19/06/2006, à 09:23

node

Re : [Résolu]Premiers pas en python - retour chariot

Ou si tu veux garder ta structure avec les while, tu peux former ta chaîne et l'afficher après :

i, j = 0, 0
while (i < 7):
    chaine = ""
    while (j <= i):
        chaine += "*"
        j +=1
    j = 0
    print chaine
    i +=1

Hors ligne

#6 Le 19/06/2006, à 11:10

Shuriken

Re : [Résolu]Premiers pas en python - retour chariot

Wow, je ne savais pas qu'on pouvait faire directement des opérations sur des chaînes, ça contraste drôlement avec mon code C.
Merci beaucoup, c'est très clair maintenant.


Don't mess with the penguins!

Hors ligne

#7 Le 19/06/2006, à 12:08

aleph

Re : [Résolu]Premiers pas en python - retour chariot

Réponse à l'exemple:

for i in xrange(1, 8):
    print '*' * i
   
*
**
***
****
*****
******
*******

ou bien

i = 1
while i < 8:
    print '*' * i
    i += 1
   
*
**
***
****
*****
******
*******

Note, le string * est délimité avec des ' ', le choix des " " est aussi possible. Les deux variantes sont identiques. J'utilise ' ' car plus rapide avec mon clavier.

Réponse à la question:

Une commande print quelquchose envoie automaiquement un "eol", techniquement un os.linesep. Un print quelquchose, n'envoie pas de eol. Exemple:
print 1, 2, 3
donne
1 2 3

Erreur dans l'information d'encodage, info correcte :
# -*- coding=utf-8 -*-


Pour le débutants:
Lire http://docs.python.org/tut/tut.html. Cette documentation est générallement donnée avec toute installation de Python, un fichier chm sous Windows, pour Ubuntu, je ne sais pas. Elle est aussi téléchargeable. Courte, simple, permet l'interactivité avec un shell Python. Il n'y a pas mieux à ce jour. J'insiste sur ce point.

#8 Le 19/06/2006, à 12:22

manatlan

Re : [Résolu]Premiers pas en python - retour chariot

si tu voulais juste afficher un caractère, il vaut mieux l'écrire sur la sortie standard directement (stdout)

import sys
sys.stdout.write("*")


"Oui, oui."
                -- Shakespeare (Richard III, Acte I, Scène IV)

Hors ligne

#9 Le 19/06/2006, à 12:25

manatlan

Re : [Résolu]Premiers pas en python - retour chariot

aleph a écrit :

Pour le débutants:
Lire http://docs.python.org/tut/tut.html . Cette documentation est générallement donnée avec toute installation de Python, ... . Il n'y a pas mieux à ce jour. J'insiste sur ce point.

Si le débutant connait déjà un autre language ... et veut découvrir python d'une façon très agréable, et très simple ...

C'est DIVE INTO PYTHON (en français), la référence
http://diveintopython.adrahon.org/toc/index.html


"Oui, oui."
                -- Shakespeare (Richard III, Acte I, Scène IV)

Hors ligne

#10 Le 19/06/2006, à 12:51

aleph

Re : [Résolu]Premiers pas en python - retour chariot

> manatlan

DiveIntoPython: d'accord avec toi. Mais malheureusement souvent en retard d'un version.
Je pense que le tutorial est plus adéquat pour quelqu'un qui part de zéro. Il eût été possible
de trouver la réponse au problème print, alors que dans DiveIntoPython le cas n'est pas mentionné (si ma mémoire est bonne).

D'accord aussi avec sys.stdout.write(), plus compliqué à appréhender pour un néophyte.

Ce que je déplore, ce sont les gens qui mettent résolu alors que ce ne l'est pas. Il est bon de laisser ce genre de discussion pendante.

#11 Le 19/06/2006, à 15:42

Shuriken

Re : [Résolu]Premiers pas en python - retour chariot

aleph a écrit :

Erreur dans l'information d'encodage, info correcte :
# -*- coding=utf-8 -*-

Ah, pas de majuscule à utf-8 ?  Si j'en avais mis une c'est parce que le cours que que je suis en train de lire l'avait écrit de la sorte, et comme l'interpréteur n'a jamais bronché...

manatlan a écrit :

C'est DIVE INTO PYTHON (en français), la référence

Pour la question des cours, je me base sur celui-là, que je trouve vraiment abordable : http://www.cifen.ulg.ac.be/inforef/swi/python.htm
Le Dive into Python a l'air très instructif, je le lirais dès que j'aurais des bases un peu plus solides vu qu'il semble être moins axé pour les débutants.

aleph a écrit :

Ce que je déplore, ce sont les gens qui mettent résolu alors que ce ne l'est pas. Il est bon de laisser ce genre de discussion pendante

Si j'ai passé mon sujet en [Résolu], c'est tout simplement parce que j'ai eu la solution à mon problème, et que j'ai compris le raisonnement des réponses données par node.
Après, si vous voulez tergiverser sur les différentes méthodes possibles, libre à vous, tout est bon à prendre bien au contraire (bien que l'histoire de la "sortie standart" me soit totalement incompréhensible).
Quoi qu'il en soit, merci pour ces précisions.

Dernière modification par Shuriken (Le 19/06/2006, à 17:10)


Don't mess with the penguins!

Hors ligne

#12 Le 19/06/2006, à 16:10

manatlan

Re : [Résolu]Premiers pas en python - retour chariot

Shuriken a écrit :

bien que l'histoire de la "sortie standart" m'est totalement incompréhensible.

oups, désolé ...
je pensais que tu étais déjà informaticien, vu que tu as fait une version C de ton algo ...
oui, "dive into python" est vraiment bien, si tu pratiques déjà un autre langage, pk il y a sans cesses, des références à "comment on fait ça en C/VB/JAVA/PERL ..."
Sinon, il te sera pas très utile ... (peut être qques tips interessants)

(pourtant, dans ton prog C, tu utilises aussi la sortie standard ... le stdio.h (standard input/output) à travers printf() ...)


"Oui, oui."
                -- Shakespeare (Richard III, Acte I, Scène IV)

Hors ligne

#13 Le 19/06/2006, à 16:38

fabrom

Re : [Résolu]Premiers pas en python - retour chariot

De mémoire, pour supprimer le retour chariot auto. ajoutes une virgule en fin d'instruction

print "*",

Hors ligne

#14 Le 19/06/2006, à 16:40

node

Re : [Résolu]Premiers pas en python - retour chariot

Oui mais la virgule ajoute un espace, et la sortie de l'exemple donné ne contient pas d'espace.
J'ignore s'il y a moyen d'enlever cet espace.

Hors ligne

#15 Le 19/06/2006, à 16:44

aleph

Re : [Résolu]Premiers pas en python - retour chariot

Premier point, mea culpa:

Ton encodage est parfaitement correcte, les majuscules n'ont pas d'importance. La définition de l'encodage suit une expression régulière particulière, j'ai commis une grosse bourde en faisant le confudion entre : et =

Deuxième point, résolu:

Tu as écrit:
Si j'ai passé mon sujet en [Résolu], c'est tout simplement parce que j'ai eu la solution à mon problème, et que j'ai compris le raisonnement des réponses données par node.
Après, si vous voulez tergiverser sur les différentes méthodes possibles, libre à vous, tout est bon à prendre bien au contraire (bien que l'histoire de la "sortie standart" m'est totalement incompréhensible).
Quoi qu'il en soit, merci pour ces précisions.

Ce que je veux dire par là. Il n'est pas toujours bon de s'accrocher à la première réponse venue sous prétexte qu'elle fonctionne. Si tu veux apprendre correctement la programmation, il est intéressant d'essayer de comprendre les solutions proposées.

Dans le version
for i in range(7):
  print "*" * (i + 1)

l'addition (i + 1) est effectuée 7 fois.

Dans la version
for i in xrange(1, 8):
    print '*' * i

aucune addition n'est effectuée et l'itérateur xrange et beaucoup plus performant que l'itérateur range.

Evidemment que dans ce cas, ça n'a pas beaucoup d'importance, mais si ta boucle est plus importante et doit faire autre chose....

Pour ma part, je coderais comme ceci
for i in xrange(1, 8):
    print ('%s') % ('*' * i)

#16 Le 19/06/2006, à 17:02

aleph

Re : [Résolu]Premiers pas en python - retour chariot

node a écrit :

Oui mais la virgule ajoute un espace, et la sortie de l'exemple donné ne contient pas d'espace.
J'ignore s'il y a moyen d'enlever cet espace.

Non, pour imprimer par ex. 3 chars successifs on aura avantage à utiliser

print ('%s%s%s') % ('a', 'b', 'c')

#17 Le 19/06/2006, à 18:09

Shuriken

Re : [Résolu]Premiers pas en python - retour chariot

manatlan a écrit :

je pensais que tu étais déjà informaticien, vu que tu as fait une version C de ton algo ...
(pourtant, dans ton prog C, tu utilises aussi la sortie standard ... le stdio.h (standard input/output) à travers printf() ...)

Haha, effectivement je suis très loin d'être un programmeur en C. Quant à la lib stdio.h, bien que je connaisse le principe et les usages de printf()/scanf(), ça ne va guère plus loin !

Pour les optimisations dans les structures avec range, je n'en suis pas encore là, mais je prends note pour la suite.

aleph a écrit :

Non, pour imprimer par ex. 3 chars successifs on aura avantage à utiliser

print ('%s%s%s') % ('a', 'b', 'c')

Le but de la manœuvre est d'afficher le contenu de 3 variables a, b et c, sans se soucier de leur type non ? Si oui, pourquoi les entourer de quotes ?

Sinon, je ne pensais pas susciter autant d'intérêt pour une malheureuse question à propos de print... j'adore ce forum. ^^

Dernière modification par Shuriken (Le 19/06/2006, à 18:09)


Don't mess with the penguins!

Hors ligne

#18 Le 19/06/2006, à 18:41

aleph

Re : [Résolu]Premiers pas en python - retour chariot

> Shuriken

As-tu lu le "tutorial" (écrit par GvR) que je t ai proposé ? A lire avant tout autre bouquin !

#19 Le 20/06/2006, à 01:30

Shuriken

Re : [Résolu]Premiers pas en python - retour chariot

Bien, ça sera fait big_smile Et je réviserai mon anglais mon passage...
Encore merci.


Don't mess with the penguins!

Hors ligne