Python 如何强制用户反复输入值,直到输入在一定范围内

Python 如何强制用户反复输入值,直到输入在一定范围内,python,Python,我是一个真正的新手,正在尝试学习一些Python编码(我唯一的经验是从免费的codeacademy在线练习中获得的)。如果输入正确的输入,此代码将正常工作。然而,我想强迫“用户”(我自己)一次又一次地输入字节1和字节2的值,直到最终输入正确的输入。例如,如果我输入了两个超出允许范围的值..GGGG,JJJJ,脚本只需说明错误并继续。 如果有人有兴趣帮助我解决这个问题,请发表评论或提供更多关于解决方案的细节,以便我能够理解如何解决以及为什么解决。多谢各位 这是代码 import re def c

我是一个真正的新手,正在尝试学习一些Python编码(我唯一的经验是从免费的codeacademy在线练习中获得的)。如果输入正确的输入,此代码将正常工作。然而,我想强迫“用户”(我自己)一次又一次地输入字节1和字节2的值,直到最终输入正确的输入。例如,如果我输入了两个超出允许范围的值..GGGG,JJJJ,脚本只需说明错误并继续。 如果有人有兴趣帮助我解决这个问题,请发表评论或提供更多关于解决方案的细节,以便我能够理解如何解决以及为什么解决。多谢各位

这是代码

import re

def check(X):
    if not re.match("^[0-FFFF]*$", X):
        print "Error! Only HEX values allowed!"
    elif len(X) != 4:
        print "Error! Only 4 characters allowed!"

while True:
    byte1_start = raw_input("Enter byte1 start value: ")
    check(byte1_start)
    byte1_end = raw_input("Enter byte1 end value: ")
    check(byte1_end)
    byte2_start = raw_input("Enter byte2 start value: ")
    check(byte2_start)
    byte2_end = raw_input("Enter byte2 end value: ")
    check(byte2_end)
    break

print ("All is ok!")
你很接近:

def getValue(cmd):
  While True:
    answer = raw_input(cmd)
    if check(answer):
       return answer
    else:
       print "your input is not valid"
然后写一点检查函数:

def check(X):
  if not re.match("^[0-FFFF]*$", X):
    print "Error! Only HEX values allowed!"
    return False
  elif len(X) != 4:
    print "Error! Only 4 characters allowed!"
    return False
  return True
你的程序现在可以读了

byte_1_start = getValue("Enter byte1 start value: ")
byte_1_end = getValue("Enter byte1 end value: ")
...
你很接近:

def getValue(cmd):
  While True:
    answer = raw_input(cmd)
    if check(answer):
       return answer
    else:
       print "your input is not valid"
然后写一点检查函数:

def check(X):
  if not re.match("^[0-FFFF]*$", X):
    print "Error! Only HEX values allowed!"
    return False
  elif len(X) != 4:
    print "Error! Only 4 characters allowed!"
    return False
  return True
你的程序现在可以读了

byte_1_start = getValue("Enter byte1 start value: ")
byte_1_end = getValue("Enter byte1 end value: ")
...

您应该让
检查
跟踪可能存在的所有错误,然后返回所有错误。或者只是检查它是否通过——不要试图给出原因

备选案文1:

def check(byte):
    tests_msgs = [(lambda byte: re.match("^[0-9A-F]*$", byte), "Error! Only HEX values allowed!"),
                  (lambda byte: len(byte) == 4, "Error! Only 4 characters allowed")]
    return [msg for test,msg in tests_msgs if not test(byte)]

bytes = []

for i in range(4):
    while True:
        byte = raw_input("Enter byte{} start value: ".format(str(i)))
        errs = check(byte)
        if not errs:
            bytes.append(byte)
            break
        else:
            for err in errs:
                print err
备选案文2:

