Python 習得中 – その 4 このエントリーをはてなブックマークに追加

今日は 4章の 4.5節まで。

複数の不等号を含む評価式が書ける

変数が取りうる値の範囲を調べる場合、その変数を and を挟んで 2回書く代わりに、複数の不等号を含む単一の評価式として書くことができる。

>>> x = 7
>>> 5 < x < 10
True
>>> x = 2
>>> 5 < x < 10
False
>>> y = 200
>>> 0 < x < 100 < y < 1000
True

こういう書き方できればいいのになぁと思うことは多々あったが、実際できる言語が存在するんですなぁ…。

ループブロックの else

ループブロックに else 節をつけると、 break 等による中断以外でループ終了する時に呼ばれるようです。

>>> numbers = []
>>> count = 0
>>> while count < 5:
...     val = input(str(count + 1) + "番目の整数を入力: ")
...     if val == 'q':
...             break
...     numbers.append(int(val))
...     count += 1
... else:
...     print(numbers, "の合計: ", sum(numbers))
... 
1番目の整数を入力: 1
2番目の整数を入力: 2
3番目の整数を入力: 3
4番目の整数を入力: 5
5番目の整数を入力: 7
[1, 2, 3, 5, 7] の合計:  18

使いどころはそれなりにあると思うのですが、これに else の名を冠するのは正直わかりにくい気もします…。

いろいろと便利な zip() 関数

複数のシーケンスを並列的に反復処理できる。

>>> pythonObj = 'tuple', 'list', 'dict', 'set'
>>> perlObj = 'list', 'list', 'hash', 'hash'
>>> cppObj = 'tuple', 'vector', 'unordered_map', 'unordered_set'
>>> mean = 'タプル', 'リスト (配列)', '辞書 (連想配列)', '集合'
>>> for py, pl, cpp, jp in zip(pythonObj, perlObj, cppObj, mean):
...     print('Python: ' + py + ', Perl: ' + pl + ', C++: ' + cpp + \
...     '\nこれは何? - ' + jp)
... 
Python: tuple, Perl: list, C++: tuple
これは何? - タプル
Python: list, Perl: list, C++: vector
これは何? - リスト (配列)
Python: dict, Perl: hash, C++: unordered_map
これは何? - 辞書 (連想配列)
Python: set, Perl: hash, C++: unordered_set
これは何? - 集合

また、2つのシーケンスを zip() したものを dict() に食わせることで、一方をキー、他方を値とする辞書が作れる。

>>> py2pl = dict(zip(pythonObj, perlObj))
>>> py2pl
{'tuple': 'list', 'set': 'hash', 'dict': 'hash', 'list': 'list'}

数列を作る range() 関数

リストのスライスが欲しいのではなく、数の並びそのものが欲しい場合は、 range() 関数を使えばいい。 Perl でいうところの範囲演算子 .. のようなもので、スライスと同様に step も指定できます。

>>> for x, y in zip(range(0, 3), range(3, 0, -1)):
...     print("x:", x, "/ y:", y)
... 
x: 0 / y: 3
x: 1 / y: 2
x: 2 / y: 1

range(x, y) で得られる数列の逆順が欲しい場合は、 range(y, x, -1) ではなく、 range(y-1, x-1, -1) とするか、または range(x, y)[::-1] とする必要があります。

>>> list(range(0, 3))
[0, 1, 2]
>>> list(range(3, 0, -1))
[3, 2, 1]
>>> list(range(2, -1, -1))
[2, 1, 0]
>>> range(0, 3)[::-1]
range(2, -1, -1)

range にスライスを指定するとリストではなく新たな range を生成するのは面白い特性ですね。

>>> range(0 ,100, 3)[10:20]
range(30, 60, 3)
>>> range(0 ,100, 3)[30:10:-5]
range(90, 30, -15)
>>> range(0 ,10, 3)[30:10:-5]
range(9, 9, -15)
>>> range(0 ,50, 3)[30:10:-5]
range(48, 30, -15)

…といった感じになるらしいです。

2017 年 2 月 25 日 by 村山 俊之

タグ:

コメントをどうぞ