Pythonのrange()ってなんでイテラブルなんだろう
生きてる
死んでそうな記事の止まり方してたけど普通に生きてます。
Cむっず
Cがムズすぎて理解もふんわりしたものになった。しかしふんわりしている現状を文章にするのもまた学び
本題: 俺は愚かなので
すぐ
for i in len(s)
みたいなコード書いてエラー履いて「あっrangeないじゃん」みたいなことになるんですが、よく考えたらなんでrange()
つけたらループ回せるのかということを真面目に考えたことがなかった。ので調べました。
イテラブルかどうかはどこで決まるのか
各オブジェクトにCのラッパーとしての__iter__()
が実装されているかどうかでイテラブルかどうかが決まる。
__iter__()
はCで実装されているイテレーション処理するための関数をそのまま叩くらしい。
普通の呼び出しと違って新しいフレームも作らず、バイトコードを実行して関数を解釈したりすることなくすぐに動くので早い。
渡しているオブジェクトも内部的にはもともとC構造体だからそのままCの関数に渡しても動く、なるほど。
intであるlen(s)
はC構造体レベルでイテラブルじゃないというのが決まっているからイテラブルじゃない、なるほど。PyLong_Type
みたいなオブジェクトのtp_iterがNULLなので、イテラブルじゃないという定義がされているらしい。へ~。それっぽいこと言ってみたけど5%くらいしか分かってないです。
どうでもいいけどコードブロック同士の縦軸が揃うと重なってちょっと気持ち悪い感じになってるので直してえ~、なんとも思ってなかった人が気になるようになって不幸になることを祈ってます。
「難しいもの」の見え方
こういうのを繰り返していると、たしかにプログラムって単純な処理の積み重ねで全てができている感あるな~って気持ちになってくる。
難しいと感じている状態ってこのブレイクダウンが全然できていない状態だと思うので、そういう状態だと自覚することが一歩ずつ前に進むために必要なのかもしれない。