『Effective Python』の続き。翻訳はでるのだろうか。
Effective Python: 59 Specific Ways to Write Better Python (Effective Software Development Series)
- 作者: Brett Slatkin
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2015/03/08
- メディア: ペーパーバック
- この商品を含むブログ (1件) を見る
sequenceはシークエンスと書くものだと思っていたが、用語集にはシーケンスとあったのでタイトルもシーケンスにした。 シーケンスとは用語集によると
整数インデクスによる効率的な要素アクセスを
__getitem__()
特殊メソッドを通じてサポートし、長さを返すlen()
メソッドを定義したiterable
です。
iterable
ってなんだ、となると
要素を一つずつ返せるオブジェクトです。
となる。dict
も__getitem__()
特殊メソッドを通じてサポートし、長さを返すlen()
メソッドを定義したiterable
であるが整数インデクスではなくmapping
であることに注意しよう…とは書いてない。このあたりは知っているものとして話が進んでいる(前書きを読んでいない)。
Item 5はシーケンスのスライスの振る舞いについての話で、start <= i < end
となるのは今更驚くことではない。
Rubyだとsomelist[2..4]
とsomelist[2...4]
で前者はstart <= i <= end
で後者はstart <= i < end
となる。
Rubyの場合、使い分けが出来るのは何かと便利であるがぱっと見わからない。
個人的には1種類しかないPythonの方が好きである。
スライスでハマリやすいのは参照渡しと値渡しのような状況が起きる点だと思っている。 例えば、
a = [1, 2, 3, 4, 5] b = a[:] c = a a[:2] = [99, 100] print(a) print(b) print(c)
ようなコードがあった場合、それぞれの出力結果はどうなるであろうか。
[99, 100, 3, 4, 5] [1, 2, 3, 4, 5] [99, 100, 3, 4, 5]
おわかりいただけだろうか。
b = a[:]
の場合はコピーを、c = a
の場合はa
が示している参照を渡している。
この違いは気づきにくいが、特に注意喚起することなくこうですよ、という書き方だった。
もしかして、このようなミスをするのは私だけだろうか。