【解決策】Pythonで「NameError: name 'xrange' is not defined」が発生する原因と対処法
Python 2で使われていた xrange() 関数は、Python 3から削除されました。そのため、Python 3のプログラム内で xrange() を使用すると、「NameError: name 'xrange' is not defined」というエラーが発生します。
この記事では、このエラーの意味や発生する理由を解説し、実際のコード例をもとに、エラーを修正する具体的な方法をわかりやすく紹介します。
NameError: name 'xrange' is not defined とは
Python 2では、xrange() 関数を使って数値の範囲(レンジ)を生成できました。次のコードを見てみましょう。
print(xrange(0, 3))
このコードは [0, 1, 2] を返します。これは0以上3未満のすべての数値であり、xrange() 関数はこのように数値のリストを生成していました。
一方、Python 3では xrange() 関数が廃止され、代わりに新しい range() 関数が導入されました。range() 関数も xrange() と同様に、数値の範囲を生成します。
xrange() と range() の違いは主に次の2点です。
- 関数名が異なる(
xrange()とrange())。 xrange()は数値のリストを生成するのに対し、range()はオブジェクトを生成する。
range() 関数はオブジェクトを返すため、数値のリストとして確認したい場合は list() などで変換する必要があります。それ以外の動作については、両者ともほぼ同じです。
エラーが発生する具体例
ここでは、カードゲームのランキング上位プレイヤーを表示するプログラムを例に考えてみましょう。まず、ランキングをリストとして定義します。
leaderboard = ["Alex", "Jonas", "Emma", "Kate"]
次に、ユーザーに何件のスコアを表示したいかを尋ねます。
to_view = int(input("How many scores would you like to view? "))
入力値は int() で整数に変換しています。これは、xrange() 関数が整数しかサポートしていないためです。
続いて、forループでランキングリストを反復処理し、ユーザーが指定した件数だけ結果をコンソールに表示します。
for l in xrange(0, to_view): print(l + 1, leaderboard[l])
xrange() 関数で0からユーザーが入力した数までの範囲を生成し、forループ内の print() 文で、その番号に対応するランキングのエントリを出力しています。
「l + 1」とプレイヤー名を一緒に出力することで順位がひと目でわかるようにしています。リストは0からインデックスが始まるため、1を加算することで、最初のプレイヤーが「0位」ではなく「1位」と表示されるようにしています。
それでは、このコードを実行してみましょう。
How many scores would you like to view? 2 Traceback (most recent call last): File "main.py", line 5, in <module> for l in xrange(0, to_view): NameError: name 'xrange' is not defined
プログラムはエラーを返しました。
解決策
このエラーの原因は、Python 2向けの xrange() 関数をPython 3環境で使用していることにあります。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
今度は、ランキング上位2名のプレイヤー名が正しく表示されました。
xrange を再定義する方法は非推奨
もうひとつの対処法として、プログラムの先頭で xrange = range と定義し、xrange() を range() 関数と同等に扱えるようにする方法があります。
xrange = range
しかし、この方法はおすすめできません。既存のメソッド名を変更する作業を回避しているだけで、根本的な解決になっていないためです。変数として定義していたとしても、Python 3のコードベースを読む人が xrange() という記述を目にすると混乱を招きます。
最善の解決策は、xrange() を range() に書き換え、コードベース全体がPython 3で正しく動作するよう必要な修正を行うことです。
まとめ
「NameError: name 'xrange' is not defined」エラーは、Python 3で xrange() メソッドを使って数値の範囲を生成しようとした際に発生します。このエラーを解決するには、コードをPython 3標準の range() メソッドを使う形に更新しましょう。
range() は xrange() のPython 3における後継となる関数です。これで、このエラーをプロのように解決できる知識が身につきました!
-
【Python入門】defで定義した関数をMatplotlibでプロットする方法
Pythonでは、defキーワードで定義した自作関数を、Matplotlibを使って簡単にグラフ化できます。本記事では、ユーザー定義関数 f(x) を作成し、その結果をプロットするまでの基本手順をサンプルコード付きで解説します。 プロットまでの基本手順 defで定義した関数をプロットするには、以下の手順に従います。 図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整する defを使ってユーザー定義関数 f(x) を作成する NumPyを使って x のデータ点を生成する plot()メソッドで x と f(x) をプロットする show()メソッドで図を画面に表示する サ
-
Pythonのissubset()関数とは?部分集合の判定方法を実例付きで解説
本記事では、Python標準ライブラリに用意されているissubset()関数の仕組みと使い方について詳しく解説します。 issubset()メソッドは、あるセット(集合)のすべての要素が、引数として渡した別のセットにも含まれている場合にブール値のTrueを返し、1つでも含まれていない要素があればFalseを返します。 下の図では、BはAの部分集合です。もしAとBが同一のセットであれば、両者は互いに部分集合の関係にあるといえます。つまり、両方のセットがまったく同じ要素を持っているということを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値