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 村山 俊之
タグ: Python