Я мог бы использовать
def check(somelist, player):
return somelist.count(player) == 3
Редактировать : как @Andrew предложил в комментарии (tx @Andrew!), Вы можете сделать еще лучше, например ::
def check(somelist, player):
return somelist.count(player) == len(somelist)
без жесткого кодирования 3
- что также предлагает другую хорошую альтернативу:
def check(somelist, player):
return all(x==player for x in somelist)
, что очень прямо гласит "все элементы в списке равны player
". Общий смысл заключается в том, что, используя рефакторинг к отдельному методу, вы можете поиграть с реализацией этого метода - теперь, конечно, здесь код очень прост, поэтому преимущество также невелико, но это отличный момент, о котором нужно помнить, когда вы переходите к более сложный код.
Как вы заметили, в любом случае вам нужен только bool, так что это позволяет гораздо более простой подход - просто вернуть выражение bool, а не делать с ним if
. Важно никогда не использовать встроенное имя, например list
, для своих собственных идентификаторов - «привлекательная неприятность» языка ...; -).
Под этим я подразумеваю, что Python использует для своих встроенных функций множество красивых и привлекательных имен, таких как list, bool, sum и т. Д., Поэтому легко найти себя случайно, используя одно из этих имен для своей собственной переменной. и, кажется, ничего плохого не происходит ... пока не понадобится время, чтобы превратить, скажем, кортеж в список, использовать, очевидно, лучшее решение, x = list(thetuple)
... и в конечном итоге мы потратим наши попытки понять и устранить ошибки это произошло потому, что вы использовали list
для обозначения чего-то еще, кроме встроенного типа этого имени.
Так что, просто войдите в привычку , а не , используя эти хорошие встроенные имена для целей, отличных от указания соответствующих встроенных, и вы сэкономите себе много будущего ухудшения! -)
Возвращаясь к вашему коду, вы можете рассмотреть краткость, предоставляемую , а не распаковкой board
(трудное решение, поскольку ваш код вполне читабелен ... но может выглядеть немного многословно):
for i in range(3):
if check([row[i] for row in board], player):
return player
if check([row[i] for i, row in enumerate(board)], player):
return player
if check([row[2-i] for i, row in enumerate(board)], player):
return player
В конце концов, я думаю, что я буду придерживаться вашего выбора - более читабельного и просто чуть более многословного, если вообще - но, мне кажется, приятно осознавать альтернативы - здесь, перечислите понимание и enumerate
для создания списков для проверки в качестве альтернативы «ручному кодированию» трех возможностей.