在Python中访问函数外部的变量

时间:2015-01-04 10:52:31

标签: python function variables

我正在尝试制作一个非常简单和有点古老的Rock-paper-scissors游戏,只有玩家才能通过控制台运行。

我有这样的事情:

def rps():
    player_hand = input('>_')

    machine_hand_opt = ['rock', 'paper', 'scissors']
    machine_hand = random.choice(machine_hand_opt)

    who_win = machine
    if machine_hand == 'rock' and player_hand == 'scissors':
        who_win
        return who_win
    elif clown_hand == 'rock' and player_hand == 'paper':
        who_win = 'user'
        return who_win

这只是代码的一部分,你可以想象剩下的代码。正如你所看到的,机器手是从列表中随机选择的,我使用变量'who_win'来获取谁赢得然后打印的东西,但是当打印结果时,用户只知道它自己的手,而不是机器的手,因为函数只返回谁获胜,如果玩家获胜或松散,显然很容易弄清楚机器的手,但我认为这是一个很好的机会知道如何在函数外打印变量。它会是这样的:

print("Player's hand:", player_hand)
print("Machine's hand:", machine_hand)

有什么想法吗?

4 个答案:

答案 0 :(得分:4)

您可以从函数返回多个值;只需使用元组:

return machine_hand, player_hand, who_win

然后函数的调用者可以将元组解包再次变为三个变量:

machine_hand, player_hand, who_won = rps()

这三个变量的名称是调用者的本地名称,名称不必匹配;例如,我在解包时使用了who_won

您可能想要考虑rps()在这里做了多少工作;就个人而言,我将功能限制在确定谁独自赢得胜利。要求用户在单独的功能中输入(您也可以在那里进行验证),在另一个功能中确定计算机选择,并让此功能仅返回获胜者:

def game():
    while True:
        player_hand = ask_player_for_choice()
        machine_hand = determine_machine_choice()
        who_won = determine_winner(player_hand, machine_hand)
        display_winner(player_hand, machine_hand, who_won)
        if not ask_to_play_again():
            return

请注意,现在您需要返回的只是determine_winner()函数的赢家。整个游戏都处于无限循环中,当玩家不想再玩时(ask_to_play_again()返回False)结束游戏。

最后但并非最不重要的是,提示:确定获胜者可以像字典查找一样简单。在字典中映射出什么样的手。如果双手不平等,两者都会失败,但如果beats_map[machine_hand] == player_hand你确切地知道谁赢了,

答案 1 :(得分:2)

你可以双手回头:
(内部功能)

return who_won, machine_hand

(外部功能)

print(*rps())

或使用全局变量(关键字是“全局” - 但要注意,全局非常强大!)

答案 2 :(得分:1)

您有几种选择:

  1. 同样地返回machine_hand:
  2. return who_win, machine_hand

    在yoir方法之外,你可以用这种方式得到结果:

    who_win, machine_hand = rps()

    1. 在您的方法之外定义machine_hand并将其用作全局(这可能是一个“更简单”的选项,但一般来说,如果可能的话,最好避免使用全局变量,因为它们的存在会鼓励代码混乱):
    2. `

      machine_hand = None
      
      def rps():
          global machine_hand
         # your code.. 
      

      `

      另外一句话:通常最好保留单独的日期输入和数据处理,因此您可以考虑在外部循环中读取human_hand并将其作为参数提供给rps()方法。

答案 3 :(得分:0)

为了简化:为什么不在结果中打印结果?因为它听起来像是属于 rps 的作业。

如果您坚持或将来使用 machine_hand ,只需返回多个值,如提到的@Martijin。