Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Lỗi NameError: name 'xrange' is not defined trong Python 3 và giải pháp

Trong Python 3, hàm xrange đã bị loại bỏ. Nếu bạn cố gắng sử dụng hàm xrange trong chương trình Python 3, bạn sẽ gặp lỗi NameError: name 'xrange' is not defined.

Trong hướng dẫn này, chúng ta sẽ thảo luận ý nghĩa của lỗi này và tại sao bạn có thể gặp phải nó. Chúng ta sẽ đi qua một ví dụ để bạn học cách sửa lỗi trong mã của mình.

NameError: name 'xrange' is not defined

Trong Python 2, hàm xrange cho phép bạn tạo một dải số. Xem đoạn mã sau:

print(xrange(0, 3))

Mã của chúng ta trả về [0, 1, 2], tức là tất cả các số trong khoảng từ 0 đến 3 (không bao gồm 3). Hàm xrange() trả về một danh sách các số.

Python 3 đã loại bỏ hàm xrange() thay bằng một hàm mới gọi là range(). Hàm range(), giống như xrange(), tạo ra một dải số.

Có hai khác biệt giữa xrange() và range():

  • xrange() và range() có tên khác nhau.
  • Hàm xrange() tạo ra một danh sách các số. Hàm range() tạo ra một đối tượng (object).

Vì hàm range() tạo ra một đối tượng, bạn phải chuyển đổi nó thành danh sách nếu muốn xem danh sách các số. Ngoài ra, hai phương thức này hoạt động giống nhau.

Ví dụ thực tế

Chúng ta sẽ viết một chương trình hiển thị vài người chơi đứng đầu bảng xếp hạng trò chơi bài. Đầu tiên, khai báo bảng xếp hạng dưới dạng danh sách:

leaderboard = ["Alex", "Jonas", "Emma", "Kate"]

Tiếp theo, hỏi người dùng muốn xem bao nhiêu điểm số:

to_view = int(input("How many scores would you like to view? "))

Chúng ta chuyển đổi giá trị người dùng nhập vào thành số nguyên. Điều này là do hàm xrange() chỉ hỗ trợ số nguyên.

Kế tiếp, lặp qua danh sách leaderboard bằng vòng lặp for. Chỉ hiển thị số kết quả mà người dùng yêu cầu:

for l in xrange(0, to_view):
    print(l + 1, leaderboard[l])

Chúng ta dùng hàm xrange() để tạo dải số giữa 0 và số người dùng nhập. Trong vòng lặp for, dùng print() để in mục bảng xếp hạng tương ứng với số trong danh sách xrange() mà vòng lặp đang xem.

Chúng ta in giá trị "l" cộng một cùng với tên người chơi. Điều này cho thấy vị trí của họ. Vì danh sách được đánh chỉ mục từ 0, ta cộng 1 vào "l". Điều này ngăn người chơi đầu tiên ở vị trí "0" và cứ thế.

Hãy chạy mã và xem kết quả:

How many scores would you like to view? 2
Traceback (most recent call last):
  File "main.py", line 5, in 
    for l in xrange(0, to_view):
NameError: name 'xrange' is not defined

Chương trình trả về lỗi.

Giải pháp

Chúng ta đã dùng hàm xrange() để tạo dải số. Trong Python 2, điều này hợp lệ. Nhưng chúng ta đang dùng Python 3 để chạy chương trình, nghĩa là không thể tham chiếu hàm xrange().

Để khắc phục lỗi, cần thay thế xrange() bằng phương thức range():

for l in range(0, to_view):
    print(l + 1, leaderboard[l])

Với trường hợp này, cả xrange() và range() đều trả về cùng kết quả. Hãy chạy lại mã:

How many scores would you like to view? 2
1 Alex
2 Jonas

Chương trình hiển thị thành công tên người chơi ở hai vị trí đầu tiên trên bảng xếp hạng.

Định nghĩa lại phương thức xrange()

Một giải pháp tiềm năng là định nghĩa một biến tên xrange ở đầu chương trình bằng hàm range():

xrange = range

Đây không phải giải pháp tốt. Bạn chỉ tránh việc đổi tên phương thức hiện có. Sẽ gây nhầm lẫn cho người đọc mã Python 3 thấy câu lệnh xrange(), ngay cả khi bạn đã định nghĩa xrange là biến.

Giải pháp tốt nhất là đổi tên các câu lệnh xrange() thành range() và thực hiện các thay đổi cần thiết để mã hoạt động trong Python 3.

Kết luận

Lỗi "NameError: name 'xrange' is not defined" xảy ra khi bạn cố dùng phương thức xrange() để tạo dải số trong Python 3. Để khắc phục, hãy cập nhật mã để dùng phương thức range() có sẵn trong Python 3.

range() là phương thức thay thế cho xrange() trong Python 3. Bây giờ bạn đã có kiến thức để giải quyết lỗi này như một chuyên gia!