IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Compréhension sur les principes en python


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Points : 12
    Points
    12
    Par défaut Compréhension sur les principes en python
    Bonjour,

    Je me permet de vous faire un petit poste pour connaitre vos avis sur mes quelques ligne de code, sachant que je vient du monde du C et du PHP cela fait quelque jours que je pratique le python... quel régale... j'adore
    J'ai codée un petit jeu en réseau de célèbre "Plus" et "Moins" en plus complet bien-sur, je voulais connaitre vos critiques par rapport a mon code et aussi vos avis sur celui ci, le but de ma demande et savoir si je m’oriente dans le bon sens dans l'apprentissage de ce langage.

    Partie Server :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    import socket
    import random
    import _thread
     
     
    class GameServer:
        """ Server class for gaming LESS/MORE/WINNER """
        server = True
        max_connected = 50
        lock = False
        number = 0
     
        def __init__(self, host=socket.gethostbyname(socket.gethostname()),
                     port=random.randint(1025, 10000)):
            """ Init parameter of game server
            :param host:
            :param port:
            """
            self.host = host
            self.port = port
     
            """ Declare list for management users """
            self.socket_list = list()
            self.gamers = list()
            self.number = random.randint(1, 100)
     
            self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.server.bind((self.host, self.port))
            self.server.listen(self.max_connected)
            self.lock = _thread.allocate_lock()
     
        def renew(self):
            """ Renew number """
            self.number = random.randint(1, 100)
            print('New game started, number is %i' % self.number)
     
        def id(self):
            """ Generate new gamer ID"""
            game_id = 0
            while game_id not in self.gamers:
                game_id = random.randint(1, 1000)
                self.gamers.append(game_id)
            return game_id
     
        def broadcast(self, winner):
            """ Diffused information at other gamer"""
            for gamer in self.socket_list:
                gamer.send(GameServer.write('WINNER:%i' % winner))
     
        def whoes(self):
            """ Return number of users """
            return len(self.gamers)
     
        @staticmethod
        def write(message):
            """ Convert message to encode """
            return str(message).encode()
     
        def handler(self, client, game_id):
            """ Thread client to liberate accept """
            while True:
                try:
                    request = client.recv(1024).decode()
                    if request == 'END':
                        print('Gamer %i has left the game...' % game_id)
                        self.gamers.remove(game_id)
                        client.close()
                        break
                    request = request.split(':')
                    if request[1] == 'WHOES':
                        client.send(GameServer.write('NB:%i' % self.whoes()))
                        continue
                    else:
                        r_number = int(request[1])
                        print('Received %i from %i' % (game_id, r_number))
                        if r_number == self.number:
                            self.broadcast(game_id)
                            print('Winner ! gamer %i' % game_id)
                            self.renew()
                        else:
                            if r_number < self.number:
                                client.send('MORE:0'.encode())
                            elif r_number > self.number:
                                client.send('LESS:0'.encode())
                except ConnectionError:
                    print('lost connection with gamer %i ...' % game_id)
                    client.close()
     
        def run(self):
            """ Run server """
            print('Server start on %s:%i ...' % (self.host, self.port))
            print('Secret number is %i ' % self.number)
            while True:
                (gamer, addr) = self.server.accept()
                game_id = self.id()
                print('accept connection to %s : %s' % (str(addr), game_id))
                self.socket_list.append(gamer)
                gamer.send(str(game_id).encode())
                _thread.start_new_thread(self.handler, (gamer, game_id,))
     
    #Server start
    game = GameServer(host='127.0.0.1', port=58005)
    game.run()
    La partie client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    import socket
     
    Host = '127.0.0.1'
    Port = 58005
     
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((Host, Port))
    game_id = client.recv(1024)
    game_id = str(game_id.decode())
    print('My game id is: %s' % game_id)
    while True:
        command = game_id + ':' + input('Enter number: ').rstrip('\n')
        client.send(command.encode())
        reply = str(client.recv(1024).decode()).split(':')
        code = reply[0]
        if code == 'WINNER':
            if reply[1] == game_id:
                print('Your win !')
            else:
                print('Your loose... the winner is %s' % reply[1])
            restart = input('Would you like to restart game ? [y/n]: ')
            if restart == 'y':
                continue
            else:
                client.send('END'.encode())
                client.close()
                break
        else:
            if code == 'MORE':
                print('The number is superior')
            elif code == 'LESS':
                print('The number is inferior')
            elif code == 'NB':
                print('Number of connected %s' % reply[1])
            else:
                print('Impossible to parse response of server...')
                continue
    Je vous remercies d'avance pour avoir pris le temps de lire le code
    Excellente journée.
    Divx.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dlasserre Voir le message
    Bonjour,

    Je me permet de vous faire un petit poste pour connaitre vos avis sur mes quelques ligne de code, sachant que je vient du monde du C et du PHP cela fait quelque jours que je pratique le python... quel régale... j'adore
    J'ai codée un petit jeu en réseau de célèbre "Plus" et "Moins" en plus complet bien-sur, je voulais connaitre vos critiques par rapport a mon code et aussi vos avis sur celui ci, le but de ma demande et savoir si je m’oriente dans le bon sens dans l'apprentissage de ce langage.
    Bonjour

    Quelques jours de Python et déjà tu en es à la manipulation d'objets !!! Pas mal.

    Concernant tes objets justement, essaye de privilégier les membres privés quand c'est possible. Même pour les membres statiques. Ca t'évitera le risque qu'ils soient modifiés de façon anarchique depuis l'extérieur. Ce qui n'empêche toutefois pas les récupérations externes (voire même les modifs externes si tu en garantis le contrôle) en utilisant les getters et les setters
    Typiquement
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    class GameServer:
        """ Server class for gaming LESS/MORE/WINNER """
        __server = True
        __max_connected = 50
        __lock = False
        __number = 0
     
        # Getters/Setters
        def get_host(self): return self.__host
        def set_host(self, host): self.__host=host
        host=property(get_host, set_host)
        def get_port(self): return self.__port
        port=property(get_port)
     
        def __init__(self, host=socket.gethostbyname(socket.gethostname()),
                     port=random.randint(1025, 10000)):
            """ Init parameter of game server
            :param host:
            :param port:
            """
            self.__host = host     # Perso j'aurais mis le socket.gethostbyname() ici...
            self.__port = port      # Idem
        ...
    #
     
    game = GameServer(host='127.0.0.1', port=58005)
    print "host:", game.host    # Passage par le getter
    print "port:", game.port     # idem
    game.host="localhost"       # Passage par le setter qui aura ainsi possibilité de contrôler l'entrée
    game.port=1324               # Erreur, le setter de port n'existe pas

    Les paramètres par défaut ne doivent servir que pour mettre des valeurs par défaut (et non commencer des actions qui entâchent la lisibilité du code surtout si ces actions sont possibles dans le init). Mais sinon j'aime bien ce code et je l'ai récupéré.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Je te remercie pour tes compliments , j'ai bien compris tes remarques et vais travailler dessus, merci a toi d'avoir pris le temps de me répondre, j'ai fait une V2 de mon petit programme qui devrai se rapprocher un peut plus des bon concepts.

    Partie server:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    import socket
    import _thread
    from more_less import *
     
     
    class GameServer:
        """ Server class for gaming LESS/MORE/WINNER """
        server = True
        lock = False
        game = False
     
        def __init__(self, host=socket.gethostbyname(socket.gethostname()),
                     port=random.randint(1025, 10000)):
            """ Init parameter of game server
            :param host:
            :param port:
            """
            self.host = host
            self.port = port
     
            """ Declare list for management users """
            self.socket_list = list()
            self.gamers = list()
            self.number = random.randint(1, 100)
            """ Init game, with number max of connection """
            self.game = MoreLess(5)
            """ Parameters for socket """
            self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.server.bind((self.host, self.port))
            self.server.listen(self.game.maxu)
            self.lock = _thread.allocate_lock()
     
        def broadcast(self, game_id, message):
            """ Diffused information at other gamer"""
            for gamer in self.socket_list:
                if gamer != self.game.cur():
                    print('Sending broadcast to %i' % self.game.cur())
                    gamer.send(GameServer.write('%s:%s' % (game_id, message)))
     
        @staticmethod
        def write(message):
            """ Convert message to encode """
            return str(message).encode()
     
        def handler(self, client, game_id):
            """ Thread client to liberate accept """
            while True:
                try:
                    request = client.recv(1024).decode()
                    if self.game.cur() == game_id:
                        response = self.game.playing(request)
                        if request != '%i:WHOES' % game_id:
                            self.game.round()
                        if response == 'QUIT':
                            client.send(self.write(response))
                            break
                        client.send(self.write(response))
                        if request != '%i:WHOES' % game_id:
                            print(request)
                            print('%i:WHOES' % game_id)
                            self.socket_list[self.game.gamers.index(self.game.cur())].send(self.write('ACCEPT'))
                        #self.broadcast(self.game.cur(), request)
                    else:
                        client.send(self.write('ROUND:0'))
                except ConnectionError:
                    print('lost connection with gamer %i ...' % game_id)
                    client.close()
     
        def run(self):
            """ Run server """
            print('Server start on %s:%i ...' % (self.host, self.port))
            print('Secret number is %i ' % self.game.number)
     
            while True:
                (gamer, addr) = self.server.accept()
                game_id = self.game.enter()
                print('accept connection to %s : %s' % (str(addr), game_id))
                self.socket_list.append(gamer)
                gamer.send(str(game_id).encode())
                if self.game.cur() == game_id:
                    gamer.send(self.write('ACCEPT'))
                _thread.start_new_thread(self.handler, (gamer, game_id,))
     
    #Server start
    game = GameServer(host='127.0.0.1', port=58005)
    game.run()
    Partie game server:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    import random
     
    class MoreLess:
        """ This game is funny """
        number = False
        maxu = 5
        gamers = list()
        current = None
     
        def __init__(self, maxu=0):
            """ Construct game """
            self.number = random.randint(0, 100)
            self.maxu = maxu
     
        # Users definitions
        def enter(self):
            """ Generate new gamer ID"""
            game_id = 0
            if len(self.gamers) < self.maxu:
                while game_id not in self.gamers:
                    game_id = random.randint(1, 1000)
                    self.gamers.append(game_id)
                if self.current is None:
                    self.current = game_id
                return game_id
            return False
     
        def quit(self, game_id):
            """ Remove gamer in list """
            if game_id in self.gamers:
                self.gamers.remove(game_id)
            else:
                return False
            return True
     
        # Game definition
        def superior(self, number):
            """ Number is superior """
            if self.number < number:
                return True
            return False
     
        def inferior(self, number):
            """ Number is inferior """
            if self.number > number:
                return True
            return False
     
        def eq(self, number):
            """ If number is equal """
            if self.number == number:
                return True
            return False
     
        def whoes(self):
            """ Return count of actually user connected """
            return len(self.gamers)
     
        def glist(self):
            """ Return gamer list"""
            return self.gamers
     
        def __getitem__(self, item):
            """ Get gamer """
            if item in self.gamers:
                return self.gamers[item]
            return False
     
        def cur(self):
            """ Return current gamer """
            return self.gamers[self.gamers.index(self.current)]
     
        def renew(self):
            """ Renew number """
            new = random.randint(0, 100)
            while new != self.number:
                self.number = new
            return True
     
        def round(self):
            """ Increment round """
            next_ = self.gamers.index(self.current).__int__() + 1
            if len(self.gamers) > next_:
                self.current = self.gamers[next_]
            else:
                self.current = self.gamers[0]
     
        def playing(self, request):
            """ Thread client to liberate accept """
            if request == 'END':
                return 'QUIT'
            request = request.split(':')
            if request[1] == 'WHOES':
                return self.whoes()
            else:
                r_number = int(request[1])
                if self.eq(r_number):
                    self.renew()
                    return 'EQ:%i' % self.current
                else:
                    if self.inferior(r_number):
                        return 'MORE:0'
                    elif self.superior(r_number):
                        return 'LESS:0'
    Et la partie client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    import socket
     
    Host = '127.0.0.1'
    Port = 58005
     
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((Host, Port))
    game_id = client.recv(1024)
    game_id = str(game_id.decode())
    print('My game id is: %s' % game_id)
    if client.recv(1024).decode() == 'ACCEPT':
        while True:
            command = game_id + ':' + input('Enter number: ').rstrip('\n')
            client.send(command.encode())
            reply = str(client.recv(1024).decode()).split(':')
            code = reply[0]
            if code == 'EQ':
                if reply[1] == game_id:
                    print('Your win !')
                else:
                    print('Your loose... the winner is %s' % reply[1])
                restart = input('Would you like to restart game ? [y/n]: ')
                if restart == 'y':
                    continue
                else:
                    client.send('END'.encode())
                    client.close()
                    break
            elif code == 'ROUND':
                print('Pleas wait not your round...')
     
            else:
                if code == 'WAIT':
                    print('You solo in game,please wait new user')
                if code == 'MORE':
                    print('The number is superior')
                    response = False
                    while response != 'ACCEPT':
                        response = str(client.recv(1024).decode())
                    continue
                elif code == 'LESS':
                    print('The number is inferior')
                    response = False
                    while response != 'ACCEPT':
                        response = str(client.recv(1024).decode())
                    continue
                elif code == 'NB':
                    print('Number of connected %s' % reply[1])
                else:
                    print('Special %s' % reply[0])
                    continue
    Merci encore de tes conseils que je vais appliquer de suite.

    Cordialement.
    dlasserre.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dlasserre Voir le message
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if code == 'EQ':
                if reply[1] == game_id:
                    print('Your win !')
    Gaffe aux "valeurs magiques" c'est à dire des valeurs ayant une signification particulière pour le logiciel. Si un jour tu veux modifier "EQ" faudra penser à le modifier de partout.

    Comme je viens du C, j'ai l'habitude des #define et donc je l'ai reporté en Python. Exemple

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class MoreLess
        Equal=0x01
        Less=0x02
        More=0x03
        def __init__(...)
        ...
    # class MoreLess
     
    ...
    if code == MoreLess.Equal:
        if reply[1] == game_id:
               print('Your win !')
    ...

    Ce qui rend le code un peu plus robuste.

    Toutefois dans ce cas précis, tu peux tout virer et utiliser la classe operator. Il s'agit d'une classe reprenant tous les opérateurs mathématiques et de comparaison dans des méthodes dédiées. Ca permet d'automatiser certaines opérations sans avoir à écrire différentes instructions

    Exemple: apprentissage des tables d'addition et multiplication
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import operator
    # Apprentissage des tables d'addition et multiplication
    def table(n):
    	for (text, op, symbol) in (
    		("addition", operator.add, "+"),
    		("multiplication", operator.mul, "*"),
    	):
    		print("table %s de %d" % (text, n))
    		for i in range(1, 10):
    			print("%d %s %d = %d" % (n, symbol, i, op(n, i)))
    	# for
    # table(n)
     
    table(7)
    table(8)


    Et donc je pense que ici, typiquement, tu pourrais utiliser "operator.eq" à la place de "EQ" (et faire de même avec "operator.le" et "operator.gt"). Certes ça redevient des "valeurs magiques" mais ces valeurs sont tellement bien représentatives de la logique de l'algo que le risque de modif est minime (qui irait mettre autre chose qui serait alors moins représentatif ???)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Points : 12
    Points
    12
    Par défaut
    Salut,

    Merci de ta réponse, effectivement cela a l'air vraiment intéressant, je ne connaissait pas ce module de plus de la façon que tu l'utilise est tous nouveau pour moi mettre un tuple, je ne connaissait pas.
    Je vais suivre tes conseil et je vais essayer d'utiliser ce module afin d'éviter les problème que tu m'a cité ci-dessus.
    Je vient aussi du monde du C, mais je t'avoue qu'en python je ne savais comment reproduire les directive pré-processeur, en faite simplement en attribut de classe .

    J'apprend pleins de nouvelles chose sur ce langage et cela me passionne... j'applique d'autre langage dans mon quotidien professionnel comme le PHP et le C et c'est la première fois que je trouve un langage aussi flexible et séduisant qu'est le python !

    Merci
    Excellente journée.
    dlasserre.

Discussions similaires

  1. [Objective-C] Aide à la compréhension sur les retain, release, copy etc
    Par an.be dans le forum Objective-C
    Réponses: 5
    Dernier message: 02/11/2011, 13h33
  2. Question sur les installateurs de Python
    Par eyquem dans le forum Déploiement/Installation
    Réponses: 3
    Dernier message: 14/03/2009, 23h03
  3. pblm de compréhension sur les référence en
    Par cdm1024 dans le forum C++
    Réponses: 4
    Dernier message: 10/12/2007, 16h12
  4. Réponses: 2
    Dernier message: 18/04/2007, 15h40
  5. [Smarty] problème compréhension sur les tableaux
    Par mohican13 dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 09/02/2006, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo