What’s New In Python 3.1 ノート¶
What’s New In Python 3.1 を読んで、個人的に関心のある項目に注釈を付けていく。 3.1 は見るべき項目は多くはない。
新規機能¶
- str.format()系の書式化ルールに千区切り指定子が追加された。- [[fill]align][sign][#][0][width][,][.precision][type] - このカンマが追加要素だ。 - In [7]: format(1234567890) Out[7]: '1234567890' In [8]: format(1234567890, ',') Out[8]: '1,234,567,890' 
- str.format()系の文字列の中括弧フィールドに自動的に番号が付与されるようになった。この機能を無意識に使っていた。
ところで str.format() 系の書式指定は詳細仕様をなかなか覚えられない。困ったときは IPython のセッションで help('FORMATTING') と入力すれば仕様が出力される。
- int.bit_length()を使えば、その整数値を二進数で表現するために必要なビット数がわかる。正の整数 \(n\) に対して値 \(\lceil \log_2 n\rceil\) が、おそらく効率的に得られる。
その他¶
- with A as B文で複数の- A as Bをカンマ区切りで並べることができるようになった。これをやると一行が長くなり過ぎるので、個人的には敬遠したい。
- round()が整数を入力とすると、出力も整数となるように改められた。
- 浮動小数点数の最短表現を決めるアルゴリズムが変更されて、文字列としての表示がましになったらしい。 
新規モジュール¶
- importlib追加。動的にモジュールの要素をインポートしたい状況では、このモジュールの提供機能に頼ることになるだろう。
変更モジュール¶
- collections- Counterが追加。ドラクエのふくろ方式のコレクション型。- 牌譜解析に利用させてもらっている。 
 
- OrderedDictという、要素の追加順を維持する- dictが追加された。- 個人的にはこの型のお世話にならないと思う。 
 
- namedtuple()にキーワード引数- renameが追加された。これを- Trueにすればフィールド名を安全に一意的にできる。
 
- itertoolsに新規関数や引数が追加。- combinations_with_replacement(): 重複アリ置換部分列を生成する。- In [30]: list(combinations_with_replacement('もくし', 3)) Out[30]: [('も', 'も', 'も'), ('も', 'も', 'く'), ('も', 'も', 'し'), ('も', 'く', 'く'), ('も', 'く', 'し'), ('も', 'し', 'し'), ('く', 'く', 'く'), ('く', 'く', 'し'), ('く', 'し', 'し'), ('し', 'し', 'し')] 
- compress(): フィルターして枚挙する。
- count(): キーワード引数- stepが追加された。そのおかげで- +=できる型ならばなんでも枚挙できるようになった。
 
- reの- sub(),- subs(),- split()関数が- compile()関数のものと同じ引数- flagsをとれるようになった。
- loggingによその言語のライブラリーにあるそれと同様の意味を持つクラス- NullHandlerが追加された。今までなかったのか。
- unittest- スキップ系のデコレーターが追加された。 
- 例外テスト系が - with A as B文に対応された。
- assert系メソッドが多数追加された。
 
- ioに- seek()関数の引数に指定する定数- SEEK_SET,- SEEK_CUR,- SEEK_ENDが追加された。今までどうしていたのだ。
- sys.version_infoが- namedtupleになった。このオブジェクトをコンソールに出力しておくと、あとで見返すときに便利そうだ。- In [42]: sys.version Out[42]: '3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit (AMD64)]' In [43]: sys.version_info Out[43]: sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0)