2015-01-04 132 views
1

我正在尝试做一个非常简单和有点古老的岩石剪刀剪刀游戏,只对玩家和通过控制台运行。在Python中访问函数外部的变量

我有这样的事情:

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

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

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)。

最后但并非最不重要的一点是:确定赢家可以像查字典一样简单。在字典中绘制出什么手击败了什么。如果双手不相等,双方都会输,但如果你知道谁赢的话。

+0

非常感谢您的提示,我会牢记它,但这里的想法是保持简单。但现在我有更多的知识,当我需要它。我使用了一个名为result = rps()的变量来使用rps的结果,这就是我如何确定谁赢了,但我不知道如果我返回这三个函数怎么可能。那我怎么能得到结果呢? – 2015-01-04 11:21:04

+0

@AndresOrozco:你的意思是3 *值*?你可以使用'machine_hand,player_hand,result = rps()',其中'result'仍然是相同的值。或者你可以使用'result = rps()',其中'result'现在是一个元组,'result [0]'是机器手,'result [1]'玩家手,'result [2]'谁赢得了比赛。 – 2015-01-04 11:25:38

+0

谢谢。这对我帮助很大。 – 2015-01-05 02:39:23

0

简单起见:为什么不打算在函数内部打印结果?因为听起来像一份工作属于rps

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

2

您可以返回双手:
(内部功能)

return who_won, machine_hand 

(外功能)

print(*rps()) 

或使用全局变量(关键字是 “全球性” - 但被警告,全球非常强大!)

1

您有几个选择:

  1. 返回machine_hand为好,这样的:
yoir方法

return who_win, machine_hand

之外,你可以得到这样的结果:

who_win, machine_hand = rps()

  • 在您的方法外定义machine_hand并将其用作全局(这可能是一个”更容易“的选项,但通常最好避免全局变量,如果poss IBLE,因为它们的存在鼓励乱码):
  • `

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

    `

    另外一个备注:它往往是最好保持独立日的输入和数据处理,所以你可能会考虑读在您的外部循环中使用human_hand并将其作为参数提供给您的rps()方法。

    相关问题