みなさん、こんにちは、えいりんぐーです。
この記事は Fluent Python の勉強メモ録です。随時更新されます。
正直プログラミング言語の教科書を真面目に読み通すことはあまりないのですが、言語について解説している本をちゃんと読むと、実務でアドホックに身につけるものとは違って、ちゃんとしたコーディング技術や発見があります。
ということで、Fluent Python で気になったことを適宜メモしていきたいと思います。
1章
P.8 脚注
Python 2では明示的に
FrenchDeck(object)
と記述する必要がありますが、Python 3ではデフォルトです。
...なん...だと...!?
2章
P.45
2.7 list.sortと組み込み関数sorted
list.sortメソッドはリストをインプレイスでソートし、コピーは作成しません。新規にリストを作成せずに対象のオブジェクトを変更していることは、
None
が返されることからもわかります。
(中略)
一方で、組み込み関数のsorted
は新規リストを作成し、それを返します。
へー。リストを並べ替えて自分に保存するとかよくやっていたので、参考になしました。
2.9.1 配列
リストに数値のみが含まれているときは、
list
よりもarray.array
の方がより効率的です。...(略)...Pythonの配列はCの配列と同じくらい効率的です。array
はタイプコードを指定して作成しますが、これは配列に格納する要素の型を内部のCのデータ型で支持するためです。
リストもだいたい同じ型のデータしか使わないので、配列を使うようになればもっと効率的にできるんでしょうね。プロコンとか全然やったことないですが、ここら辺を知らないと通用しないでしょうね。
3章
P. 76
my_dict.setdefault(key, []).append(new_value)
これは、操作的には次と同じです。
if key not in my_dict:
my_dict[key] = []
my_dict[key].append(new_value)
if
文を使う方法は、やりがちなので気をつけたい。
4章
余分なのは
b'\xff\xfe
です。これらはBOM (byte-order mark)で、エンコーディングを実行したIntel CPUの「リトルエンディアン」バイト順序を表しています。~中略~
ファイルがUTF-16でそこにBOMがなければ、UTF-16BE (ビッグエンディアン) を想定すべきと標準は規定しています。しかしIntel x86アーキテクチャはリトルエンディアンで、BOMのついていないリトルエンディアンUTF-16がたくさん出回っています。
エンディアンにかかわる問題は、UTF-16やUTF-32のような複数のバイトでワードを構成するエンコーディングにのみ影響します。UTF-8の大きな利点の1つは、マシンのエンディアンに関係なく同じバイトのシーケンスを生成するところです。BOMは必要ありません。それにもかかわらず、WindowsのアプリケーションにはUTF-8ファイルにBOMを追加するものがあります (特にメモ帳)。ExcelのUTF-8ファイル検出はBOMに依存しており、BOMがなければコンテンツがWindowsコードページでエンコードされていると仮定します。
あー、だからPythonで書き出したcsv/tsvをExcelで読み込ませると文字化けするのね。デフォルトでutf-8と認識してくれないのね。