我正在尝试编写一个Python函数,要求输入大于1的整数并返回或打印输入值。
例如,在运行代码时:
错误情况1:
输入大于1:1的整数
输出:请输入一个大于1的数字:
错误情况2:
输入大于1的整数:abc345
输出:请仅输入整数值:
如果只是为了处理错误情况1,这很容易,我们可以使用while循环。但是为了包括非整数输入,我的代码总是崩溃。
这是我的功能:
def mult_digits():
x = input("Enter an integer greater than 1: ")
while type(x) is not int:
try:
while int(x) <= 1:
x = input("Please enter a number greater than 1: ")
x = int(x)
except ValueError:
x = input("Please enter integer values only: ")
x = int(x)
print(f"Yes, you have entered {x}.")
我的代码存在的问题是int(“ a”)会导致int()的常量文字以10为底的错误。由于input()函数总是返回一个字符串,并且我们需要检查字符串是否可以转换为整数,因此我们需要int()函数,但这正是问题所在。
我已经尝试了许多不同的代码变体,包括使用for循环扫描输入值中的任何非整数字符,但是效率不高并且仍然崩溃。我还尝试了一个while循环,最终创建了一个无限循环。
有人可以帮忙吗?有没有更好的方法来编写此函数?非常感谢,谢谢!
答案 0 :(得分:1)
我认为您使事情变得太复杂了。基本上,如果有人输入了一个值,则首先通过int(..)
函数将其传递,如果没有错误,则检查该值是否大于1,因此我们可以编写一个while
循环,该循环一直迭代直到该值是有效的,例如:
def mult_digits():
msg = "Enter an integer greater than 1: "
valid = False
while not valid:
x = input(msg)
try:
x = int(x)
except ValueError:
msg = "Please enter integer values only: "
else:
valid = x > 1
if not valid:
msg = "Enter an integer greater than 1: "
print(f"Yes, you have entered {x}.")
因此,我们只需在while
循环中执行 检查(理想情况下,也将其封装在方法中),并且在int(..)
引发{{1 }}错误,内容仍然无效,我们甚至可以更改Value
。如果转换本身没有引发任何错误,我们可以检查约束,然后再次给出有用的消息。
我们一直这样做,直到将msg
设置为valid
,然后打印该值。
答案 1 :(得分:1)
def mult_digits():
x = input("Enter an integer greater than 1: ")
while True:
try:
while int(x) <= 1:
x = input("Please enter a number greater than 1: ")
x = int(x)
if x > 1:
break
except ValueError:
x = input("Please enter integer values only: ")
print(f"Yes, you have entered {x}.")
尝试一下
答案 2 :(得分:1)
因此,在将其发布到代码审查时,我在工作时看到了这一点。我想回答我,但必须等到回家。我将您的代码块分为两个块,一个块获取输入(我讨厌冗余代码),另一个块执行检查并要求输入。我还为数字和非数字添加了明确的错误消息。我将在此处发布完整的代码:
# -*-coding: utf-8-*-
# !/usr/bin/python3.6
import sys
def multi_digits():
digit = get_input()
x = True
while x:
if digit in '23456789':
print(f'Yes,you have entered {digit}.')
x = False
# In elif it looks like int(digit) may throw an error if it isn't a digit but
# because of the way if statements work this wont happen. The if statement excutes
# digit.isdigit() first, if it returns false it doesn't care about the second condition so
# int(digit) only is checked after we confirm digit is actually a digit.
elif digit.isdigit() and int(digit) <= 1:
print('Invalid input: Digit was not greater than 1')
digit = get_input()
else:
print('Invalid input: no letters allowed')
digit = get_input()
def get_input() -> str:
return input('Enter an integer greater than 1: ')
def main():
multi_digits()
if __name__ == '__main__':
main()