Apprentissage Python

Salut à tous, je viens de recontrer un problème sur lequel je n’arrive pas à comprendre le résultat que python m’affiche, mais je comprend pourtant bien la structure du programme, et ça me semble tout bon…

Je me suis dis, plutôt que de faire un nouveau topic, je vais carrément faire un topic dans lequel j’exposerais les divers problèmes que je rencontrerais, si ça ne dérange pas ?

Bien, alors j’explique celui-ci, je suis sensé faire un programme qui permet d’inverser l’ordre des caractères d’une chaîne quelconque, mais tout en definissant une fonction, qui renverra la chaine inversée au programme, donc en gros juste définir une fonction simple…

Voilà mon code:

[code]#!/usr/bin/python

-- coding: Utf-8 --

def inverse(ch):
vch = "ch"
lc = len(vch)
x = lc-1
nch = ""
while x >=0:
nch = nch + vch[x]
x = x-1
return nch

print inverse(‘Programme’)[/code]

Et ça me sort: hc

Et donc tout me semble bien pourtant, je n’ai pas de correction pour cet exo, mais un exo du même genre oui, j’ai regardé, et c’est la même chose…

Je ne vois pas trop d’où il sort le “hc”

Quelqu’un aurait-il une idée ?

Merci :slightly_smiling:

Edit: Ah merde, quel idiot c’est pas possible… Je sais d’où ca vient maintenant… Y’a des jours où je me taperais bien sur la tronche…

Je n’y connais rien en python mais si j’ai bien compris ton prog ici tu demande d’inverser la chaîne ch et donc forcement il te sort hc.

Si c’est programme que tu veux inverser faut le passer en paramètre à ta fonction et le récupérer ce que je ne vois pas dans ton programme actuel.

Mais je le répète je n’y connais rien en python.

Ouais, c’est le ch…

Mais je pensais qu’en appelant la fonction avec inverse(‘quelquechose’) ça remplacerait le ch

C’est ce que j’ai du oublier…

J’ai trouvé… :

[code]#!/usr/bin/python

-- coding: Utf-8 --

def inverse(ch):
vch = ch
lc = len(vch)
x = lc-1
nch = ""
while x >=0:
nch = nch + vch[x]
x = x-1
return nch

print inverse(‘Poulet’)[/code]

Franchement désolé pour ce post, j’ai manqué de matière grise là… aie aie aie

Salut à tousss

J’ai attaqué la programmation GUI avec python là et je suis sur le point de faire un damier.

Alors pour l’instant je n’ai fais que la base du programme avec les widgets, et donc une case du damier, pour tester, avant d’y mettre une boucle afin de faire tout le damier.

Voici mon code:

[code]#! /usr/bin/env python

-- coding: Latin-1 --

def damier():
"tracé du damier"
x1, y1, x2, y2 = 0, 20, 20, 20
coul='black’
can1.create_rectangle(x1, y1, x2, y2, width=2, fill=coul)

#--------Programme Principal----------

from Tkinter import *

fen1 = Tk()
can1 = Canvas(fen1, width=200, height=200, bg=‘white’).pack(side=TOP, padx=5, pady=5)
bou1 = Button(fen1, text=‘Damier’, command=damier).pack(side=LEFT, padx=3, pady=3)
fen1.mainloop()[/code]

Et le truc, c’est que lorsque je lance le programme, tout va bien, il m’affiche tout correctement, mais le truc c’est que quand je clique sur “Damier”, une erreur sort dans le terminal, voici cette erreur:

[quote]Exception in Tkinter callback
Traceback (most recent call last):
File “lib-tk/Tkinter.py”, line 1348, in call
return self.func(*args)
File “/home/ymer/Desktop/exooo2.py”, line 11, in damier
can1.create_rectangle(x1, y1, x2, y2, width=2, fill=coul)
AttributeError: ‘NoneType’ object has no attribute ‘create_rectangle’[/quote]

