多个while循环的问题

时间:2012-12-07 17:21:41

标签: python while-loop

我在尝试使用while循环验证用户输入时遇到问题,然后确保用户不重复值。我所尝试的两种方法显示了波纹管,但我无法理解如何让它们工作。

方法1

def test():
my_list = ["", "", ""]
for i in range(3):
    while (my_list[i] != "one") and \
          (my_list[i] != "two") and \
          (my_list[i] != "three"):

        while (my_list[i] == my_list[0]) and \
              (my_list[i] == my_list[1]) and \
              (my_list[i] == my_list[2]):

            text = "Enter, one, two or three", i + 1, ":"
            try:
                my_list[i] = input(text)
            except KeyboardInterrupt:
                sys.exit()

print(my_list)

方法2

def test2():

my_list= ["", "", ""]
while len(my_list)!=len(set(my_list)) == True:
    for c in range(4):
        while (my_list[i] != "one") and \
              (my_list[i] != "two") and \
              (my_list[i] != "three"):
            text = "Enter, one, two or three", c + 1, ":"
            try:
                my_list[c] = input(text)
            except KeyboardInterrupt:
                sys.exit()


print(my_list)

1 个答案:

答案 0 :(得分:3)

为什么不简化一下:

my_list = []
while len(data) < 3:
    data = input(text) # Valid for Python 3, use raw_input(text) in Python 2
    if data in ("one", "two", "three") and data not in my_list:
        my_list.append(data)

这是对您的要求的或多或少的直接翻译:

  1. 我有一个清单
  2. 虽然列表太小
    1. 获取一些数据
    2. 如果数据是有效值之一,并且尚未在列表中
      1. 将其添加到列表
  3. 在这种情况下使用for x in range(y)只会增加复杂性,因为您实际上并不知道要循环运行多少次。

    没有理由使用无效值(my_list = ["", "", ""])预先填充列表,因为列表可以使用append调整大小。

    此外,您的sys.exit代码是不必要的,可能有害。只是让异常传播,它将使程序本身崩溃(除非你抓住它,你几乎不应该为KeyboardInterrupt异常做。)

    注意:如果您将两个while循环合并为一个循环,那么您的第一个版本将会起作用,这只是不必要的复杂。