5倍速!メールマガジン
外部アカウントで登録
受講生の声
新着の講座投稿
新着の講座コメント
新着のノート投稿
投稿一覧へ新着のノートコメント
表示できる投稿はありません。
サイト運営者紹介
小川 慶一講師/教材/システム開発者紹介
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
jinoseさんの投稿
(投稿ID: 5538)
以下コードを書いた際、
for key in fish_dict.keys():
print(key)
出力結果
karei
katsuo
fugu
と表示されます。その為、
print(fish_dict.keys())と書いた際には、
['karei', 'katsuo', 'fugu']と、
Keyのみが出力されると思いました。
しかし出力結果は、
dict_keys(['karei', 'katsuo', 'fugu'])
でした。
dict_keys←この変数を作った覚えは無いのにこれが表示されるので、混乱しています。dict_keysは何を表すのでしょうか?
質問の意図が自分でもよく分からないのですが、何となく腑に落ちず質問させていただきました。
小川 慶一さんのコメント
(コメントID: 8355)
まず、53秒までに説明しているとおりで、 .keys() メソッドは、辞書の key を順番に取り出すためのメソッドです。
for 文の in 演算子以降に置くと、以下のように、順番に key を取り出してくれます。
出力結果:
ところで、この .keys() で得られるものは何なのか?
「そりゃ、リストとかタプルとかでしょ?」と思われるかもしれませんが...。
実は、違います。
my_dict.keys() で得られるものは何か?
以下の検査で分かります。
出力結果:
上記のとおり、「dict_keys クラスのオブジェクト」です。
type関数については、以下の「データモデル」講座で紹介しています。
Pythonのデータモデル - 撮り下ろし版
https://forum.pc5bai.com/lesson/course/116/
この「dict_keys クラスのオブジェクト」はリストやタプルとは何が違うのかというと...。
「for 文の in 演算子の後ろに置かれると、くりかえしの都度、辞書のキーを順番に返すオブジェクト」です。
要は、「リスト」や「タプル」のような「もう生成済の配列」ではなく、「for 文内では『リスト』や『タプル』のようにくりかえし対象として使えるけど、『生成済の配列』」ではない。
上記の点がミソです。
「もう生成済の配列」より、ちょっと抽象度が高いですね...。
なぜ、そんなものがあるのか?
話しだすとかなりまとまった話になってしまうので...ここでは簡単にメリットだけ書きますと。
今は辞書のキーが3件しかないですけど、極端な例として「キーが3,000万件ある辞書」などを考えてみてください。
そのとき、 .keys() メソッドを実行するつど、「要素が3,000万件あるリストを作る」とか、いかにも効率悪そうですよね。
生成に時間がかかるし、メモリも食います。
しかも、その全部を使うかどうかもわからない(for ループを「一定条件を満たしたら即離脱」なんていう構文もちょこちょこありますから)
なので、そんな無駄を省くために、「くりかえしの都度、辞書のキーを順番に返すオブジェクト」たる「dict_keys クラスのオブジェクト」というものが辞書にはあらかじめ備わっています。
この「dict_keys クラスのオブジェクト」は、イメージとしては、「すでにある辞書のキーを、要請がある都度、順番に渡してくれるという機能を持ったロボット」のようなものです。
まるっと言うと、 .keys() メソッドで「その辞書が有するロボットを呼び出した」というわけです。