Time Limit: 0 msec / Memory Limit: 0 KB
キーポイント
- 関数 は与えられた引数に対して処理を行い返り値を返す機能である
- Python が標準で提供している組み込み関数は準備なしに使うことができる
- 組み込み関数には数値の計算やリストの集計など、様々な便利機能を持つものが用意されている
関数
これまでの節で、標準入力を得るための input
やリストの長さを得るための len
などの機能を用いてきました。
これらの機能はより正確には「関数」と呼ばれるものになります。関数とは、与えられた値(引数)に対してある定められた処理を行い、処理の結果の値(返り値)を返す道具です。中には引数が無い関数、返り値が無い関数、複数の返り値を返す関数も存在します。
何度も行う処理を関数としてまとめることで、色々な値に対する処理の結果を計算したいときにプログラムの記述量を大きく減らすことができます。そのため、大半のプログラミング言語において関数は必須の機能となっています。
用語の確認のため、これまでに出てきたいくつかの関数の引数・処理内容・返り値を整理します。
関数 | 引数 | 処理内容 | 返り値 |
---|---|---|---|
len |
リストや文字列 | 長さを取得する | 長さ (整数値) |
input |
無し 1 | 標準入力から1行取得する | 標準入力の1行 (文字列) |
print |
文字列, 整数 など | 標準出力に出力する | 無し2 |
divmod |
数値2つ | 剰余を計算する | 1つめの数値を2つめの数値で割った商と余り |
Python 標準の関数
len
や input
は関数の中でも特別なもので、Python が標準で提供している組み込み機能、とりわけ組み込み関数と呼ばれるものになります。Python が標準で提供しているため、ユーザは特に準備なく使用することができます。
これまでの節で出てきたものを含め、Python では全部で71種類の組み込み関数が用意されています3。
以下ではその中でも競技プログラミングにおいて比較的利用されることの多いものを紹介します。
abs
数値の絶対値を計算して返します。
a = -3 b = 5 a_abs = abs(a) b_abs = abs(b) print(a_abs, b_abs)
実行結果
3 5
pow
pow(a,b)
で a
の b
乗の値を計算します。
pow(a,b,mod)
で a
の b
乗を mod
で割った余りを計算します。
a = 3 b = 4 mod = 10 res = pow(a, b) res2 = pow(a, b, mod) print(res, res2)
実行結果
81 1
なお、べき乗は 1.3 節で扱った **
演算子でも計算できますが、組み込み関数 pow
を用いたほうが高速に計算できます。
また、余りは pow(a,b) % mod
のように後から計算しても同じ結果になりますが、pow(a,b)
の値が非常に大きくなる場合は pow(a,b,mod)
のほうが高速に計算できます。
競技プログラミングにおいては pow
関数を使うことが必須であるケースが多いため覚えておきましょう。
min
max
与えられた2つ以上の数値の中の最小値, 最大値を計算して返します。
min_val = min(1, 3, -5, 2) max_val = max(1, 3, -5, 2) print(min_val, max_val)
実行結果
-5 3
数値をリストとして与えることも可能です。
l = [1, 3, -5, 2] min_val = min(l) max_val = max(l) print(min_val, max_val)
実行結果
-5 3
sum
リストに含まれる値の合計を計算して返します。
l = [1, 3, -5, 2] sum_val = sum(l) print(sum_val)
実行結果
1
sorted
リストをソートし、新たなリストを返します。
l = [1, 3, -5, 2] new_l = sorted(l) print("元のリスト:", l) print("新たなリスト:", new_l)
実行結果
元のリスト: [1, 3, -5, 2] 新たなリスト: [-5, 1, 2, 3]
1.10 節で扱った l.sort()
と異なり、元のリストはソートされていない点に注意してください。
all
any
all
は与えられたリストの要素すべてが条件式として真であるかを判定します。
any
は与えられたリストの要素の中に条件式として真であるものが1つ以上存在するかを判定します。
l = [1, 3, -5, 2] res = all([v>0 for v in l]) # l に含まれる値が全て正か? res2 = any([v%2==0 for v in l]) # l に偶数が含まれるか? print(res, res2)
実行結果
False True
なお、空のリストに対して all
は True
を、any
は False
を返します。
print(all([]), any([]))
実行結果
True False
enumerate
for i,v in enumerate(リスト):
のように書くことでリストのインデックスと値を同時に取得することができます。
l = [1, 3, -5, 2] for i,v in enumerate(l): print(i, "番目の要素は", v, "です")
実行結果
0 番目の要素は 1 です 1 番目の要素は 3 です 2 番目の要素は -5 です 3 番目の要素は 2 です
次のように書いても同一の結果になりますが、enumerate
を使うほうが単純に記述することができます。
l = [1, 3, -5, 2] for i in range(len(l)): v = l[i] print(i, "番目の要素は", v, "です")
問題
リンク先の問題を解いてください。