(python)尝试在用户定义的函数中除外



我做过很多项目(学校项目,我不是太高级(,发现在许多程序中,我要求用户输入一个整数或十进制(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 占用的空间量,以前变量只在调用函数时占用有限的空间,但现在变量在整个程序运行期间占用空间。 虽然返回不会这样做,因为它只会返回值,一旦分配给已经定义的变量,它将从空间中删除返回的值。

这应该有望解决您的问题。 我希望这有所帮助。 也希望您在这场持续的大流行期间是安全的。

相关内容

  • 没有找到相关文章

最新更新