Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

แก้ไข NameError: name 'xrange' is not defined ใน Python 3

ใน Python 3 ฟังก์ชัน xrange ถูกลบออก หากคุณพยายามใช้ฟังก์ชัน xrange ในโปรแกรม Python 3 คุณจะพบข้อผิดพลาด NameError: name 'xrange' is not defined

ในคู่มือนี้ เราจะอภิปรายว่าข้อผิดพลาดนี้หมายถึงอะไรและว่าทำไมคุณจึงอาจพบเจอ มาเจาะลึกตัวอย่างของข้อผิดพลาดนี้เพื่อให้คุณเรียนรู้วิธีแก้ไขในโค้ดของคุณ

NameError: name 'xrange' is not defined

ใน Python 2 ฟังก์ชัน xrange ให้คุณสร้างช่วงของตัวเลข พิจารณาตัวอย่างโค้ดต่อไปนี้:

print(xrange(0, 3))

โค้ดของเราคืนค่า [0, 1, 2] ซึ่งเป็นตัวเลขทั้งหมดในช่วง 0 ถึง 3 (ไม่นับ 3) ฟังก์ชัน xrange() คืนค่ารายการของตัวเลข

Python 3 ลบฟังก์ชัน xrange() ออก เพื่อใช้ฟังก์ชันใหม่ชื่อ range() แทน ฟังก์ชัน range() เหมือน xrange() ผลิตช่วงของตัวเลข

มีความแตกต่างสองประการระหว่าง xrange() และ range():

  • xrange() และ range() มีชื่อต่างกัน
  • ฟังก์ชัน xrange() สร้างรายการของตัวเลข ฟังก์ชัน range() สร้างออบเจ็กต์

เนื่องจากฟังก์ชัน range() สร้างออบเจ็กต์ คุณจึงต้องแปลงมันเป็นรายการหากคุณต้องการดูรายการตัวเลข มิฉะนั้น สองเมธอดนี้ทำงานเหมือนกันทุกประการ

สถานการณ์ตัวอย่าง

เราจะเขียนโปรแกรมที่แสดงผู้เล่นคนแรกๆ ที่อยู่ที่อันดับบนของกระดานผู้นำเกมไพ่ เริ่มต้นด้วยการประกาศกระดานผู้นำเป็นรายการ:

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

ต่อไป เราจะถามผู้ใช้ว่าต้องการดูคะแนนกี่อันดับ:

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

เราแปลงค่าที่ผู้ใช้ป้อนเป็นจำนวนเต็ม เนื่องจากฟังก์ชัน xrange() รองรับเฉพาะจำนวนเต็ม

ต่อไป มาวนซ้ำผ่านรายการกระดานผู้นำของเราโดยใช้ลูป for เราจะแสดงผลเฉพาะจำนวนผลลัพธ์ที่ผู้ใช้ขอดูบนคอนโซล:

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

เราใช้ฟังก์ชัน xrange() เพื่อสร้างช่วงตัวเลขระหว่าง 0 ถึงตัวเลขที่ผู้ใช้ป้อน ในลูป for ของเรา เราใช้คำสั่ง print() เพื่อพิมพ์รายการกระดานผู้นำที่สัมพันธ์กับตัวเลขในรายการ xrange() ที่ลูปของเรากำลังดู

เราพิมพ์ค่าของ "l" บวกหนึ่ง พร้อมกับชื่อผู้เล่น นี่ช่วยให้เราเห็นตำแหน่งของพวกเขา เนื่องจากรายการมีดัชนีเริ่มจากศูนย์ เราจึงบวกหนึ่งกับ "l" เพื่อป้องกันไม่ให้ผู้เล่นคนแรกในรายการของเราอยู่ที่ตำแหน่ง "0" และต่อไป

มาเรียกโค้ดของเราและดูสิ่งที่เกิดขึ้น:

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

โปรแกรมของเราคืนค่าข้อผิดพลาด

วิธีแก้ไข

เราได้ใช้ฟังก์ชัน xrange() เพื่อสร้างช่วงของตัวเลข ใน Python 2 นี่จะถูกต้อง แต่เรากำลังใช้ Python 3 เพื่อรันโปรแกรมของเรา ซึ่งหมายความว่าเราไม่สามารถอ้างอิงฟังก์ชัน xrange() ได้

เพื่อแก้ไขข้อผิดพลาดของเรา เราต้องแทนที่ xrange() ด้วยเมธอด range():

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

สำหรับกรณีการใช้งานนี้ ทั้ง xrange() และ range() จะคืนค่าผลลัพธ์เดียวกัน มาเรียกโค้ดของเราเพื่อดูว่าทำงานได้หรือไม่:

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

โปรแกรมของเราแสดงชื่อผู้เล่นในทัวร์นาเมนต์ที่ปรากฏในสองตำแหน่งแรกบนกระดานผู้นำสำเร็จ

การกำหนดค่าเมธอด xrange() ใหม่

วิธีแก้ไขที่เป็นไปได้สำหรับปัญหานี้คือการกำหนดตัวแปรชื่อ xrange ที่จุดเริ่มต้นของโปรแกรมของคุณที่เท่ากับฟังก์ชัน range():

xrange = range

นี่ไม่ใช่วิธีแก้ไขที่ดีสำหรับข้อผิดพลาดนี้ เนื่องจากคุณเพียงหลีกเลี่ยงปัญหาการเปลี่ยนชื่อเมธอดที่มีอยู่ มันจะสับสนสำหรับใครก็ตามที่อ่านโค้ดเบส Python 3 และเห็นคำสั่ง xrange() แม้คุณจะกำหนด xrange เป็นตัวแปร

วิธีแก้ไขที่ดีที่สุดคือการเปลี่ยนชื่อคำสั่ง xrange() ของคุณเป็น range() และทำการเปลี่ยนแปลงที่จำเป็นเพื่อให้โค้ดเบสของคุณทำงานใน Python 3

สรุป

ข้อผิดพลาด "NameError: name 'xrange' is not defined" จะถูกโยนออกมาเมื่อคุณพยายามใช้เมธอด xrange() เพื่อสร้างช่วงของตัวเลขใน Python 3 เพื่อแก้ไขข้อผิดพลาดนี้ ให้อัปเดตโค้ดของคุณให้ใช้เมธอด range() ที่มาพร้อมกับ Python 3

range() เป็นการแทนที่ของ Python 3 สำหรับ xrange() ตอนนี้คุณมีความรู้ที่จำเป็นในการแก้ไขข้อผิดพลาดนี้อย่างมืออาชีพแล้ว!