読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

プログラミングフォント (96 Best programming fonts as of 2017)

以下のページに「96 Best programming fonts as of 2017」って形で

リストアップされています。上位のフォントはどれも有名どころですねー。

www.slant.co


個人的には、昔から「Pragmata Pro」フォントが好きなのですが

フルセットの値段が高い・・・・( ;∀;)

www.fsd.it

EssentialのRegularは昔購入したけど、やっぱりBoldも欲しいな。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

Pythonメモ-06 (PEP-3132 Extended Iterable Unpacking)

概要

小ネタ。Python 3.0で追加された仕様です。

知ってるとちょっと楽できます。

以下のPEPです。

www.python.org

名前は、Extended Iterable Unpacking って感じのちょっとむずかしそうな

名前ですが、実際にコード見てみるとすぐ意味が分かります。

list01 = list(range(5))
first, *rest = list01

上記を実行すると

first=0
rest=[1, 2, 3, 4]

となります。つまり、「*」を付けた変数に残りがアンパックされます。

以前は、こう書いてました。

list01 = list(range(5))
first, rest = list01[0], list01[1:]

アンパックする部分は、左辺の末尾にないといけないわけではなく

str01 = 'hello world'
first, *rest, last = str01

のように記述することもできます。

この場合、ちゃんと first, last にも先頭と末尾の値が入ります。

サンプル

        # -----------------------------------------------
        # PEP 3132 Extended Iterable Unpacking は
        # Python 3.0 から追加された機能。
        #
        # 「*」を付けた変数に残りの値がアンパックされる
        # -----------------------------------------------
        # 以下のように iterable を右辺において
        # 左辺に複数の変数で受ける記述は昔からあったが
        # そこに、「*」を付与した変数を置くと
        # ここでアンパックされる。また、後ろに
        # アンパックではない通常の変数を置いても
        # 適切に解釈して値を設定してくれる。
        # -----------------------------------------------
        str01 = 'hello world'
        first, *rest, last = str01

        pr('first', first)
        pr('rest', rest)
        pr('last', last)

        # なので、シーケンスの先頭とそれ以外を分ける場合に
        seq01 = list(range(10))
        first, rest = seq01[0], seq01[1:]

        pr('first', first)
        pr('rest', rest)

        # とする必要がなく、以下のように書ける
        first, *rest = seq01

        pr('first', first)
        pr('rest', rest)

        # 同じことが for ステートメントでも適用できて以下のように書ける
        it01 = [tuple('hello'), tuple('world')]
        for _, *x, _ in it01:
            print(x)

        # 一つしか要素がない iterable の場合もちゃんと動く
        oneitem = [1]
        first, *rest = oneitem

        pr('first', first)
        pr('rest', rest)

        # さすがに要素がゼロの場合はエラーになる
        try:
            noitem = []
            first, *rest = noitem

            pr('first', first)
            pr('rest', rest)
        except ValueError as e:
            pr('noitem', e)

実行すると以下のようになります。

first='h'
rest=['e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l']
last='d'
first=0
rest=[1, 2, 3, 4, 5, 6, 7, 8, 9]
first=0
rest=[1, 2, 3, 4, 5, 6, 7, 8, 9]
['e', 'l', 'l']
['o', 'r', 'l']
first=1
rest=[]
noitem=ValueError('not enough values to unpack (expected at least 1, got 0)',)

ソースは、以下でも見れます。

github.com


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。

Pythonメモ-05 (内包表記について)

以下、自分用のメモです。

概要

pythonといえば、「リスト内包表記(list comprehension)」が有名ですが

リストだけじゃなくて、辞書にも集合にも内包表記があります。

リスト内包表記

[ expression for item in iterable]

辞書内包表記

{ key_item: value_item for item in iterable }

集合内包表記

{ item for item in iterable }

タプル内包表記??

実は、タプルの内包表記はありません。

() で囲めばいいんじゃね?って思うのですが

実際にやると

obj = (item for item in range(5))
print(type(obj))
<class 'generator'>

ってなります。()で囲むと「ジェネレータ内包表記」となります。

サンプル

        #
        # 内包表記
        # 内包表記 (comprehension) は、一つ以上のイテレータから
        # Pythonデータ構造をコンパクトに生成出来る形式。
        #
        # 内包表記には以下が存在する。
        #   ・リスト内包表記
        #   ・辞書内包表記
        #   ・集合内包表記
        #   ・ジェネレータ内包表記
        # タプルの内包表記は存在しない
        #
        seq01 = tuple(range(10))

        #
        # リスト内包表記
        # 以下の形式となる
        #
        # [ expression for item in iterable [if condition] ]
        #
        pr('list-comprehension', [x ** 2 for x in seq01 if x < 5])

        # 2つのシーケンスを使う内包表記も可能
        seq02 = tuple(range(10, 20))
        pr('list-comprehension', [(x, y) for x in seq01 for y in seq02])

        #
        # 辞書内包表記
        # 以下の形式となる
        #
        # { key_item: value_item for item in iterable }
        #
        str01 = 'hello world'
        pr('dict-comprehension', {c: str01.count(c) for c in str01})

        # 上の処理では、同じ文字が存在する場合に同じエントリに対して上書きしているので
        # 少しだけ無駄となる。最適化すると以下のように出来る
        pr('dict-comprehension', {c: str01.count(c) for c in set(str01)})

        #
        # 集合内包表記
        # 以下の形式となる
        #
        # { item for item in iterable }
        #
        pr('set-comprehension', {c for c in str01})

        #
        # ジェネレータ内包表記
        # 以下の形式となる
        #
        # ( item for item in iterable )
        #
        # 注意点:ジェネレータは一度しか利用できない
        gen01 = (c for c in set(str01))
        pr('generator-comprehension', type(gen01))

        for x in gen01:
            pr('generator', x)

ソースは、以下でも見れます。

github.com


以下、参考にした情報です。

入門 Python 3

入門 Python 3


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。