M - 1.12.組み込み関数 Editorial /

Time Limit: 0 msec / Memory Limit: 0 KB

前のページ | 次のページ

キーポイント

  • 関数 は与えられた引数に対して処理を行い返り値を返す機能である
  • Python が標準で提供している組み込み関数は準備なしに使うことができる
  • 組み込み関数には数値の計算やリストの集計など、様々な便利機能を持つものが用意されている

関数

これまでの節で、標準入力を得るための input やリストの長さを得るための len などの機能を用いてきました。
これらの機能はより正確には「関数」と呼ばれるものになります。関数とは、与えられた値(引数)に対してある定められた処理を行い、処理の結果の値(返り値)を返す道具です。中には引数が無い関数、返り値が無い関数、複数の返り値を返す関数も存在します。

何度も行う処理を関数としてまとめることで、色々な値に対する処理の結果を計算したいときにプログラムの記述量を大きく減らすことができます。そのため、大半のプログラミング言語において関数は必須の機能となっています。

用語の確認のため、これまでに出てきたいくつかの関数の引数・処理内容・返り値を整理します。

関数 引数 処理内容 返り値
len リストや文字列 長さを取得する 長さ (整数値)
input 無し 1 標準入力から1行取得する 標準入力の1行 (文字列)
print 文字列, 整数 など 標準出力に出力する 無し2
divmod 数値2つ 剰余を計算する 1つめの数値を2つめの数値で割った商と余り

Python 標準の関数

leninput は関数の中でも特別なもので、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)ab 乗の値を計算します。
pow(a,b,mod)ab 乗を 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

なお、空のリストに対して allTrue を、anyFalse を返します。

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, "です")    

問題

リンク先の問題を解いてください。

Ex12.最速のランナーを見つけよう

前のページ | 次のページ


  1. input は実は引数を与えることも可能です。引数を与えるとその内容が標準出力に出力されます。ユーザにどのような入力を入れてほしいか伝えるときなどに便利ですが、競技プログラミングで用いることは稀でしょう。 

  2. より厳密には、None という「何ものでもない値」を返しています。 

  3. Python 3.12 時点。こちらから一覧を見ることができます。