質問: t_dict.timeit(number=1000) print("%d %10.3f %20.3f" %(i, list_del_time, dict_del_time)) ```
回答: コード全体の意味がよく分からない時は、コードを分割しながら動作を調べることで意味を理解できるかもしれません。 `len(x)`とは引数xの長さです。 ここで扱うxはリストなので、リストに入っている要素の数を返します。 ``` x = [1, 2] print(len(x)) #2 ``` `random.randrange(i)`は0からi-1までのランダムな整数を返します。 len(x)-1を指定するとリストの末尾の要素を削除しなくなりますが、ここで末尾を残す意図は質問文から推測できません。(`random.randrange(0, len(x) - 1)`ならば例外を発生させないことが目的と推測できます) ``` x = [1, 2] i = len(x) #2 print(random.randrange(len(x)) - 1) #何度実行しても 0≦N<(2-1) の整数(すなわち0)を返す ``` random_indexとはdel_dict_itemsという名の関数内で有効な変数です。 randrangeの範囲でランダムな整数を入れるという理解でよいです。 KeyErrorが実行される結果、`except KeyError`でsetdefaultで`random_index`キーに`None`という値を入れる処理に移行します。 setdefaultで辞書型のキーを入れれば値がNoneでも何でも辞書型のdelは実行できる、という理解でよいです。 timeit.Timer(stmt, setup)は第1引数(stmt)に実行時間を計測するコードを記述します。第2引数(setup)に初期化するコードを記述します。 セットアップ時に`from __main__ import random, x, del_dict_items`を記述することで、コマンドラインから`python hoge.py`で呼び出されるメイン関数で定義された変数`x`や関数`del_dict_items`、`random`を使えるようにしています。 上記の記述があるので実行処理(stmt)で`del_dict_items(x)`が使用できるようになります。 下記サンプルコードの違いとエラーに注目してください。 ``` # 上記の通りセットアップする t_dict = timeit.Timer(stmt="del_dict_items(x)", setup="from __main__ import random, x, del_dict_items") # セットアップ処理で「xが定義されていません」(ModuleNotFoundError: No module named 'x')エラーが出る t_dict = timeit.Timer(stmt="del_dict_items(x)", setup="import random, x, del_dict_items") # 実行処理で「del_dict_itemsが定義されていません」(NameError: name 'del_dict_items' is not defined)エラーが出る t_dict = timeit.Timer(stmt="del_dict_items(x)", setup="from __main__ import random, x") ``` 回答を記述していて、以下の点が気になりました。 * 『python プログラムについて』というタイトルは抽象的なので、質問を具体的に判別できるタイトルを推奨します。(質問の幅が広くて具体化できない時は、質問を分割することが望ましいです) * del_deict_itemsなど、質問文の関数名に誤字が多いです。回答者が混乱するので関数や変数名の誤字には特に注意しましょう。(編集済) * 変数や関数の使い方があやふやになっている部分があるかもしれません。少し立ち止まってコードを分解し、理解を深めることをお勧めします。 老婆心ながら上から目線の忠告となってしまいました。 難しいコードを例示して複数の疑問を記述するよりも、質問のスコープを絞って「単純なサンプルコードのここが分からない」と質問した方が的確な回答がつきやすい傾向にありますので、参考になさってください。