J'apprends encore Python. Je viens d'écrire cette méthode pour déterminer si un joueur a gagné un jeu de tic-tac-toe encore, étant donné un état de société comme: '[['o','x','x'],['x','o','-'],['x','o','o']]'
Python: est-il sensé de refactoriser cette vérification dans sa propre méthode?
def hasWon(board):
players = ['x', 'o']
for player in players:
for row in board:
if row.count(player) == 3:
return player
top, mid, low = board
for i in range(3):
if [ top[i],mid[i],low[i] ].count(player) == 3:
return player
if [top[0],mid[1],low[2]].count(player) == 3:
return player
if [top[2],mid[1],low[0]].count(player) == 3:
return player
return None
Il me est apparu que je vérifie les listes de 3 caractères plusieurs fois et pourrait factoriser le contrôle de sa propre méthode comme ceci:
def check(list, player):
if list.count(player) == 3:
return player
... mais alors réalisé que tout ce qui fait vraiment est des lignes de changement comme:
if [ top[i],mid[i],low[i] ].count(player) == 3:
return player
à:
if check([top[i],mid[i],low[i]], player):
return player
... ce qui ne semble franchement pas beaucoup améliorer. Voyez-vous une meilleure façon de refactoriser cela? Ou en général une option plus Pythonic? J'aimerais l'entendre!
Un autre avantage de transmettre la liste à une fonction est que vous ne besoin de hard-code '3', vous pouvez utiliser la longueur de la liste à la place. –
@Andrew, +1, excellent point - laissez-moi modifier en conséquence! –
Et vous ne devez pas passer dans le joueur non plus; vous pourriez juste comparer au premier élément de somelist - bien que cela ait un certain impact sur la structure externe, aussi. Mais la petite méthode pourrait devenir un test de toutTheSame (liste), dont le résultat pourrait alors être testé contre les vrais joueurs. –