在Python中使用什么来记住循环之间的变量

在Python中使用什么来记住循环之间的变量,python,Python,首先,我刚刚开始我的Python之旅(所以你也可以忽略所有可怕的分号)。这是一个简单的程序,作为本章末尾的一项任务,检查您所学的内容。基本上,这是一个“猜数字”,但程序必须猜你的数字(这是一个从书本上颠倒过来的程序)。 也许这不是这本书的意图,我还没有学会,但我的好奇心占据了我的全部,我不得不问。如何记住循环之间的变量?我想我必须使用table,以这种方式在循环之间保存和检查变量,但在Python中可能有一种更简单的方法 在代码中,程序会记住它生成的最后一个数字,但另一个数字“被遗忘”——显然在

首先,我刚刚开始我的Python之旅(所以你也可以忽略所有可怕的分号)。这是一个简单的程序,作为本章末尾的一项任务,检查您所学的内容。基本上,这是一个“猜数字”,但程序必须猜你的数字(这是一个从书本上颠倒过来的程序)。 也许这不是这本书的意图,我还没有学会,但我的好奇心占据了我的全部,我不得不问。如何记住循环之间的变量?我想我必须使用table,以这种方式在循环之间保存和检查变量,但在Python中可能有一种更简单的方法

在代码中,程序会记住它生成的最后一个数字,但另一个数字“被遗忘”——显然在代码中是可见的。这样做的目的是最大限度地减少程序猜测数字的尝试(猜测的狭窄数字)。 获取程序概念的代码:

#Program Switcheroo, what is the number?

import random;

print("\t Welcome to game 'What is the number?' where you are picking number!");
print("\nRules are simple and based on your honesty ;)");
print("Think of number between 1 and 100, computer will try to guess it.");
print("If the number is too big you type 'too big', too small 'too small'");
print(", and if computer guessed it right 'right'");
print("\nEverything clear? Let's start!");

guess = random.randint(1, 100);
tries = 1;

print("Your number is...",guess,"?");
print("Answer 'too big', 'too small', 'right'"); 
number = input();
while number != "right":
    if number == "too big":
        tries += 1;
        guess = random.randint(1, guess);
        print ("Your number is...",guess,"?");
        print("Answer 'too big', 'too small', 'right'");
        number = input();
    elif number == "too small":
        tries += 1;
        guess = random.randint(guess, 100);
        print ("Your number is...",guess,"?");
        print("Answer 'too big', 'too small', 'right'");
        number = input();
    else:
        print("Ups!");
        break;
print("I won in", tries, "tries!");

input("\n\nTo end app, press Enter.");

您可以使用列表。在循环之前,声明一个空列表

attempted_values = set()
当您选择要猜测的数字时,请将其附加到该列表中

attempted_values.add(number)
选择要猜测的数字时,还应检查该数字是否在列表中,如果在列表中,请查找其他数字

if (number in attempted_values):
    number is in the list

我建议您进行以下优化(为了提高代码质量,可以做的事情很少,例如删除重复代码并使用函数,但我将留给您):

您可以管理猜测的下限和上限,并为每次猜测更新它-如果您的猜测是X,并且它太大,那么所有未来的猜测都必须小于X,因此您的上限将是X-1(下限也是如此)

以下是一个基本实现:

guess = random.randint(1, 100)
tries = 1
print("Your number is...", guess, "?")
print("Answer 'too big', 'too small', 'right'")
number = input()
upper_bound = 100
lower_bound = 1
while number != "right":
    if number == "too big":
        upper_bound = guess-1 if guess < upper_bound else upper_bound
        tries += 1
        guess = random.randint(lower_bound, upper_bound)
        print(f"lower bound: {lower_bound}, upper bound: {upper_bound}")
        print("Your number is...", guess, "?")
        print("Answer 'too big', 'too small', 'right'")
        number = input()
    elif number == "too small":
        lower_bound = guess+1 if guess > lower_bound else lower_bound
        print(f"lower bound: {lower_bound}, upper bound: {upper_bound}")
        tries += 1
        guess = random.randint(lower_bound, upper_bound)
        print("Your number is...", guess, "?")
        print("Answer 'too big', 'too small', 'right'")
        number = input()
    else:
        print("Ups!")
        break
print("I won in", tries, "tries!")

input("\n\nTo end app, press Enter.")
guess=random.randint(1100)
尝试=1
打印(“您的号码是…”,猜测“?”)
打印(“回答‘太大’、‘太小’、‘右’”)
数字=输入()
上界=100
下界=1
而数字!=“对”:
如果数字==“太大”:
上界=如果guess<上界否则上界,则guess-1
尝试次数+=1
guess=random.randint(下界、上界)
打印(f“下限:{下限},上限:{上限}”)
打印(“您的号码是…”,猜测“?”)
打印(“回答‘太大’、‘太小’、‘右’”)
数字=输入()
elif编号==“太小”:
下限=猜测+1如果猜测>下限否则下限
打印(f“下限:{下限},上限:{上限}”)
尝试次数+=1
guess=random.randint(下界、上界)
打印(“您的号码是…”,猜测“?”)
打印(“回答‘太大’、‘太小’、‘右’”)
数字=输入()
其他:
打印(“Ups!”)
打破
打印(“我赢了”,尝试,“尝试!”)
输入(“\n\n要结束应用程序,请按Enter。”)
在这个实现中,您不必“记住”所有猜测,因此您的内存占用会更小,尝试次数也会最少


为了调试的目的,我在每次迭代的上下限中都添加了一个打印,以向您展示边界是如何变化的。

要在变量中存储多个值,请使用一个复合数据结构,如列表、集合或dict……这是一种解决这种“疯狂”的方法,它可以工作,但我的想法是。如果它滚到70,你说太大的程序会扔掉大于等于70的数字,并且不会从这个范围滚任何东西。“如果它滚到70,你说太大的程序会扔掉大于等于70的数字”,这不是你想要的吗?让它更有效?这正是我想要的,但也许我理解上面提出的方法是错误的。我知道如果它得到上界-1,它会从100变为99,不是吗?但是我想一次性把它改成69,它会把它改成69。试着运行它,看看边界是如何变化的,让我知道它没有像你期望的那样工作……好的,测试它,就像一个符咒。但当玩家说谎时,它需要解释:P,但这是我头脑中的优化。谢谢你的回答。(ValueError:randrange()的范围为空(61,61,0))