我将如何定义一个其中有一个while循环和一个try-except循环的函数?

Posted

技术标签:

【中文标题】我将如何定义一个其中有一个while循环和一个try-except循环的函数?【英文标题】:How would I go about defining a function which has a while loop within it and a try-except loop within that? 【发布时间】:2022-01-06 12:53:40 【问题描述】:

我正在尝试创建一个可重复的函数,该函数使用 while 循环重复尝试 try-except 循环,但我在某些部分遇到了问题。 这是我当前的功能:

def trytrytryagain(input):  
  ValueError 
  while ValueError:  
    try:  
      input() = int(input())  
    except ValueError:  
      print("You must enter a number")  
      input = int(input())  

当我运行代码并输入“a”(以测试它是否反复要求用户输入数字)时,它总是在第一次迭代后显示此错误消息。

Traceback (most recent call last):
  File "main.py", line 7, in trytrytryagain
    int(input())
ValueError: invalid literal for int() with base 10: 'a'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 16, in <module>
    trytrytryagain (times_table)
  File "main.py", line 10, in trytrytryagain
    int(input())
ValueError: invalid literal for int() with base 10: 'a'

因此,我发现创建此功能非常困难。它意味着一直运行直到用户输入一个数字,并在每次迭代后显示消息“您必须输入一个数字”。我完全糊涂了,所以这是上下文的完整代码(它是一个时间表生成器)。

from time import sleep

def trytrytryagain(input):
  ValueError
  while ValueError:
    try:
      int(input())
    except ValueError:
      print("You must enter a number")
      int(input())



print("Please input the times table you wish to complete (1, 2, 3, etc.).")
times_table = input
trytrytryagain (times_table)
print("Would you like to go up to another times table (do the 1 to 12 times tables)? yes/no")
try:
    othertables = str(input()).lower()
except ValueError:
    print("You must enter either yes or no")
    othertables = str(input()).lower()

if othertables == "yes":
  print("Enter which time table you want to go up to.")
  try:
    other_times_table = int(input())
  except ValueError:
    print("You must enter a number")
    other_times_table = int(input())
  print("Enter the maximum table you would like to go up to. (if you do the 3 to 5 times tables, what times table would you like to finish on - type 12 for 5 x 12, 13 for 5 x 13, etc.)")
  try:
    max_value = int(input())
  except ValueError:
    print("You must enter a number")
    max_value = int(input())
  for x2 in range(times_table, other_times_table + 1):
    for x in range(max_value + 1):
      
      print(f"x x x2 =")
      input()
      sleep(0.1)
  
else:
  print("Okay.")
  print("Enter the maximum table you would like to go up to. (if you do the 3 to 5 times tables, what times table would you like to finish on (type 12 for 5 x 12, etc.))")
  try:
    max_value = int(input())
  except ValueError:
    print("You must enter a number")
    max_value = int(input())
  for x in range(times_table, max_value + 1):
    answer = x * times_table
    print(f"x times times_table is answer")
    sleep(0.1)

【问题讨论】:

在您的第一个示例中,错误位于 `int(input())` 行...但该行不在示例中。最好发布一个完全运行的测试脚本(包括对 trytrytryagain 的调用),以便我们可以运行它并看到相同的错误。就像你在第二个例子中所做的那样。 【参考方案1】:

您可以使这变得更简单,只需捕获和忽略错误并循环直到没有异常:

def trytrytryagain():  
    while True:
        try:
            print("You must enter a number")
            return int(input())
        except ValueError:
           pass

print("You entered:", trytrytryagain())

【讨论】:

已记录并更新。【参考方案2】:

这是因为您在异常处理中调用了input 函数。

在第一个输入上捕获到异常,但在第二个输入上,我们在处理程序内部,没有任何东西捕获它。

如果你必须使用异常,试试这个:

while True:  
    try:
        print("Please enter a number") 
        var = int(input())
        break      
    except ValueError:  
        pass 

【讨论】:

【参考方案3】:

你可以这样使用:

def function():
    while True:
        try:
            return int(input())
        except ValueError:
            print("You must enter a number")

input_value = function()
print(input_value)

【讨论】:

【参考方案4】:

这里有一个小功能可以帮到你:

def getInput(prompt, t=str):
    while True:
        v = input(f'prompt: ')
        try:
            return t(v)
        except ValueError:
            print('Invalid input', file=sys.stderr)

用法示例:

S = getInput('输入任意字符串') # 这将返回一个字符串 I = getInput('Enter an integer', int) # 这将返回一个 int F = getInput('Enter a float', float) # 这将返回一个浮点数

当然,第二个参数可以是任何以字符串为输入并进行某种处理的函数

【讨论】:

以上是关于我将如何定义一个其中有一个while循环和一个try-except循环的函数?的主要内容,如果未能解决你的问题,请参考以下文章

在php中的多个while循环中列重复(ID总数)时间

循环阻止异步请求被发送。为什么以及如何解决?

PHP / MYSQL:如何在while循环中循环来自查询的匹配结果

sql while循环语句问题

如何根据 C 函数中函数的输入退出 while 循环?

while循环