Le truc c’est que ne vois absolument pas pourquoi il me sort ça, sachant que j’ai tout bon, je pense en être sûr, je n’ai pas envie de regarder la solution de l’exo, mais je sais que j’ai fais comme ça pour un exo d’avant et ça marchait très bien…

Quelqu’un pourrait-il m’aider? Merci bien!

Comme quoi même avec un bon tuto on a besoin d’aide :unamused:

:stuck_out_tongue:

PS: J’ai cherché un peu sur Google l’erreur, et apparemment c’est une erreur assez généralisée, ça concerne pas mal de trucs, donc pas facile de s’y retrouver…

En plus simple

>>> def reverse(string):
...   ret = ""
...   for char in string:
...     ret = char + ret
...   return ret
... 
>>> print reverse("boo")
oob

Tu ne lis pas ce que tu écrit!

   can1.create_rectangle(x1, y1, x2, y2, width=2, fill=coul) 

Ou est la définition de “can1” ?

Voila à quoi ressemble ce que tu veux faire en code “correct”:

#! /usr/bin/env python
# -*- coding: Latin-1 -*-

import Tkinter

class DamierObject(object):
    def __init__(self, canvas, dimension, size):
        self.canvas = canvas
        self.dimension = dimension
        self.size = size

    def afficherDamier(self):
        "tracé du damier"
        x1, y1, x2, y2 = 0, 20, 20, 20

        ## Division par zéro, c'est pas cool!
        assert(self.size)

        coul = 'black'
        coordonnees_a_colorier = []

        delta_x = self.dimension[0] / self.size
        delta_y = self.dimension[1] / self.size

        for rect_x in range(self.size):
            if rect_x % 2:
                continue

            for rect_y in range(self.size):
                if rect_y % 2:
                    continue

                x1 = rect_x * delta_x
                x2 = x1 + delta_x

                y1 = rect_y * delta_y
                y2 = y1 + delta_y

                self.canvas.create_rectangle(x1, y1, x2, y2, width=1, fill=coul)

class MonProgramme:
    def __init__(self, fen1):
        height  = 200
        width   = 200

        cases = 10

        self.canvas = Tkinter.Canvas(fen1, width = width, height = height, bg = 'white')
        ## Ajout du canvas au layout
        self.canvas.pack(side = Tkinter.TOP, padx = 5, pady = 5)

        ## Création objet damier
        self.damier = DamierObject(self.canvas, (width, height), cases)

        ## Création bouton
        self.bouton1 = Tkinter.Button(fen1, text = 'Damier', command = self.damier.afficherDamier)

        ## Ajout au layout du bouton
        self.bouton1.pack(side = Tkinter.LEFT, padx = 3, pady = 3)


#--------Programme Principal----------
if __name__ == "__main__":
    fen1 = Tkinter.Tk()
    monProgramme = MonProgramme(fen1)
    fen1.mainloop()

A+

Hum, d’accord, merci de ta réponse, ton code est un peu complexe pour moi, vu que je n’ai toujours pas vu “for”, “self” et “class”.

Mais je pensais que la définition de can1 était cette ligne du programme principal:

Edit: Dans un état de désespoir j’ai essayé de transformer la ligne ci-dessus par:

can1 = Canvas(fen1, width=200, height=200, bg='white') can1.pack(side=TOP, padx=5, pady=5)

Et ça marche, bon j’ai du corriger un petit problème au niveau des coordonnées, mais ça marche bien maintenant, et je pensais que le fait de mettre .pack() juste après ne faisait aucune différence… C’est fou…

Sinon je comprend que mon code ne soit pas vraiment correct, mais je fais avec ce que je connais pour le moment :confused:

Il n’est non seulement pas correct, mais j’ai l’impression que tu réfléchi pas beaucoup quand tu code en fait…

Lit plutot fr.diveintopython.org/ avant de coder :slightly_smiling:

