我做过很多项目(学校项目,我不是太高级(,发现在许多程序中,我要求用户输入一个整数或十进制(float(的值,我需要在while循环中使用"try-except"语句,以确保用户输入所需的值类型。
例如:
def main():
userValue = input("Please enter an integer: ")
while(True):
try:
userValue = int(userValue)
break
except:
userValue = input("That is not an integer, try again: ")
print("The integer you entered is: " + str(userValue))
main()
# Input: SADASD (A non-integer value)
# Output: "That is not an integer, try again: "
# Second-Input: 3
# Second-Output: "The integer you entered is: 3"
可以理解的是,在一个需要用户多次输入的程序中,重复键入整个代码部分并不是真正有效的。因此,理解,当我需要多次执行一个操作时,用户定义的函数会有所帮助。考虑到这一点,我在 while 循环中使用相同的 try-except 语句定义了我自己的函数。但是,现在,当我使用该函数时,它不是打印以前的相同输出,而是打印出用户输入的第一个值。
例如:
def valueCheck_Integer(userInput):
while(True):
try:
userInput= int(userInput)
break
except:
userInput = input("That is not an integer, try again: ")
def main():
userValue = input("Please enter an integer: ")
valueCheck_Integer(userValue)
print("The integer you entered is: " + str(userValue))
main()
# Input: SADASD (A non-integer value)
# Output: "That is not an integer, try again: "
# Second-Input: SASASD
# Second-Output: "That is not an integer, try again: "
# Third-Input: 3
# Third-Output: SADASD (The first value that the user Input, instead of 3)
有人可以向我解释为什么会发生这种情况,以及如何解决它的一些建议吗? 谢谢!
期望函数获取/检查/返回整数而不是检查您已经拥有的输入可能会更容易。您可以向其传递用于请求值的字符串(也可以传递错误字符串(。它会一直询问,直到成功,然后返回你想要的数字:
def get_integer(question):
while(True):
try:
return int(input(question))
except ValueError:
question = "That is not an integer, try again:"
def main():
userValue = get_integer("Please enter an integer: ")
print("The integer you entered is: " + str(userValue))
main()
这是因为您正在打印userValue
而不是userInput
。
我用return
让它更容易。所以代码将是这样的
def valueCheck_Integer(userInput):
while(True):
try:
userInput= int(userInput)
break
except:
userInput = input("That is not an integer, try again: ")
return userInput
def main():
userValue = input("Please enter an integer: ")
print("The integer you entered is: " + str(valueCheck_Integer(userValue)))
main()
您可以像这样缩小代码:
def valueCheck_Integer(userInput):
while not(userInput.isdigit()):
userInput = input("That is not an integer, try again: ")
return userInput
def main():
userValue = input("Please enter an integer: ")
print("The integer you entered is: " + str(valueCheck_Integer(userValue)))
main()
首先,好问题。 要了解发生了什么,我们首先必须讨论变量的作用域。
当您在函数外部定义变量时,它将成为称为全局变量的东西。这基本上意味着您可以从代码中的任何位置访问它。在函数中定义变量时,它将成为局部变量。这意味着它只能从函数内部访问。最后,当函数传入变量时,它会获得自己的变量本地副本来使用。
现在让我们看一下您的代码。 调用valueCheck_Integer(userInput):
时,函数会获取自己的userInput
副本以供使用。因此,函数所做的所有更改都会修改本地userInput
,而全局userInput
保持不变。因此,当用户输入正确答案时,全局userInput
是打印的,函数对本地userInput
所做的更改将丢失。
那么,我们如何解决这个问题呢?
主要有两种方法:
1(使用global
关键字
def valueCheck_Integer(userInput):
global userInput
while(True):
try:
userInput= int(userInput)
break
except:
userInput = input("That is not an integer, try again: ")
此关键字要求函数修改全局userInput
2(返回值
def valueCheck_Integer(userInput):
while(True):
try:
userInput= int(userInput)
break
except:
userInput = input("That is not an integer, try again: ")
return userInput
def main():
userValue = input("Please enter an integer: ")
print("The integer you entered is: " + str(valueCheck_Integer(userValue)))
main()
这通过返回userInput
的本地副本并将全局userInput
修改为相等的本地userInput
我使用的第二个代码来自 Osadhi Virochana Jayasinghe Si的回答。
这是因为,如果你看到打印最终输出的代码行 - :
print("The integer you entered is: " + str(userValue))
您将意识到您正在打印的值是您第一次从输入函数中获取的值。但这不是你一直在努力在你的其他职能中实现的价值。
因此,为了让您获得该值,该函数必须以某种方式将其返回给您。
为此,您应该允许函数返回最后一行中的值。 这样-:
return userInput
然后更改调用函数的行,以便保存返回的值。
这样-:
userValue = valueCheck_Integer(userValue)
正如其他人使用 global 关键字所提到的,您可以在全局范围内定义变量。 但这真的不是一个好的做法,直到真正需要,因为它可以增加 var 占用的空间量,以前变量只在调用函数时占用有限的空间,但现在变量在整个程序运行期间占用空间。 虽然返回不会这样做,因为它只会返回值,一旦分配给已经定义的变量,它将从空间中删除返回的值。
这应该有望解决您的问题。 我希望这有所帮助。 也希望您在这场持续的大流行期间是安全的。