[Python] * dans un .format : fonctionnement ?

Répondre
Partager Rechercher
Ola les Joliens,

faisant du Python en « loisirs » même si j'y ai recours plus ou moins régulièrement à un petit niveau pour le taf, je cherche de temps en temps des petits défis pour m'entrainer et m'améliorer.

Dernièrement, c'est l'idée de développer morpion simple, avec une AI qui m'a prise, dans le cadre de codes challenges.

Et pour représenter le plateau, j'ai vu la manip suivante :

Code:
    def __str__(self):
Code:
        return '''
Code:
        {} | {} | {}
Code:
        {} | {} | {}
Code:
        {} | {} | {}
Code:
        '''.format(*(self.board[7:] + self.board[4:7] + self.board[1:4]))
Et là, j'avoue bloquer total. Est-ce que quelqu'un peut m'expliquer ici le format ? Notamment le * et les + ? Je ne trouve nulle part d'explication claire là dessus.


Merci beaucoup !
Les opérateurs +/* s'appliquent en fait au self.board, qui est visiblement une liste avec des éléments indexés de 1 à 9 (normalement ça commence à 0 mais il ne semble pas utilisé ici, donc j'imagine que soit ça faisait chier le dev de compter à partir de 0, soit c'est utilisé pour autre chose).

Pour l'exemple, prends un tableau self.board = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

les 3 self.board[...] sont des sous-ensembles de la liste :
self.board[7:], c'est les 3 derniers éléments, soit [7, 8, 9]
self.board[4:7], les 3 du milieu, soit [4, 5, 6]
self.board[1:4], les 3 premiers (après zéro), soit [1, 2, 3]

Le +, c'est le simple opérateur de concaténation entre listes. Donc on va se retrouver avec une liste réordonnée [7, 8, 9, 4, 5, 6, 1, 2, 3]

Ici le *, c'est un peu plus sioux, c'est un opérateur qui "dépaquette" ta liste. Donc tu te retrouves avec 7, 8, 9, 4, 5, 6, 1, 2, 3, comme si tu avais écris les éléments à la suite juste séparés par une virgule. Pour info c'est généralisable aux différents types de conteneurs / ensembles, dont les tuples ou aussi les dictionnaires (sauf que l'opérateur de dépaquetage devient "**", des tutos en ligne sauront probablement mieux expliquer que moi les nuances).

Bref, si tu déplies tout ça, tu te retrouves au final avec un code qui fait grosso modo:
Code:
"{} | {} | {} | {} | {} | {} | {} | {} | {}".format(7, 8, 9, 4, 5, 6, 1, 2, 3)
Dont le rôle est déjà plus clair

Dernière modification par Rafa ; 27/03/2020 à 20h25.
Ah ok, tout simplement ! Merci.
En fait je n'avais jamais (ou presque, mais dans ce cas je ne m'y étais pas arrêté) le * ou ** pour le dépaquetage.
Dans ce cas précis, j'avais bêtement cru que c'était du coup un argument ou une option de .format, et du coup mes recherches pour comprendre n'aboutissaient à rien.
Mais en relisant le code avec ton explication, c'est évident, j'aurais pu trouver seul en fait, comme on se dit souvent après coup.

Et en recherchant « unpacking python » j'ai trouvé toutes les explications complémentaires nécessaires.

Merci !
Je profite de ce topic plutôt que d'en créer un autre inutilement :

Citation :
class Player:

def _init_(self, prenom, nom):
self.prenom = prenom
self.nom = nom
print("Bienvenue au membre", prenom, nom)

player1 = Player("Ron", "J.")
J'obtiens cette erreur :



Citation :
player1 = Player("Ron", "J.")

TypeError: object() takes no parameters
J'ai beau chercher je ne pige pas...

Message supprimé par son auteur.
Citation :
Publié par MadWard (Ternel)
Je fais pas de Python, mais ma rapide recherche Google m'indique que c'est __init__ (double underscore de chaque côté) le constructeur d'une classe.
Putain j'ai passé 30mn dessus alors que c'était sous mon nez

Merci MadWard !
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés