Yêu cầu nhập lại trong python

Tương tự như vòng lặp for, vòng lặp while cũng được dùng để thực hiện lặp đi lặp lại nhiều lần một khối lệnh. Vòng lặp while còn gọi là vòng lặp không xác định (vô hạn) vì thông thường ta sẽ không xác định được số lần thực hiện khối lệnh trong nó.

Cú pháp:

while điều_kiện:

  khối_lệnh

Quy cách thực thi:

Vòng lặp while sẽ kiểm tra điều_kiện trước:

+ Nếu sai thì thoát khỏi vòng lặp mà không thực hiện khối_lệnh.

+ Nếu đúng thì thực hiện khối_lệnh, thực hiện xong lại quay lên kiểm tra điều_kiện, chu trình thực hiện cứ như vậy cho đến khi điều_kiện sai.

Ví dụ 1: Lặp vô hạn

Phần điều kiện của vòng lặp là True có nghĩa rằng điều kiện là luôn luôn đúng, tức khối lệnh của nó sẽ được thực hiện vô hạn lần.

#vòng lp sthc hin khi lnh vô hn ln
while True:
  #câu lnh này sđược thc hin vô hn ln
  print("Lp trình viên")

Ví dụ 2: Lặp hữu hạn

Ví dụ sau sử dụng một biến đếm n để thực hiện khối lệnh với một số lần mong muốn, điều này có nghĩa ta cũng có thể biến while trở thành vòng lặp xác định.

n=0
while n<10:
  #câu lnh này sđược thc hin 10 ln
  print("Lp trình viên - Programmer - Coder - Developer")
  n+=1

Ví dụ 3: Kiểm soát giá trị nhập vào

Còn đây là ví dụ áp dụng while để kiểm soát giá trị nhập vào phải thỏa mãn điều kiện đặt ra (validate). Trong trường hợp này bạn sẽ phải nhập một số nguyên n nằm trong khoảng (0

n=int(input("Mi nhp mt s n (0))
#nếu n không nm trong khong 0<n<1000 thì sthc hin khi lnh phía dưới
while not(0<n and n<1000):
  n=int(input("Mi nhp li n (0))

Ví dụ 4: Menu chọn

print("=====MENU====")
print("1. Lựa chọn 1")
print("2. Lựa chọn 2")
print("3. Lựa chọn 3")
print("4. Lựa chọn 4")
print("5. Lựa chọn 5")
print("6. Thoát")
print("=============")
while True:
  option=int(input("Mời chọn 1 mục: "))
  if option==1:
    print("Bạn đã chọn Lựa chọn 1")
  if option==2:
    print("Bạn đã chọn Lựa chọn 2")
  if option==3:
    print("Bạn đã chọn Lựa chọn 3")
  if option==4:
    print("Bạn đã chọn Lựa chọn 4")
  if option==5:
    print("Bạn đã chọn Lựa chọn 5")
  if option==6:
    print("Bạn đã chọn Thoát")
    break

Xem thêm

  • Bài tập phần Vòng lặp

Cách đơn giản nhất để thực hiện điều này sẽ là đưa inputphương thức vào một vòng lặp while. Sử dụng continuekhi bạn nhận được đầu vào xấu và breakra khỏi vòng lặp khi bạn hài lòng.

Khi đầu vào của bạn có thể tăng ngoại lệ

Sử dụng thử và bắt để phát hiện khi người dùng nhập dữ liệu không thể được phân tích cú pháp.

while True:
    try:
        # Note: Python 2.x users should use raw_input, the equivalent of 3.x's input
        age = int(input("Please enter your age: "))
    except ValueError:
        print("Sorry, I didn't understand that.")
        #better try again... Return to the start of the loop
        continue
    else:
        #age was successfully parsed!
        #we're ready to exit the loop.
        break
if age >= 18: 
    print("You are able to vote in the United States!")
else:
    print("You are not able to vote in the United States.")

Thực hiện các quy tắc xác nhận của riêng bạn

Nếu bạn muốn từ chối các giá trị mà Python có thể phân tích thành công, bạn có thể thêm logic xác thực của riêng bạn.

while True:
    data = input("Please enter a loud message (must be all caps): ")
    if not data.isupper():
        print("Sorry, your response was not loud enough.")
        continue
    else:
        #we're happy with the value given.
        #we're ready to exit the loop.
        break

while True:
    data = input("Pick an answer from A to D:")
    if data.lower() not in ('a', 'b', 'c', 'd'):
        print("Not an appropriate choice.")
    else:
        break

Kết hợp Xử lý ngoại lệ và Xác thực tùy chỉnh

Cả hai kỹ thuật trên có thể được kết hợp thành một vòng lặp.

while True:
    try:
        age = int(input("Please enter your age: "))
    except ValueError:
        print("Sorry, I didn't understand that.")
        continue

    if age < 0:
        print("Sorry, your response must not be negative.")
        continue
    else:
        #age was successfully parsed, and we're happy with its value.
        #we're ready to exit the loop.
        break
if age >= 18: 
    print("You are able to vote in the United States!")
else:
    print("You are not able to vote in the United States.")

Đóng gói tất cả trong một chức năng

Nếu bạn cần hỏi người dùng của mình nhiều giá trị khác nhau, có thể hữu ích khi đặt mã này vào một hàm, vì vậy bạn không phải nhập lại mã mỗi lần.

def get_non_negative_int(prompt):
    while True:
        try:
            value = int(input(prompt))
        except ValueError:
            print("Sorry, I didn't understand that.")
            continue

        if value < 0:
            print("Sorry, your response must not be negative.")
            continue
        else:
            break
    return value

age = get_non_negative_int("Please enter your age: ")
kids = get_non_negative_int("Please enter the number of children you have: ")
salary = get_non_negative_int("Please enter your yearly earnings, in dollars: ")

Để tất cả chúng cùng nhau

Bạn có thể mở rộng ý tưởng này để thực hiện một chức năng đầu vào rất chung chung:

def sanitised_input(prompt, type_=None, min_=None, max_=None, range_=None):
    if min_ is not None and max_ is not None and max_ < min_:
        raise ValueError("min_ must be less than or equal to max_.")
    while True:
        ui = input(prompt)
        if type_ is not None:
            try:
                ui = type_(ui)
            except ValueError:
                print("Input type must be {0}.".format(type_.__name__))
                continue
        if max_ is not None and ui > max_:
            print("Input must be less than or equal to {0}.".format(max_))
        elif min_ is not None and ui < min_:
            print("Input must be greater than or equal to {0}.".format(min_))
        elif range_ is not None and ui not in range_:
            if isinstance(range_, range):
                template = "Input must be between {0.start} and {0.stop}."
                print(template.format(range_))
            else:
                template = "Input must be {0}."
                if len(range_) == 1:
                    print(template.format(*range_))
                else:
                    print(template.format(" or ".join((", ".join(map(str,
                                                                     range_[:-1])),
                                                       str(range_[-1])))))
        else:
            return ui

Với cách sử dụng như:

age = sanitised_input("Enter your age: ", int, 1, 101)
answer = sanitised_input("Enter your answer: ", str.lower, range_=('a', 'b', 'c', 'd'))

Những cạm bẫy thường gặp và tại sao bạn nên tránh chúng

Việc sử dụng dự phòng của inputbáo cáo dự phòng

Phương pháp này hoạt động nhưng thường được coi là phong cách kém:

data = input("Please enter a loud message (must be all caps): ")
while not data.isupper():
    print("Sorry, your response was not loud enough.")
    data = input("Please enter a loud message (must be all caps): ")

Nó có thể trông hấp dẫn ban đầu vì nó ngắn hơn while Truephương pháp, nhưng nó vi phạm nguyên tắc Không lặp lại của chính bạn về phát triển phần mềm. Điều này làm tăng khả năng lỗi trong hệ thống của bạn. Điều gì sẽ xảy ra nếu bạn muốn backport thành 2.7 bằng cách thay đổi inputthành raw_input, nhưng vô tình chỉ thay đổi cái đầu tiên inputở trên? Đó SyntaxErrorchỉ là chờ đợi để xảy ra.

Đệ quy sẽ thổi bay ngăn xếp của bạn

Nếu bạn vừa mới học về đệ quy, bạn có thể muốn sử dụng nó get_non_negative_intđể bạn có thể loại bỏ vòng lặp while.

def get_non_negative_int(prompt):
    try:
        value = int(input(prompt))
    except ValueError:
        print("Sorry, I didn't understand that.")
        return get_non_negative_int(prompt)

    if value < 0:
        print("Sorry, your response must not be negative.")
        return get_non_negative_int(prompt)
    else:
        return value

Điều này dường như hoạt động tốt hầu hết thời gian, nhưng nếu người dùng nhập dữ liệu không hợp lệ đủ số lần, tập lệnh sẽ chấm dứt với a RuntimeError: maximum recursion depth exceeded. Bạn có thể nghĩ rằng "không có kẻ ngốc nào sẽ phạm 1000 lỗi liên tiếp", nhưng bạn đang đánh giá thấp sự khéo léo của những kẻ ngốc!

572 hữu ích 2 bình luận chia sẻ