「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。目下、データ分析・語学に力点を置いています。

MENU

Pythonで学ぶアルゴリズム(02/18)

 アルゴリズムを学ぶのにPythonの学習も兼ねて

を参照していく。

1. Python入門

1.2 実践的なプログラミング

1.2.1 文字列のフォーマットメソッド

 いくつかの変数を用いて動的に文字列を構成する場合\mathrm{format}を用いる。文字列リテラルの先頭に\mathrm{f}を記述することで更に短く書くこともできる。

a,b = 10, 5

# 以下の2つは等価
print('{} / {} = {}'.format(a, b, int(a/b)))
print(f'{a} / {b} = {int(a/b)}')


1.2.2 スライス記法

 スライス記法を用いると短いコードでリストの要素を自在に取り出すことができる。

# テスト用データ
test_list = list(range(10, 20))

print(test_list)

# (1) 添字2(3番目)から添字5までを取り出す
print(test_list[2:5])

# (2) コロンを省略すると、前の場合は最初から指定した添字まで、後の場合は指定した添字から最後までになる
print(test_list[2:])
print(test_list[:5])

# (3) 負の添字を利用できる
print(test_list[-3:])

# (4) 添字が範囲を超えていると空のリストが返ってくる

# (5) range関数の引数のように間隔も指定可能である: 
print(test_list[::2])    # 全要素を1つとばしで出力
print(test_list[2:10:2]) #添字2から10までを1つとばしで出力

# (6) リストを逆順にする
print(test_list[::-1])


1.2.3 無名関数

 組み込み関数\mathrm{map}は関数を引数に取り、リストの各要素にこの関数を適用する。

list(map(str, [1, 2, 3]))

 引数に取った整数を文字列に変換して飾りを付ける関数を作成したいとする。
このときに短い関数をわざわざ定義する手間を省くのに用いるのが無名関数である。\mathrm{lambda}をキーワードとして用いる。

# 以下の2つのlistは等価

# (1)
def add_frill(val):
    return '<<< {} >>>'.format(val)

print(list(map(add_frill, [1, 2, 3])))

# (2)
print(list(map(lambda val: '<<< {} >>>'.format(val), [1, 2, 3])))

 \mathrm{lambda}の後に引数を書く。複数ある場合はカンマで区切る。コロンの後に書いた式を評価した値がそのまま関数の戻り値になる。

1.2.4 リストのソート

 リストは\mathrm{sort}メソッドや組み込み関数\mathrm{sorted}でソートできる。リストの要素がリストやタプルになっている場合は先頭の要素がソートに用いられる。

sort_list = [(2,'y'),(3, 'x'), (1, 'z')]

print(sorted(sort_list))

print(sorted(sort_list,key = lambda x: x[1]))

 他方で引数\mathrm{key}に関数を指定することで何番目をソートに利用するかを指定することもできる。リストの各要素はタプルであり、ソートの際に各要素の2番目がソートに使われるようになる。

 \mathrm{sorted}の引数\mathrm{reverse}\mathrm{True}にすると降順にすることができる。

1.2.5 内包表記

 新しいリストを生成するときにリスト内包表記を使うとシンプルに書ける。

 \mathrm{if}文と組み合わせることも可能であるし、辞書型でも内包表記が可能である。

even_list = [x for x in range(10) if x%2 == 0]
new_dict = {num: '<>'.format(num) for num in range(3)}

print(even_list)
print(new_dict)
1.2.6 条件の評価

 \mathrm{if}文や\mathrm{while}文などで条件判定する場合、オブジェクトをそのまま利用できる。空のオブジェクトは\mathrm{False}、任意の値が入っているオブジェクトは\mathrm{True}と判定される。

 これを応用して以下のようなコードも可能である。

1.2.7 便利な代入方法

 \mathrm{Python}では複数の変数を1行で代入することができる。

a = b = 10
print(a, b)

a, b, c = 2, 3, 4
print(a, b, c)

 以下でタプルの各要素をバラバラにすることもできる。

i, j = (2, 3)

 関数が複数個の値を返す場合も返り値を1つ1つ変数に格納することもできる。それぞれの変数は各返り値の型となる。もし1つの変数で受け取った場合、その変数はタプルになる。

def ret_vals():
    return 'a', 2, 5.5

ch, it, rv = ret_vals()
print(ch, it, rv)

res = ret_vals()
type(res)

 逆に関数へ引数を渡す時にリストやタプルを要素ごとに分解することもできる。上述した例では、\mathrm{print}(*\mathrm{res})と記述することで\mathrm{print}(\mathrm{res}[0],\mathrm{res}[1],\mathrm{res}[2])と同じ意味になる。
 条件によって値を変えることもできる。これを三項演算子と呼ぶ。

x = 5
cond = '3以上' if x>=3 else '3未満'
print(cond)
1.2.8 関数の再帰呼び出し

 関数の中で自分自身の関数を呼び出す処理を再帰呼び出しと言い、\mathrm{Python}では再帰的な関数を定義できる。たとえばnの階乗を与える関数は再帰呼び出しを用いて以下で定義する:

def factorial(n):
    if n<=0:
        return 1
    return n * factorial(n-1)

 無限ループになることや分かりにくい恐れが生じるものの実装がシンプルになるため、慣れたら利用するのが良い。

1.2.9 コーディングのスタイル

 \mathrm{Python}のプログラミングは文法に違反しない限り、基本的には自由な書き方が許される。しかし、可読性を向上すべく、一定のコーディング規約(PEP8)が広く共有されている。

プライバシーポリシー お問い合わせ