Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python While循环计数器_Python_Loops_While Loop_Counter - Fatal编程技术网

Python While循环计数器

Python While循环计数器,python,loops,while-loop,counter,Python,Loops,While Loop,Counter,使用VS2015python3.4 此计数器有一些问题。它正在慢慢地让我发疯,因为我确信它“应该”工作,但没有更新计数器。我已经运行了单步调试,可以看到计数器在while条件行之前重置为3。至少说一句,我很恼火 import random import getpass print ('Welcome to Rock, Paper or Sissors\nEnter an option.') user_obj = getpass.getpass('Rock, Paper or Sissors: '

使用
VS2015
python3.4

计数器有一些问题。它正在慢慢地让我发疯,因为我确信它“应该”工作,但没有更新计数器。我已经运行了单步调试,可以看到计数器在while条件行之前重置为3。至少说一句,我很恼火

import random
import getpass
print ('Welcome to Rock, Paper or Sissors\nEnter an option.')
user_obj = getpass.getpass('Rock, Paper or Sissors: ').lower()
ai_obj = input('Rock, Paper or Sissors: ').lower()
rps = ('rock', 'paper', 'sissors')
#ai_rps = ['rock', 'paper', 'sissors']
#ai_obj = random.choice(ai_rps)
counter = 3
def rps_game(user_obj, ai_obj):
    print('Player selected %s ' % user_obj)
    print('Computer selected %s ' % ai_obj)
    condition = user_obj in rps and ai_obj in rps
    while condition == True and counter >= 0:     
        if user_obj == ai_obj:
            print('Its a draw!')
        elif user_obj == 'rock':
            if ai_obj == 'paper':
                print('You lose!')
                break
            else:
                print('You win!')
        elif user_obj == 'paper':
            if ai_obj == 'sissors':
                print('You lose!')
                break
            else:
                print('You win!')
        elif user_obj == 'sissors':
            if ai_obj == 'rock':
                print('You lose!')
            else:
                print('You win!')
                break    
    else:
        counter += 1 
        print('Invalid input, please select Rock, Paper or Sissors')
        rps_game(user_obj, ai_obj)

rps_game(user_obj, ai_obj)

计数器
重置为其原始值,因为它是一个全局变量。Python中的全局变量的行为与其他语言中的不同。请尝试以下代码段:

counter = 3
def f():
    counter = 2 # Shadows global 'counter' by a newly defined one
f()
print (counter) # Prints 3 !
您可以预期打印值为2,但实际值为3。默认情况下,全局变量是不可变的,如果尝试在不使用
Global
关键字的局部范围内对其进行修改,则会改为使用局部定义进行隐藏。请参阅使用全局变量,尽管最好重新编写程序以使用局部变量

编辑: 还有一个错误,计数器初始化为3,并且只递增,因此条件>=0将始终得到满足(从而创建一个无限循环)。 您可以尝试:

[...]
def rps_game(user_obj, ai_obj, counter):
    if counter <= 0:
         return
    print('Player selected %s ' % user_obj)
    print('Computer selected %s ' % ai_obj)
    while user_obj in rps and ai_obj in rps :
    [...]
    else:
        print('Invalid input, please select Rock, Paper or Sissors')
        rps_game(user_obj, ai_obj, counter-1)

rps_game(user_obj, ai_obj, 3)
[…]
def rps_游戏(用户_对象、ai_对象、计数器):

如果计数器,则包含计数器更新的
else
将缩进,以便挂起while。这意味着它只在while循环由于条件为false而终止时执行(而不是在中断时)。在这种情况下,当用户或ai输入不在有效输入列表中或计数器为负值时,条件为false。计数器永远不能为负,因为它从3开始,并且只递增。如果用户输入无效,则打印错误消息,计数器递增,然后使用递归调用具有相同参数的函数。由于参数没有改变,函数应该执行与刚才相同的操作,除非它依赖于全局数据(计数器)。但是,如果计数器是本地的(在函数内部初始化),则函数的每次调用都会获得一个新副本。如果计数器是全局的(在函数外部初始化,但在函数内部声明为全局的),它仍然不能工作,因为您需要减小它。即使这样,由于其他输入都没有改变,它也会反复打印错误消息

循环边界似乎期望计数器从3开始倒计时,因为只要
计数器
为正,它就会继续运行。顺便说一句,使用
=
作为条件将使循环执行4次(3、2、1和0)。您可能希望将条件更改为严格大于,并将计数器增量更改为计数器减量

接下来,您将使用递归(函数本身调用),但这应该是不必要的,因为循环会让您回到需要的位置

接下来,输的案例打破了循环,但赢的案例没有。如果您赢了,代码将循环,不会修改计数器或任何其他输入,因此不会终止


最后,用户输入是从函数外部读取的,因此它在循环内部不会改变。如果用户输入非法值,循环将继续测试相同的值。您可能想读取循环中的用户输入。

是否有错误?我有个错误。我得到
UnboundLocalError:赋值前引用的局部变量“counter”
。这就是您得到的错误吗?这是真的,但是如果我将变量移动到定义的函数中,它会使while循环无限大。请原谅我的无知,我对编码还是相当陌生的。你并没有始终如一地打破你的循环。在某些情况下,你赢后会突破,而在其他情况下,你会继续比赛。检查所有的循环中断场景。请注意,在while循环中,您检查的是condition==True,但在您的循环中没有任何地方修改condition的值,因此这是毫无意义的。计数器也是如此(如果您从未点击最后一个else语句),我不知道为什么这个答案会被否决,这是完全正确的+1我不是向下投票人,但全局变量不是不变的(至少不是元组和字符串不变的意义上)。创建一个全局列表变量,并从函数中向其追加一个项,而不将其声明为全局。您给出的第一个示例对我来说非常有意义,我理解(至少我认为我理解:P)函数之外的后续值声明将如何表现出不同的行为。我发现,在def()中移动计数器会导致无限循环(这是因为使用原始用户输入导致条件调用不满意),但也因为计数器变量在执行counter-=时未被“更新”*(我不太明白计数器+=1是如何被复制的,因为我在今天上午10点左右将计数器从加法改为减法。对此我很抱歉)。虽然我不知道可以在func调用的参数中添加这些更改。谢谢你的小宝石:)仍然是一个小姐为什么,即使这样的变量被更改为本地。哦,等等。我敢打赌,和statment对事情没有帮助*掌纹