Pythonの学習を始めて、変数や条件分岐、繰り返し処理に慣れてきた頃に立ちはだかるのが「関数(def)」の壁です。ちょっと難しく感じるかもしれませんが、ここを越えるとコードが驚くほどスッキリし、「あ、自分プログラマっぽいことしてる!」という実感が一気に湧いてきます✨
関数を使いこなせるようになると、似たような処理を何度も書かずに済み、修正や機能追加もぐっとラクに。今日からあなたのスクリプトが、見違えるように読みやすく・再利用しやすくなりますよ🚀
関数とは、ひとことで言うと「処理を一つにまとめて定義しておく仕組み」です。なぜそれが必要なのか、具体例で考えてみましょう。
たとえば「ある生徒の前期5教科の平均点と、後期5教科の平均点を表示するプログラム」を作るとします。関数を使わずに書くと、こうなります。
first_scoresから各教科を取り出し、合計して5で割るsecond_scoresから各教科を取り出し、合計して5で割る処理が長くなるうえに、同じような計算を2回書いている。教科数が増えたら? 学期が増えたら? そのたびに似たコードが量産されていく…。
そこで登場するのが関数です。「5教科の点数を合計して5で割って返す」処理を関数として一度だけ定義しておけば、あとはaverage(first_scores)とaverage(second_scores)と呼び出すだけ。コードが短く・読みやすく・直しやすくなります🎯
Pythonで関数を定義するときは、defというキーワードを使います。書き方の型はとてもシンプル。
def 関数名(引数):
処理
return 戻り値
ここでよく出てくる2つの言葉を整理しておきましょう。
引数や戻り値が不要なら、その部分は書かなくてOK。逆に、両方とも複数設定することも可能です。定義した関数は関数名(引数)の形で呼び出して使います。
def print_banana():
print("banana")
print_banana()
# → banana
defのあとに関数名と()、コロンを書いて改行、そこから関数の中身を書いていきます。引数がなければ括弧の中は空でOK。呼び出すと「banana」と表示されるだけのシンプルな関数です🍌
def print_text(text):
print(text)
print_text("apple") # → apple
print_text("orange") # → orange
関数定義の(text)が引数。呼び出すときに渡した値がtextに入り、その中身をprintで表示します。同じ関数なのに、渡す値で結果が変わる──これが関数の柔軟さです🍎🍊
def question_text(text):
return text + "?"
result = question_text("apple")
print(result)
# → apple?
returnで値を返す関数。呼び出した側ではresult = question_text("apple")のように変数に受け取るのがポイントです。受け取った戻り値はそのままprintに渡したり、別の処理に使ったりできます💡
def qe_text(text1, text2):
return text1 + "?", text2 + "!"
r1, r2 = qe_text("apple", "banana")
print(r1) # → apple?
print(r2) # → banana!
引数を,で並べれば複数渡せますし、returnも,で区切れば複数の値を返せます。受け取る側もr1, r2 = ...のように書けば、それぞれの変数にスッと収まります🎁
関数には今回紹介した基本のほかにも、こんな発展トピックが待っています。
まずは今回の4パターンをしっかり手に馴染ませてから、上のトピックに進むと、迷子になりません🗺️
動画と合わせて手元に1冊あると、復習・応用がぐっとスムーズに。レベル別に厳選した書籍を紹介します📖
「defってそもそも何…?」というレベルから、対話形式でゆっくり学びたい方にぴったり。関数の必要性から呼び出しまで、図解中心で腹落ちしやすいです。
変数・条件分岐・繰り返し・関数までを一冊で網羅。引数・戻り値・スコープといった関連トピックも地続きで理解でき、つまずきが減ります。
言語の基礎だけでなく「プログラマーとしての考え方」までカバー。関数の設計を「どう切り出すか」まで踏み込んで学べる一冊です。
関数の引数バリエーション、デフォルト引数、可変長引数、型ヒントなど、「Pythonらしい関数」を書く力が身につきます。独学からの卒業に最適📈
関数設計の落とし穴と、保守しやすい書き方が項目別にまとまった名著。中級者を目指すなら、関数の章だけでも一読の価値ありです。
returnは必ず書かないとダメ?いいえ、不要なら省略OKです。何も返さない関数は内部的にNoneを返します。逆に、関数の途中でreturnを実行するとそこで関数は終了するので、早期リターンのテクニックとしても使えます。
同じにする必要はありません。関数定義側の引数名は、関数の中だけで通用するローカルな名前です。呼び出し側はあくまで「値」を渡しているだけなので、別の変数名から渡しても問題ありません。
実はPythonではreturn a, bと書くと、自動的にタプル(a, b)として1つの値が返されている状態です。受け取り側でx, y = func()のように書くと、タプルが自動的に展開(アンパック)されます。
判断の目安は「同じ処理を2回以上書きそうになったとき」と「1つの処理に名前を付けられそうなとき」。短くても、名前を付けると意図が明確になるので積極的に切り出すのがおすすめです🔧
はい、タイプアノテーションを使えばdef func(x: int) -> str:のように書けます。動作には影響しませんが、エディタの補完や静的解析が効くようになり、バグも減らせて一石二鳥です。
関数は、最初は少し難しく感じる単元ですが、defの書き方・引数・戻り値という3つのパーツが理解できれば、もう怖くありません。「引数なし・戻り値なし」から始めて「複数引数・複数戻り値」まで、4パターンを順番に手を動かして書いてみるのが上達への近道です✋
関数を味方につけた瞬間、あなたのコードは「動くだけのコード」から「読みやすく、再利用できるコード」へと進化します。今日から早速、似た処理を見つけたら関数化してみましょう。気づいたとき、あなたは確実に一歩、プログラマーらしくなっています🌟