
関数は、英語で「function(ファンクション)」といい、『機能』と訳すよ。複数の処理を一つの機能としてまとめて名前をつけておくことで、その名前を呼ぶだけでいつでも使うことができるよ!!
構文はこんな感じ。関数の内容を書く部分と、実際に関数の機能を使う部分に分かれるよ!
# 関数の内容を書く部分
def 関数名():
関数の機能の内容
# 関数の機能を使う部分
関数名()
この、()の部分に何も書かなくていいの?という疑問は、後半で()の中に書くバージョンが出てくるのでご心配なく。まずは書かないバージョンをやってみよう。
試しに一つ関数を書いてみよう。
関数名をikemen()とします。(関数名は変数名と間違えないように、()をつけて表すのが普通です。)
# 関数の準備
def ikemen():
print("リッキーかっこいい")
print("リッキーイケメン")
print("リッキーステキ")
# 関数を実行する
ikemen()
# 実行結果
# リッキーかっこいい
# リッキーイケメン
# リッキーステキ
これで、ikemen()と書くだけで、これらの文章を全部書かなくても良くなるよ。なんだそれだけか、と言わずちょっと待って。関数はもっと便利な使い方ができるけど、とりあえずいったん練習してみよう。
以下の条件の関数を作って実行してみよう
関数名:hundred() ※hunderd = 100
機能:数字の100をprintする
引数は、関数をもっと便利にする使い方をするためのデータのこと。さっき気になっていた()の部分。
さっきのikemen()関数を見てみよう。いくらリッキーがイケメンだとはいえ、世の中ほかにもイケメンはいるよね。でもこのikemen関数は、だれが実行しても「リッキーイケメン」と表示されてしまうわけ。
そうじゃなくて、吉田さんが実行したら「吉田さんイケメン」、力さんが実行したら「力さんイケメン」と表示されるようにしたいよね。
改良したバージョンの関数を書いてみよう
# 関数の準備
def ikemen(namae):
print(f"{namae}かっこいい")
print(f"{namae}イケメン")
print(f"{namae}ステキ")
# 関数を実行する
ikemen("吉田")
# 実行結果
# 吉田さんかっこいい
# 吉田さんイケメン
# 吉田さんステキ
# 力さんかっこいい
# 力さんイケメン
# 以下略
print(f"")の書き方、覚えてる??(忘れた人はここをチェック!)
引数の仕組みを図にするとこうなる。
一番上の「きれいなジャイアン」の図を見てみよう。ドラえもんのあの道具、「きこりの泉」ていう名前らしい。(参考:きこりの泉)
この泉にジャイアンが落ちると、乱暴な性格もなおった、イケメンの「きれいなジャイアン」がでてくる、ていう道具(ほんとはちょっと違うけど)なんだけど、これを引数なしの関数にしてみると
def kikorino_izumi():
print("きれいなジャイアン")
kikorino_izumi()
という感じで、のび太が落ちようがスネ夫が落ちようが、無条件できれいなジャイアンが出てきてしまう道具になる。
これに引数をつけて
def kikorino_izumi(name):
print(f"きれいな{name}")
kikorino_izumi("リッキー")
# 出力結果
# きれいなリッキー
とすると、のび太が落ちた時はきれいなのび太、スネ夫が落ちた時はきれいなスネ夫がでるわけ。
※注1:実行した時に与えるデータそのもの(上でいうとこの”リッキー”) のことを引数と呼ぶ場合もあれば、引数についた名前(name)のことを引数と呼ぶ場合もある。まあ結果的に一緒だけどね。
※注2:nameというのは、変数みたいなものだけど、この関数の中でだけ使えて、外では使えない!このへんの違いがあるから、意識的に変数ではなく引数と呼ぶようにしよう!
関数名:plushundred() ※hunderd = 100
機能:引数で渡された数字+100の数字をprintする
引数名:number
今の状態では、関数は全部print文を使っているから、問答無用でprintされてしまうけど、実際のプログラミングでは、printというのは別の目的で使われることが多い。
printはあくまで、「今このプログラムうまく出来てるかな?printして確認しよう」という、確認(=デバッグ)のために使うことがほとんど。あくまでプログラミングの練習段階でprintすると結果がわかりやすいから使っているだけ。
関数に引数を渡して、その結果をprintせずに、その後のコードで使いたい場合はどうしたらいいか。そこで活躍するのが戻り値(もどりち) という考え方。(返り値=かえりち ともいうけど、「返り血」みたいで物騒な感じがするのでリッキーは「戻り値」派です。)
まずは、戻り値を使わない、printする関数を書いてみよう。
引数が「リッキー」だったら「イケメン」と返し、それ以外だったら「フツメン」と返すプログラムを書いてみよう。
namae = "リッキー"
def rickyOrNotRicky(name):
if name == "リッキー":
print("イケメン")
else:
print("フツメン")
rickyOrNotRicky(namae)
# 実行結果:イケメン
この関数の実行結果を、関数外ですこし加工して、「世界中の人は◯◯(namae)の顔は△△(実行結果)だと言っています」ていうふうにしてprintしたい場合、こうなる。
namae = "リッキー"
def rickyOrNotRicky(name):
if name == "リッキー":
result = "イケメン"
else:
result = "フツメン"
return result
face = rickyOrNot("リッキー")
print(f"世界中の人は{namae}の顔は{face}だといっています。")
return という新しいのがでてきたね。リターン、とよんで、テニスとか卓球とかで球を相手コートに返すことを言ったりするけど、「返す」とか「戻す」とかっていう意味。
イメージとしては、関数に引数のデータを渡したら、そこに結果が返ってくるイメージ。さっきのrickyOrNotRicky関数で、データの流れを図にしてみるとこんな感じ。rickyOrNotRicky("リッキー") というところで関数を呼び出しているんだけど、 そのrickyOrNotRicky("リッキー")自身に結果がreturnされてきて、 それ以降のプログラムで使えるようになる感じ。ここではfaceという変数に入れ直して使っているね。

関数とデータをキャッチボールしてる感じ。引数を投げたら、戻り値が戻って来る、みたいな。
話がややこしくなってきたので、取り合えす書いて覚えよう
課題①のコードを改良して、以下の関数を書いてみよう
関数名:plushundred() ※hunderd = 100
機能:引数で渡された数字+100の数字を計算して返す
戻り値の扱い:「〇〇に100を足したら△△(戻り値)」とprintする
引数名:number