Найти - Пользователи
Полная версия: Как работает return?
Начало » Python для новичков » Как работает return?
1
m1cky
Привет,всем!Сразу говорю что совсем новичок,и возник немного туповатый вопрос.
Суть такая,пишу функцию для игры крестики-нолики,которая принимает в виде аргумента доску(представлена списком из 9 значений) и возвращает победителя(winner),либо TIE(ничья),либо None.

Вот код:
def winner(board):
"""Определяет победителя в игре."""
WAYS_TO_WIN = ((0,1,2),
(3,4,5),
(6,7,8),
(0,3,6),
(1,4,7),
(2,5,8),
(0,4,8),
(2,4,6))
for row in WAYS_TO_WIN:
if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY:
winner = board[row[0]]
return winner
if EMPTY not in board:
return TIE
return None
Проверяю ее на работоспособность:
board =["X","X","O"," ","O","X","O"," "," "]
print(winner(board))
Всё отлично работает!
>>> 
O
Но если return сдвинуть на один таб вправо, то почему-то функция перестает пахать:
Ее вид:
def winner(board):
"""Определяет победителя в игре."""
WAYS_TO_WIN = ((0,1,2),
(3,4,5),
(6,7,8),
(0,3,6),
(1,4,7),
(2,5,8),
(0,4,8),
(2,4,6))
for row in WAYS_TO_WIN:
if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY:
winner = board[row[0]]
return winner
if EMPTY not in board:
return TIE
return None
Выдаёт на выходе при такой же проверке None.
>>> 
None
Вопрос вот в чём:
1)При вызове return код,находящийся после него исполняется или нет?Или функция отдает значение и всё после уже не исполняется?
2)Прерывается ли цикл после вызова return?
3)И самый интересный: почему во втором случае выдает значение None на проверку?Если по идее после проверки первого условия она должна была вадать winner и всё.Как такое выходит?А None должна выдать только если нет победителя и нет ничьи.Как влияет этот Tab?


Cпасибо всем за помощь. :)
sp3
1. нет, не исполнится
2. прервется
3. натыкай везде принтов, что бы понять как твой код работает
Soteric
При вызове return дальнейший код не выполняется (исключение блоки try-finally, но здесь их нет), цикл прерывается.

В вашем случае выигрышная комбинация (2, 4, 6), т.е. самая последняя в списке. Проверяем первую комбинацию (0, 1, 2) мы не видим победителя, поэтому условие не выполняется и winner не возвращается. Переходим к следующему условию: “if EMPTY not in board:”. Не знаю, что это такое, по всей видимости это условие тоже не выполняется. Идем дальше. Находим “return None”, возвращаем его, выполнение функции остановлено.

Табами в питоне определяются блоки, к которым относится код. В первом случае “return None” стоит за пределами цикла, во втором входит в тело цикла.
m1cky
Soteric
При вызове return дальнейший код не выполняется (исключение блоки try-finally, но здесь их нет), цикл прерывается.

В вашем случае выигрышная комбинация (2, 4, 6), т.е. самая последняя в списке. Проверяем первую комбинацию (0, 1, 2) мы не видим победителя, поэтому условие не выполняется и winner не возвращается. Переходим к следующему условию: “if EMPTY not in board:”. Не знаю, что это такое, по всей видимости это условие тоже не выполняется. Идем дальше. Находим “return None”, возвращаем его, выполнение функции остановлено.

Табами в питоне определяются блоки, к которым относится код. В первом случае “return None” стоит за пределами цикла, во втором входит в тело цикла.
Спасибо!
Я как раз когда свой коммент писал,то въехал где ошибка,начал писать итерации слово и понял что при первой итерации моя комбинация никуда не попадает вот None и выдаёт. :)

Всем спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB