如何防止用户在Python中输入空格/什么都不输入?

时间:2018-08-09 10:16:46

标签: python if-statement while-loop try-except

我有一个问题,用户可以输入空格或什么也不能输入,仍然通过程序,我该如何防止这种情况发生?我仍然是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 $3 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循环可能是错误的。

本质上来说,如果我输入一个空格或按回车键就会存储其中一个客户输入内容(例如,customerName)。需要防止这种情况,我尝试使用显然没有用的while循环来修复它。

希望有人能解决这个问题

非常感谢。

8 个答案:

答案 0 :(得分:0)

尝试使用regular expression来检查“ A-Z”之间是否插入了任何字符,如果没有,请输入错误

答案 1 :(得分:0)

代替立即使用输入,您可以创建类似于此功能的功能,仅允许有效输入。

您可以使用此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

这里的检查非常简单:不允许任何由空格或空格组成的文本,我们将继续要求相同的输入,直到提供有效信息为止。

我使这段代码很简单,以便您有一个大致的了解。但是您可以根据自己的喜好更改验证测试,还可以输出警告,说明为什么不允许输入,以便此人知道该怎么做。您可以使用正则表达式进行更高级的验证,也许您需要最小文本长度等...

答案 2 :(得分:0)

您有一个缩进错误,因为您有一个try语句而没有相应的except。 您需要两者都可以使其正常工作(就像在“电话号码”部分中所做的一样)。

这里是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块中捕获该异常,打印警告并返回错误(或其他错误)。

        try:
            customerName = input("Please input your name")
            if not customerName:
                raise ValueError
        except ValueError:
            print("Please input a valid name")
        else:
            break

答案 3 :(得分:0)

您正在寻找的是str.strip方法,该方法可以删除字符串中的尾随空格。 另外,我认为尝试并不特别适合您的需求。

customerName = input("Please input your name")
while not customerName.strip():
    customerName = input("Please input a valid name")

对于电话号码,我不会转换为整数,因为如果电话号码以零开头,则不会存储它们。

答案 4 :(得分:0)

while循环是一个不错的解决方案,您只需要在if语句中添加更多检查即可。

首先,您不需要在前两个循环中使用try语句。除非您期望遇到错误,否则不要使用try语句,您需要使用except语句来处理该错误,就像在底部的while循环中一样。

然后,您只需要在前两个循环中添加更多条件,就不知道您要防止的确切情况,但是您可以尝试检查输入的长度,也可以查看此答案以获取一种有趣的方法: https://stackoverflow.com/a/2405300/8201979

答案 5 :(得分:0)

尝试添加另一个为true的拣货和交货选项,以防止接收其他投入物

答案 6 :(得分:0)

您不需要任何尝试/例外(无论如何都可以尝试)。

很难弄清楚您要做什么,是否要在传递空字符串时引发异常,还是要求用户提供其他输入?您目前似乎一半都在实现。

如果是后者,则类似的方法会起作用。

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")

答案 7 :(得分:0)

.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 $3 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()