如何防止用户在 Python 中输入 spaces/nothing?
How to prevent user from inputting spaces/nothing in Python?
我遇到一个问题,用户可以输入 space 或什么都不输入,但仍然通过程序,我该如何防止这种情况发生?我在 python 还是个初学者。
def orderFunction(): # The function which allows the customer to choose delivery or pickup
global deliveryPickup
deliveryPickup = input("Please input delivery or pickup: d for delivery p for pickup")
if deliveryPickup == "d":
global customerName
while True:
try:
customerName = (input("Please input your name"))
if customerName == (""):
print("Please input a valid name")
else:
break
global customerAddress
while True:
try:
customerAddress = (input("Please input your name"))
if customerAddress == (""):
print("Please input a valid Address")
else:
break
global customerPhnum
while True:
try:
customerPhnum = int(input("Please input your phone number"))
except ValueError:
print("Please input a valid phone number")
else:
break
print("There will also be a delivery surcharge")
elif deliveryPickup == "p":
customerName = (input("Please input your name"))
if customerName == (""):
print("Please input a valid name")
orderFunction()
else:
print("Please ensure that you have chosen d for Delivery or p for Pickup")
orderFunction()
orderFunction()
这是我尝试这样做的尝试,但我现在遇到各种未缩进和缩进错误,我认为我的 while 循环可能是错误的。
基本上,如果我输入 space 或按回车键进入其中一个客户输入(例如 customerName),它就会被存储。这需要防止,我试图通过使用显然没有用的 while 循环来修复它。
希望有人能解决这个问题
非常感谢。
尝试使用 regular expression 检查是否插入了 "A-Z" 之间的任何字符,如果没有,则报错
您可以创建一个与此类似的函数,只允许有效输入,而不是立即使用输入。
您可以使用此 valid_input
函数代替 input
。
def valid_input(text):
not_valid = True
res = ''
while not_valid:
res = input(text)
if res.split(): # if text is empty or only spaces, this creates an empty list evaluated at False
not_valid = False
return res
这里的检查非常简单:不允许所有无中生有或空格的文本,我们将不断要求输入相同的内容,直到提供有效信息。
我简化了这段代码,只是为了让您有个大概的了解。但是您可以根据自己的喜好更改验证测试,也可以输出一条警告,说明为什么不允许输入,以便此人知道该怎么做。您可以使用正则表达式进行更高级的验证,也许您需要最小文本长度等...
您有缩进错误,因为您的 try
语句没有相应的 except
。
你需要两者才能让它工作(就像你在 Phone 数字部分所做的那样)。
这里是 link 到 try/except: docs
此外,您可以检查字符串是否为空,如 this 答案中所述。
例如你想写:
try:
customerName = input("Please input your name")
if not customerName:
print("Please input a valid name")
else:
break
except ValueError:
print("Please input a valid name")
虽然上面看起来有点多余,所以如果客户名称为空,您可能想引发异常,在 except
块中捕获异常,打印警告和 return 错误(或其他)。
try:
customerName = input("Please input your name")
if not customerName:
raise ValueError
except ValueError:
print("Please input a valid name")
else:
break
您正在寻找的是 str.strip
方法,它可以删除字符串中的尾随空格。
另外我觉得try这里不是特别适合你的需求
customerName = input("Please input your name")
while not customerName.strip():
customerName = input("Please input a valid name")
对于 phone 数字我不会转换为整数,因为如果 phone 数字以零开头,它们将不会被存储。
while 循环是一个不错的解决方案,您只需要在 if 语句中添加更多检查。
首先,您不需要在前两个循环中使用 try 语句。不要使用 try 语句,除非您预期会出现错误,而您需要使用 except 语句来处理该错误,就像在底部 while 循环中所做的那样。
然后你只需要在你的前两个循环中添加更多条件,我不知道你到底想阻止什么,但你可以尝试检查输入的长度,另请参阅此答案以获得有趣的方法:
尝试为取件和送货选项添加另一个 while true 以防止接受其他输入
你不需要这些 try/excepts 中的任何一个(无论如何都坏了)。
很难弄清楚您要做什么,您是在尝试在传递空字符串时引发异常,还是请求用户进行其他输入?您目前似乎只执行了一半。
如果是后者,像这样的东西就可以了。
def func(fieldname):
while True:
val = input("Please input your {}".format(fieldname))
if val.strip() != "":
break
else:
print("Please input a valid {}".format(fieldname))
return val
delivery_pickup = input("Please input delivery or pickup: d for delivery p for pickup")
if delivery_pickup == "d":
customer_name = func("name")
address = func("address")
phone_number = func("phone number")
.strip()
删除字符串前后的所有制表符或空格。
意思是所有空格 == 空字符串。所有选项卡 == 空字符串。因此,您必须检查该字符串的长度 != 0 或字符串是否为空。只需使用无限循环来继续强制正确输入。
另请注意,您不必将自己局限于一种功能。
下面是一个工作代码。
def getNonBlankInput(message, error_message):
x = input(message)
while len(x.strip()) == 0:
x = input(error_message)
return x
def getValidIntegerInput(message, error_message):
msg = message
while(True):
try:
x = int(input(msg))
break
except ValueError:
msg = error_message
return x
def orderFunction(): # The function which allows the customer to choose delivery or pickup
global deliveryPickup
global customerName
global customerAddress
global customerPhnum
deliveryPickup = input("Please input delivery or pickup: d for delivery p for pickup")
if deliveryPickup == "d":
customerName = getNonBlankInput("Please input your name: ", "Please input a valid name: ")
customerAddress = getNonBlankInput("Please input your address: ", "Please input a valid address: ")
customerPhnum = getValidIntegerInput("Please input your phone number: ", "Please input a valid phone number: ")
print("There will also be a delivery surcharge")
elif deliveryPickup == "p":
customerName = getNonBlankInput("Please input your name: ", "Please input a valid name: ")
else:
print("Please ensure that you have chosen d for Delivery or p for Pickup")
orderFunction()
orderFunction()
我遇到一个问题,用户可以输入 space 或什么都不输入,但仍然通过程序,我该如何防止这种情况发生?我在 python 还是个初学者。
def orderFunction(): # The function which allows the customer to choose delivery or pickup
global deliveryPickup
deliveryPickup = input("Please input delivery or pickup: d for delivery p for pickup")
if deliveryPickup == "d":
global customerName
while True:
try:
customerName = (input("Please input your name"))
if customerName == (""):
print("Please input a valid name")
else:
break
global customerAddress
while True:
try:
customerAddress = (input("Please input your name"))
if customerAddress == (""):
print("Please input a valid Address")
else:
break
global customerPhnum
while True:
try:
customerPhnum = int(input("Please input your phone number"))
except ValueError:
print("Please input a valid phone number")
else:
break
print("There will also be a delivery surcharge")
elif deliveryPickup == "p":
customerName = (input("Please input your name"))
if customerName == (""):
print("Please input a valid name")
orderFunction()
else:
print("Please ensure that you have chosen d for Delivery or p for Pickup")
orderFunction()
orderFunction()
这是我尝试这样做的尝试,但我现在遇到各种未缩进和缩进错误,我认为我的 while 循环可能是错误的。
基本上,如果我输入 space 或按回车键进入其中一个客户输入(例如 customerName),它就会被存储。这需要防止,我试图通过使用显然没有用的 while 循环来修复它。
希望有人能解决这个问题
非常感谢。
尝试使用 regular expression 检查是否插入了 "A-Z" 之间的任何字符,如果没有,则报错
您可以创建一个与此类似的函数,只允许有效输入,而不是立即使用输入。
您可以使用此 valid_input
函数代替 input
。
def valid_input(text):
not_valid = True
res = ''
while not_valid:
res = input(text)
if res.split(): # if text is empty or only spaces, this creates an empty list evaluated at False
not_valid = False
return res
这里的检查非常简单:不允许所有无中生有或空格的文本,我们将不断要求输入相同的内容,直到提供有效信息。
我简化了这段代码,只是为了让您有个大概的了解。但是您可以根据自己的喜好更改验证测试,也可以输出一条警告,说明为什么不允许输入,以便此人知道该怎么做。您可以使用正则表达式进行更高级的验证,也许您需要最小文本长度等...
您有缩进错误,因为您的 try
语句没有相应的 except
。
你需要两者才能让它工作(就像你在 Phone 数字部分所做的那样)。
这里是 link 到 try/except: docs
此外,您可以检查字符串是否为空,如 this 答案中所述。
例如你想写:
try:
customerName = input("Please input your name")
if not customerName:
print("Please input a valid name")
else:
break
except ValueError:
print("Please input a valid name")
虽然上面看起来有点多余,所以如果客户名称为空,您可能想引发异常,在 except
块中捕获异常,打印警告和 return 错误(或其他)。
try:
customerName = input("Please input your name")
if not customerName:
raise ValueError
except ValueError:
print("Please input a valid name")
else:
break
您正在寻找的是 str.strip
方法,它可以删除字符串中的尾随空格。
另外我觉得try这里不是特别适合你的需求
customerName = input("Please input your name")
while not customerName.strip():
customerName = input("Please input a valid name")
对于 phone 数字我不会转换为整数,因为如果 phone 数字以零开头,它们将不会被存储。
while 循环是一个不错的解决方案,您只需要在 if 语句中添加更多检查。
首先,您不需要在前两个循环中使用 try 语句。不要使用 try 语句,除非您预期会出现错误,而您需要使用 except 语句来处理该错误,就像在底部 while 循环中所做的那样。
然后你只需要在你的前两个循环中添加更多条件,我不知道你到底想阻止什么,但你可以尝试检查输入的长度,另请参阅此答案以获得有趣的方法:
尝试为取件和送货选项添加另一个 while true 以防止接受其他输入
你不需要这些 try/excepts 中的任何一个(无论如何都坏了)。
很难弄清楚您要做什么,您是在尝试在传递空字符串时引发异常,还是请求用户进行其他输入?您目前似乎只执行了一半。
如果是后者,像这样的东西就可以了。
def func(fieldname):
while True:
val = input("Please input your {}".format(fieldname))
if val.strip() != "":
break
else:
print("Please input a valid {}".format(fieldname))
return val
delivery_pickup = input("Please input delivery or pickup: d for delivery p for pickup")
if delivery_pickup == "d":
customer_name = func("name")
address = func("address")
phone_number = func("phone number")
.strip()
删除字符串前后的所有制表符或空格。
意思是所有空格 == 空字符串。所有选项卡 == 空字符串。因此,您必须检查该字符串的长度 != 0 或字符串是否为空。只需使用无限循环来继续强制正确输入。
另请注意,您不必将自己局限于一种功能。 下面是一个工作代码。
def getNonBlankInput(message, error_message):
x = input(message)
while len(x.strip()) == 0:
x = input(error_message)
return x
def getValidIntegerInput(message, error_message):
msg = message
while(True):
try:
x = int(input(msg))
break
except ValueError:
msg = error_message
return x
def orderFunction(): # The function which allows the customer to choose delivery or pickup
global deliveryPickup
global customerName
global customerAddress
global customerPhnum
deliveryPickup = input("Please input delivery or pickup: d for delivery p for pickup")
if deliveryPickup == "d":
customerName = getNonBlankInput("Please input your name: ", "Please input a valid name: ")
customerAddress = getNonBlankInput("Please input your address: ", "Please input a valid address: ")
customerPhnum = getValidIntegerInput("Please input your phone number: ", "Please input a valid phone number: ")
print("There will also be a delivery surcharge")
elif deliveryPickup == "p":
customerName = getNonBlankInput("Please input your name: ", "Please input a valid name: ")
else:
print("Please ensure that you have chosen d for Delivery or p for Pickup")
orderFunction()
orderFunction()