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