こんにちは、森山です。
前回のコラムでは、番号でデータを管理する「リスト型」と、名前(キー)でデータを管理する「辞書型」を組み合わせる方法を学びました。
では、復習を兼ねて、学校にいる先生たちの特徴をまとめたデータを作り、先生とその特徴をランダムに表示するプログラムを作ってみましょう。
正しく表示されれば成功です。まずは、前回学んだ内容を思い出しながら、自分でコードを書いてみてください。
まだ自信がないという方は、次のコードを参考にして、先生や特徴を好きな内容に変えて実行してみましょう。
import random
# 先生と特徴をまとめたデータ
teachers = {
"担任の先生": ["シャツがはみ出ているときがある", "いつもいちご牛乳を飲んでいる", "実は犬好き"],
"校長先生": ["朝礼の話が長い", "猫を見かけると笑顔になる", "ゴルフが好き"],
"保健室の先生": ["いつも優しい", "推し活をしている", "怒ると少し怖い"]
}
# キーの一覧をリストに変換し、random.choice()で先生をランダムに1人選ぶ
name = random.choice(list(teachers.keys()))
# 選ばれた先生の特徴を取り出す
features = teachers[name]
print(f"{name}は、{'、'.join(features)}という特徴があります。")コードを作れたらGoogle Colabで実行してみてください。
辞書からランダムに選んだ先生をキーとして使い、その先生に対応する特徴のリストを取り出せたでしょうか?
このプログラムでは、先生を選ぶ、特徴を取り出す、文章を表示するという複数の処理を順番に行っています。
このような一連の処理をひとまとめにして、必要なときに何度でも呼び出せるようにしたものが「関数」です。
これまでにも次のような関数を使ってきました。
- 文字や数字を画面に表示する
print() - キーボードから値を入力する
input() - データの数を調べる
len() - ランダムにデータを選ぶ
random.choice() - ランダムな整数を作る
random.randint()
print()やinput()は、Pythonに最初から用意されている「組み込み関数」です。
一方、random.choice()やrandom.randint()は、randomモジュールをimportすることで使えるようになる関数でしたね。
これまでは、Pythonやモジュールにあらかじめ用意されている関数を使ってきましたが、実は関数は自分で作ることもできます。
今回は、自分で関数を作り、呼び出す方法について学んでいきましょう。
関数って何?
関数とは、一連の処理をひとまとめにして、名前を付けたものです。
この仕組みを、ダンスの「ボックスステップ」に例えてみましょう。ここでは、ボックスステップを次の4つの動きに分けます。
- 右脚を斜め45度前方へ出す
- 左脚を横に出す
- 右脚を元の位置に戻す
- 左脚を元の位置に戻す
この4つの動きを毎回1つずつ説明するのは面倒ですが、「ボックスステップをしてください」と言えば一言で済みます。
これは一連の動きに「ボックスステップ」という名前を付けて、1つのセットにしているからです。それによって「ボックスステップ」と伝えるだけで、決められた動きを最初から順番に実行できるようになっています。
Pythonの関数も同じ考え方です。
実行したい複数の処理をひとまとめにして名前を付けることで、必要なときに呼び出せるようになります。
関数を自分で作ってみよう
Pythonで関数を作るときは、defを使います。
ボックスステップの一連の動きを、そのまま関数の形にすると、次のようになります。
def box_step():
右脚を斜め45度前方へ出す
左脚を横に出す
右脚を元の位置に戻す
左脚を元の位置に戻すこれは、関数の仕組みをイメージしやすくするために、処理の中身を日本語で表したものなので、このままではPythonのコードとして実行できません。実際に関数を定義するときは、def 関数名():の下に実行したい処理を書きます。
defは、英語の「define(定義する)」を短くしたものです。
このように、関数の名前と処理内容を決めて作ることを「関数を定義する」といいます。
関数は定義しただけでは動かない
関数を使うときには、関数を「作る(定義する)」段階と、作った関数を「使う(呼び出す)」段階があります。関数は定義しただけでは実行されません。定義した関数を実行するには、関数名の後ろに()を付けて呼び出します。
def box_step():
print("右脚を斜め45度前方へ出す")
print("左脚を横に出す")
print("右脚を元の位置に戻す")
print("左脚を元の位置に戻す")
box_step()最後のbox_step()が、関数を呼び出している部分です。
関数が呼び出されると、関数の中に書かれた処理が上から順番に実行されます。
関数の書き方のルール
関数は、次のように書きます。
def 関数名():
実行したい処理関数を定義するときは、次のルールがあります。
- 最初にdefを書く
- 関数名の後ろに()を書く
- 行末に:(コロン)を付ける
- 関数に含める処理はインデントする
関数の中には、print()やこれまでに学んだ条件分岐やfor文なども入れられます。
ボックスステップを4回繰り返そう
ボックスステップを4回繰り返したい場合、box_step()を4回書くこともできますが、第6時限目で学んだfor文を使えば、より短く書くことができます。
def box_step():
print("右脚を斜め45度前方へ出す")
print("左脚を横に出す")
print("右脚を元の位置に戻す")
print("左脚を元の位置に戻す")
print()
for i in range(4):
box_step()ここがポイント!
関数を定義するのは1回だけです。
for文の中でbox_step()を呼び出しているため、関数の中にまとめた4つの処理が4回繰り返されます。
関数の最後に書いた引数のないprint()は、空行を表示するためのものです。1回分のボックスステップが終わるたびに空行が入るため、繰り返しの区切りが分かりやすくなります。
このように関数とfor文を組み合わせると、同じ処理を何度も書かずに済みます。同じ処理を繰り返したいときは、関数とfor文を組み合わせて活用していきましょう。
関数名を付けるときのルール
自分で関数を作るときは、その関数が何をするのか分かる名前を付けましょう。
例えば、ボックスステップを実行する関数なら、box_stepという名前にすると、後からコードを読み直したときにも処理を想像できます。
関数名を付けるときは、次のようなルールや注意事項がいくつかあります。
- 半角英数字と_(アンダースコア)を使う
- 数字から始めない
- 複数の単語は_で区切る
- forやifなど、Pythonで特別な意味を持つ言葉は使わない
- 関数の処理が分かる名前を付ける
Pythonでは、同じ名前の関数をもう一度定義してもエラーにはなりません。ただし、先に定義した関数は、後から定義した関数に置き換わります。
また、printやlenなど、組み込み関数と同じ名前を自分の関数に付けると、元の組み込み関数をその名前で呼び出せなくなります。意図しない動作を防ぐため、組み込み関数と同じ名前を付けるのは避けましょう。
関数を使うメリット
関数を使うメリットは、主に次の3つです。
- 同じ処理を毎回書かずに再利用できる
- 処理ごとに名前を付けて整理できる
- 処理を変更するときに、修正する場所を減らせる
ボックスステップの動きを変えたくなった場合も、関数の定義を修正するだけで、すべての呼び出しに変更が反映されます。
プログラムが長くなるほど、処理を関数に分けて整理することが大切になります。
関数を作って、同じ処理を便利に使い回そう
今回は、次の内容を学びました。
- 関数は、一連の処理をひとまとめにして名前を付けたもの
- 関数を定義するときはdefを使う
- 関数は定義しただけでは実行されない
- 関数を呼び出すときは関数名()と書く
- 関数の処理は上から順番に実行される
- 関数の中には条件分岐やfor文も書ける
- 定義した関数は何度でも再利用できる
これまで何気なく使ってきたprint()やinput()も、今回学んだ関数の仲間です。
ハイスクールPythonの6章では、関数にデータを渡す「引数」や、関数から計算結果などの値を返す「戻り値」についても解説しています。引数や戻り値を使うと、受け取ったデータに合わせて処理を変えたり、関数の処理結果を別の計算に利用したりできるようになります。
用意された関数を使うだけでなく、自分のプログラムに必要な関数を作れるようになると、コードをより分かりやすく整理することができます。
どのような処理をまとめたら便利になるか考えながら、自分だけの関数を作ってみてください。
最後までお読みいただき、ありがとうございました。
それではまた次回お会いしましょう!
