Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

書式指定ミニ言語を使ってString魔界に浸ってみる その2:辞書型を呼び出す

shuzo-kino.hateblo.jp
で扱った書式指定ミニ言語の補足です。

上の記法に加えて、辞書型の変数を扱う方法があります。

実際のところ

辞書型を呼び出すには、"**"とアスタリスクを二個並べる必要あり。

dic = {'bar': 'yeah', 'foo': 123}

"Welcome {bar}. Your ID is {foo:#08x}".format(**dic)
#>> 'Welcome yeah. Your ID is 0x00007b'

range型に[:num]を適用すると、途中まで切り出す事ができる

知れば知るほど妙な挙動をするrange型。
今回は定義済みのrange型を切り貼りして使う方法を扱います。

実際のところ

lists = range(3, 9, 2)

ではここで、コロン記法を使ってみる事にしましょう。
すると……?

lists[:0]
#>> range(3, 3, 2)

……なにやら、末端が変わったrange型が出てきましたね。
0番目の要素だけ返してきたようです。

それなら":1"でどうなるか……予想通りなら5が返ってくるはず

lists[:1]
#>> range(3, 5, 2)

どう活かすか

じゃあ、これをどう活かすかという話になってきますが
ざっと考えて、以下の様な用途が考えられます。

17 in lists[:1]
#>> False

17 in lists
#>> True

組み込み関数range

Pythonの組み込み関数rangeは開始地点からステップ数まで、色々設定できる便利関数です。
Rubyだと類似記法として以下の様なものがありますが……ステップまで一つの関数で面倒見てくれるのは一寸便利かも

Array(1999..2006)

実際のところ

まえの内容も以下のように書き換えられます。
これを使うか、サンドイッチ風を使うかはケースバイケースですね。
shuzo-kino.hateblo.jp

s = list(range(1999,2006))
#=> [1999, 2000, 2001, 2002, 2003, 2004, 2005]

var = 2001

var in s
#>> True

N個毎……といった記述も可能です。
1996年から今回のリオ五輪までの夏五輪開催年を出すのはこんな感じ

list(range(1996,2017,4))
#=> [1996, 2000, 2004, 2008, 2012, 2016]

文字列をバイト列にする/バイト列から戻す

x = "foo".encode()
#>> b'foo'

x.decode()
#>> 'foo'

直接バイナリ列を定義する事も可能

x = b"bar"
#>> b'bar'

ascii文字以外をエンコードしようとすると、16進数の文字列になります。
扱いはasciiと同じ。

var = "ごりら".encode()
#>> b'\xe3\x81\x94\xe3\x82\x8a\xe3\x82\x89'

var.decode()
#>> ごりら

Pythonのリスト型とコロン記法の奇妙な関係

Pythonのリスト型にはコロン記法という実に奇妙な記法があります。
今回はコレについて。

実際のところ

こんなデータがあったとします。

list(range(10))
# => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


全部表示

l[::]
# => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

二番目から

l[2::]
# => [2, 3, 4, 5, 6, 7, 8, 9]

二個だけ

l[:2:]
# => [0, 1]

二個区切り

l[::2]
# => [0, 2, 4, 6, 8]

二番目から八番目まで三個区切り

l[2:8:3]
# => [2, 5]