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 が追加された。そのおかげで += できる型ならばなんでも枚挙できるようになった。

  • resub(), subs(), split() 関数が compile() 関数のものと同じ引数 flags をとれるようになった。

  • logging によその言語のライブラリーにあるそれと同様の意味を持つクラス NullHandler が追加された。今までなかったのか。

  • unittest

    • スキップ系のデコレーターが追加された。

    • 例外テスト系が with A as B 文に対応された。

    • assert 系メソッドが多数追加された。

  • ioseek() 関数の引数に指定する定数 SEEK_SET, SEEK_CUR, SEEK_END が追加された。今までどうしていたのだ。

  • sys.version_infonamedtuple になった。このオブジェクトをコンソールに出力しておくと、あとで見返すときに便利そうだ。

    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)