【问题标题】:How to use a return value from a function in a completely different function如何在完全不同的函数中使用函数的返回值
【发布时间】:2019-08-27 21:10:06
【问题描述】:

我正在写一个井字游戏,目前有以下功能:

 # Need: Board, Display Board, Play Game, Alternating Terms, Os, Xs, Wins, Losses

board = ["-", "-", "-",
         "-", "-", "-",
         "-", "-", "-", ]


def display_board():
    print(board[0] + " | " + board[1] + " | " + board[2])
    print(board[3] + " | " + board[4] + " | " + board[5])
    print(board[6] + " | " + board[7] + " | " + board[8])


def handle_turn():
    position = input("\nChoose a position from 1 to 9: ")
    position = int(position) - 1
    return position


def choose_player_marker(marker):
    player_marker = ''
    if marker == 'X' or marker == 'x':
        player_marker = 'X'
        return player_marker
    elif marker == 'O' or marker == 'o':
        player_marker = 'O'
        return player_marker


def opp_move():
    opp_marker = ''
    if choose_player_marker() == 'X':
        opp_marker = 'O'
    else:
        opp_marker = 'X'


def play_game():
    game_current = True
    display_board()
    marker = input("\nPlease choose a marker: 'X' or 'x' OR 'O' or 'o' : ")
    choose_player_marker(marker)
    opp_move()
    handle_turn()


play_game()

在函数def choose_player_marker(marker): 中,我根据条件返回player_marker = 'X'player_marker = 'O'

我想在函数def opp_move(): 中使用生成的'X''O' 来确定对手将选择哪个标记。但是,我很难正确委派 return 声明。我尝试使用marker 作为def opp_move(): 函数中的参数,也尝试过if choose_player_marker(marker) == 'X' 无济于事。

如何正确处理来自def choose_player_marker(marker): 的return 语句,以便我的def opp_move(): 函数能够确定对手会选择什么标记?

【问题讨论】:

  • 但是marker 应该来自哪里?
  • 你应该将marker 参数传递给函数,然后你会得到某种的返回值。现在你只是得到一个错误
  • @DanielRoseman marker 来自主函数,它存储用户的输入,如果他们想作为 X 或 O @ForceBru 我已经尝试将 marker 传递给 opp_move() 但是只是不断遇到错误 - 无论出于何种原因,choose_player_marker 似乎并没有真正返回我希望它返回的内容:(
  • 什么错误?显示您正在使用的值、完整的上下文,包括marker 的来源,以及您得到的实际错误。现在我们只能猜测发生了什么。
  • 编辑问题以显示您的完整代码

标签: python function return


【解决方案1】:

现在我们可以看到你的完整代码了,解决方法很简单。

您已经在main 中致电choose_player_marker()。您也不需要在opp_move 中调用它。你需要做的是在main中调用它时捕获结果,然后将值传递给opp_move:

def opp_move(marker):
    if marker == 'X':
        opp_marker = 'O'
    else:
        opp_marker = 'X'
    return opp_marker


def play_game():
    game_current = True
    display_board()
    marker = input("\nPlease choose a marker: 'X' or 'x' OR 'O' or 'o' : ")
    marker = choose_player_marker(marker)
    opp_move(marker)
    handle_turn()

现在这段代码还有很多其他问题,比如 handle_turn 没有做任何有用的事情,正如其他人指出的那样,choose_player_marker 可以简单地替换为对marker.upper() 的调用,但至少这个应该让你去。

【讨论】:

  • 啊,好吧,现在我明白了——因为marker 是在play_game() 中定义的,所以我可以在该函数中使用marker 参数调用它。谢谢!
【解决方案2】:

函数choose_player_marker 目前没有任何有用的事情。如果你给它一个X,它会给你一个X,如果你给它一个O,它会给你一个O。它现在唯一的用途是将小写的 x 和 o 转换为大写的 X 和 O。

因此没有必要调用它,因为如果我们知道输入 (X),那么我们就知道输出 (X)。

给定名称:choose_player_marker 我怀疑您想要一个不同的名称(例如 normalise_player_marker() 或不同的实现,即提示用户输入询问该人是 X 还是 O?)

至于 opp_move :无需致电choose_player_marker。如果你知道玩家是X,那么你就知道对手是O,反之亦然。因此我怀疑你想要这样的东西:

def normalise_marker(marker):
    if marker == 'X' or marker == 'x':
        return 'X'
    elif marker == 'O' or marker == 'o':
        return 'O'

def opp_move(player_marker):
    opp_marker = ''
    normed_marker = normalise_marker(player_marker)
    if normed_marker == 'X':
        opp_marker = 'O'
    else:
        opp_marker = 'X'
    # use opp_marker here

请注意,在其当前状态下 normalise_marker 不处理标记不是 X 或 O 的情况,并且可以简化为更简单的实现,但这留给你作为练习:)

【讨论】:

  • 是的,我在主函数中提示用户输入。 choose_player_marker 这样无论用户是否输入小写字符,我都希望它是大写的,因为 X 或 O 是我将在显示的井字棋板上使用的实际标记。
  • 我已经尝试了你的建议,但我遇到了一个 TypeError,告诉我我缺少 1 个必需的位置参数:player_maker。据我了解,player_marker 参数来自我在函数 choose_player_marker() 中的原始代码,但它似乎并没有真正返回 X 或 O 或 opp_move() 似乎不喜欢参数 player_marker
【解决方案3】:

我不熟悉 Python,但我想如果将提供的参数设置为小写,它会更简单,不需要对大写大小写的额外检查。仍然可以通过这种方式缩短代码。

def choose_player_marker(marker):
    return marker.lower()

def opp_move(result):
if result == 'x':
    return 'o'
else:
    return 'x'

playerMarker = 'X'
res = choose_player_marker(playerMarker)
opp = opp_move(res)
print(result, opp)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    相关资源
    最近更新 更多