def check(byte):
    tests = [lambda byte: re.match("^[0-9A-F]*$", byte,
             lambda byte: len(byte) == 4]
    return all(test(byte) for test in tests)

bytes = []

for i in range(4):
    while True:
        byte = raw_input("Enter byte{} start value: ".format(str(i)))
        if check(byte):
            bytes.append(byte)
            break
        else:
            print "Some generic error message"
还要注意,您的正则表达式不会按预期工作<代码>[0-FFFF]
不是所有四位十六进制值。您正在寻找:

/^[0-9A-F]*$/i
# re.compile(r"^[0-9A-F]*$", re.I)
但您也可以将这两个错误与一个正则表达式组合,然后跳过检查
len(X)

/^[0-9A-F]{4}$/i
# re.compile(r"^[0-9A-F]{4}$", re.I)

您应该让
检查
跟踪可能存在的所有错误,然后返回所有错误。或者只是检查它是否通过——不要试图给出原因

备选案文1:

def check(byte):
    tests_msgs = [(lambda byte: re.match("^[0-9A-F]*$", byte), "Error! Only HEX values allowed!"),
                  (lambda byte: len(byte) == 4, "Error! Only 4 characters allowed")]
    return [msg for test,msg in tests_msgs if not test(byte)]

bytes = []

for i in range(4):
    while True:
        byte = raw_input("Enter byte{} start value: ".format(str(i)))
        errs = check(byte)
        if not errs:
            bytes.append(byte)
            break
        else:
            for err in errs:
                print err
备选案文2:

def check(byte):
    tests = [lambda byte: re.match("^[0-9A-F]*$", byte,
             lambda byte: len(byte) == 4]
    return all(test(byte) for test in tests)

bytes = []

for i in range(4):
    while True:
        byte = raw_input("Enter byte{} start value: ".format(str(i)))
        if check(byte):
            bytes.append(byte)
            break
        else:
            print "Some generic error message"
还要注意,您的正则表达式不会按预期工作<代码>[0-FFFF]
不是所有四位十六进制值。您正在寻找:

/^[0-9A-F]*$/i
# re.compile(r"^[0-9A-F]*$", re.I)
但您也可以将这两个错误与一个正则表达式组合,然后跳过检查
len(X)

/^[0-9A-F]{4}$/i
# re.compile(r"^[0-9A-F]{4}$", re.I)

您可以将just use all与返回布尔值和函数的集合一起使用,以避免在用户犯一个错误时重复所有输入:

def check(x):
    st = {"A", "B", "C", "D", "E", "F", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
    if all(ch.upper() in st for ch in x):
        if len(x) != 4:
            print "Error! Only 4 characters allowed!"
            return False
        else:
            return True
    else:
        print("Invalid input {}".format(x))
        return False

def byte1_start():
    inp = raw_input("Enter byte1 start value: ")
    while not check(inp):
        inp = raw_input("Enter byte1 start value: ")
    return inp

def byte1_end():
    inp = raw_input("Enter byte1 end value: ")
    while not check(inp):
        inp = raw_input("Enter byte1 end value: ")
    return inp

def byte2_start():
    inp = raw_input("Enter byte2 start value: ")
    while not check(inp):
        inp = raw_input("Enter byte2 start value: ")
    return inp

def byte2_end():
    inp = raw_input("Enter byte2 end value: ")
    while not check(inp):
        inp = raw_input("Enter byte2 end value: ")
    return inp

for chk in [byte1_start, byte1_end, byte2_start, byte2_end]:
    chk()

print("All good")

您可以将just use all与返回布尔值和函数的集合一起使用,以避免在用户犯一个错误时重复所有输入:

def check(x):
    st = {"A", "B", "C", "D", "E", "F", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
    if all(ch.upper() in st for ch in x):
        if len(x) != 4:
            print "Error! Only 4 characters allowed!"
            return False
        else:
            return True
    else:
        print("Invalid input {}".format(x))
        return False

def byte1_start():
    inp = raw_input("Enter byte1 start value: ")
    while not check(inp):
        inp = raw_input("Enter byte1 start value: ")
    return inp

def byte1_end():
    inp = raw_input("Enter byte1 end value: ")
    while not check(inp):
        inp = raw_input("Enter byte1 end value: ")
    return inp

def byte2_start():
    inp = raw_input("Enter byte2 start value: ")
    while not check(inp):
        inp = raw_input("Enter byte2 start value: ")
    return inp

def byte2_end():
    inp = raw_input("Enter byte2 end value: ")
    while not check(inp):
        inp = raw_input("Enter byte2 end value: ")
    return inp

for chk in [byte1_start, byte1_end, byte2_start, byte2_end]:
    chk()

print("All good")
进口稀土

条件=真

def检查(X):

而条件:

byte1_start = raw_input("Enter byte1 start value: ")
b1s = check(byte1_start)
byte1_end = raw_input("Enter byte1 end value: ")
b1e = check(byte1_end)
byte2_start = raw_input("Enter byte2 start value: ")
b2s = check(byte2_start)
byte2_end = raw_input("Enter byte2 end value: ")
b2e = check(byte2_end)

if (b1s and b1e and b2s and b2e):
    condition = False
打印(“一切正常!”)

重新导入

条件=真

def检查(X):

而条件:

byte1_start = raw_input("Enter byte1 start value: ")
b1s = check(byte1_start)
byte1_end = raw_input("Enter byte1 end value: ")
b1e = check(byte1_end)
byte2_start = raw_input("Enter byte2 start value: ")
b2s = check(byte2_start)
byte2_end = raw_input("Enter byte2 end value: ")
b2e = check(byte2_end)

if (b1s and b1e and b2s and b2e):
    condition = False

打印(“一切正常!”)

这里有点难理解您的问题。这里有点难理解您的问题。
如果检查(回答)
什么?函数没有返回任何内容。抱歉,我只是读取了名称,并假定了其余内容。。顺便说一句:你的什么?对于这样一个小错误,听起来有点刺耳。我投了赞成票,但我认为这里的两个函数对于这样一个小任务来说太多了,尤其是一个名为“check()”的函数-检查什么?如果检查(回答)
什么?函数没有返回任何内容。抱歉,我只是读取了名称,并假定了其余内容。。顺便说一句:你的什么?对于这样一个小错误,听起来有点刺耳。我投了赞成票,但我认为这里的两个函数对于这样一个小任务来说太多了,尤其是一个名为“check()”的函数-检查什么?