Si tu connais pas self, class & co, tu va avoir du mal avec python au début, parceque python est un langage orienté objet, et il faut l’utiliser comme tel.

Quant au for, ça me parait un minimum essentiel quel que soit le langage.
Bon courage. :wink:

Bein, ouais si tu veux, mais en même temps je vais pas te sortir ce que je connais pas, mais c’est vrai que je fais beaucoup d’erreur idiotes, et ça a toujours été comme ça avec moi…

Je n’ai pas eu l’occasion de voir les self ou class, car ce n’est qu’un peu plus loin dans le livre, et je ne voulais pas brûler les étapes, idem pour for.

En tout cas on me dit, fait ci, fait ça, et on ne m’a appris que while pour faire ce genre de trucs, alors je fais avec… Et je viens de voir qu’avec la correction c’est la même chose, l’auteur utilise ça aussi…

Enfin bref, je vais vite apprendre for car ça a l’air le truc de base en effet…

:wink:

Il est inutile je pense de jouer les RTFM de la programmation si on veut aider on aide sinon autant passer son chemin, du moins c’est ma vision des forums.

On peut tout faire avec une boucle while. for n’est qu’une simplification (optimisation?) bref un 'tit truc qui fait plaisir.

[quote=“MisterFreez”]Il est inutile je pense de jouer les RTFM de la programmation si on veut aider on aide sinon autant passer son chemin, du moins c’est ma vision des forums.

On peut tout faire avec une boucle while. for n’est qu’une simplification (optimisation?) bref un 'tit truc qui fait plaisir.[/quote]

troll=true je ne pratique pas le python mais le c++ et le STEP 5 et 7
et si une boucle for et la même chose qu’une while en simplifier ça se saurait depuis longtemps .oui se sont deux boucles mais avec des conditions de fonctionnement et ça c’est une énorme différence! troll= false

J’ai lu hier que for n’était pas aussi utile en python qu’il l’est pour d’autres langages ?!

[quote=“rodmov”]troll=true je ne pratique pas le python mais le c++ et le STEP 5 et 7
et si une boucle for et la même chose qu’une while en simplifier ça se saurait depuis longtemps .oui se sont deux boucles mais avec des conditions de fonctionnement et ça c’est une énorme différence! troll= false[/quote]

Équivaut à

int i = 0; while (i < Nb){ i++;}
Non ?

Si c’est un problème de porté de la variable i

{ int i = 0; while (i < Nb){ i++;} }
Me trompe - je?

Je sais pas ce que c’est ton bouquin, mais le mec qui a écrit ça, c’est vraiment un gros naze qui a jamais touché a python de sa vie…

Perso, je travaille sur un projet regroupant un framework et une application métier, réunissant a eux 2 pas loin de 200 000 lignes de code en python. Je peux t’assurer que for est bien plus utilisé que while, et c’est assez évident!

Non c’est sûr le net que je l’ai lu pas dans mon livre.

J’ai tapé for python et je suis tombé dessus, par contre je sais plus où…

[quote=“MisterFreez”]

for (int i = 0; i < Nb; i++) {}

Équivaut à

int i = 0; while (i < Nb){ i++;}
Non ?

Si c’est un problème de porté de la variable i

{ int i = 0; while (i < Nb){ i++;} }
Me trompe - je?[/quote]
en C++
bien sur tu peux obtenir la même chose avec une boucle while et une for
quand elles sont seuls mais quand tu les imbriquent là c’est pas la même musique!
parce que les interdépendances sans fin du type while (true) risque de planter l’ordinateur si la condition de sortie de la boucle n’est jamais validée . 8)

Je crois me souvenir qu’il est possible de tout faire avec du while, mais il est vrais que for est tout de même bien pratique.

Tu fais comment tes boucles infinies de manière sécurisée si tu utilise pas while (true) ?

for (i=0x00 ; i!=0x01 ;) 
{
...
}

oups j’avais pas vu sécurisée :p!