Python

【Python】関数の作り方や呼び出し方を学ぼう

関数の作り方や呼び出し方を学ぼう Python

前回の記事でPythonの制御構文の繰り返し処理であるfor文とwhile文について学びました。

今回はPythonでの関数の定義方法やその作成ルール、実際の呼び出し方法を学んでいこうと思います。

だんだんプログラミングらしくなってきましたねぇ

この記事を読んで分かること
  • プログラミングにおける関数とは何かがわかる
  • Pythonでの関数の使い方が分かる
  • Pythonでの関数の定義の方法や可変長引数、ラムダ式などが分かる
スポンサーリンク

関数とは何か

そもそも関数ってなんでしょうか?

はい、まずはそこからですね。

関数とは、決まった処理を呼び出して実行できるようにまとめたものです。

例えば、プログラムは最初から最後まで上から順に1行づつ順番に実行していきますが、この「順番に実行していく」という処理から切り離して、必要に応じていつでも呼び出すことができます

例えば、よく使う処理をまとめて別の場所に置いておいて、必要な時に呼び出して使うイメージでしょうか

そうそう、ざっくりそんなイメージです。

関数の使い方

関数は、以下の要素で構成されています

  • 関数名:関数の名前、関数を呼び出す時に関数名を指定する。
  • 引数:関数内部で処理をするのに必要な値を渡すこと。
  • 戻り値(返り値):関数で処理した結果の値を受け取ること。

上記をプログラムで表すとこんな感じになります。

戻り値(返り値)= 関数名( 引数 )

引数は関数によってはない場合もありますし、逆に引数が複数あることもあります。
引数が複数ある場合は、カンマ区切りで引数を複数入力します。

で、この関数ですが実は既に使っています。

例えば、文字列をコンソールに出力する「print」はPythonで用意されている関数です。

hello = "こんにちは!"
print(hello)

これは「print」という関数に表示したい文字列を引数で渡すと、その文字列をコンソール上に出力するという処理が関数内で行われています

なので、print関数を使う側はコンソールに出力するという処理を気にすること無く、ただprint関数を呼び出すだけで良いのです。

これが、プログラムで関数を使う最大の理由です。
プログラマがある種めんどくさい処理を関数を使うことで切り離してプログラム作成できるからです。

また戻り値を使う関数として、リストの要素数を戻り値として返す「len」などがあります。

num = [1,2,3,5,7,11,13,17,19]

n = len(num)
print(n)      # 9

3行目でリストをlen関数の引数に渡して、その要素数を変数nに戻り値として代入しています。

キーワード引数

Pythonには引数にはもう一つ「キーワード引数」というものがあります。

これ結構使うので覚えておきましょう。

例えば先ほどのprint関数で以下のプログラムを書いたとします。

greeting = ["おはよう","こんにちは","こんばんは"]

for n in greeting:
    print(n)

こうするとコンソール上に以下のように一文一文改行して出力されます。

おはよう
こんにちは
こんばんは

ただ改行したくない場合、例えば間を開けて1行で出力したい場合はどうするか。

その場合に、以下のように記述します。

greeting = ["おはよう","こんにちは","こんばんは"]

for n in greeting:
    print(n, end=" ")

このように、print関数の引数に出力する変数「n」の後に引数として「end=” “」と書きます。

こうすると出力結果は以下になります。

おはよう こんにちは こんばんは

このように、「〇〇=値」という形で指定する引数を「キーワード引数」と言います。

このキーワード引数は省略可能で、指定しない場合は既に設定されている初期値が引数で渡されます

printのendで言うと「end=”¥n”」が初期値として設定されており、print関数呼び出しの際にendに何も設定しなければ出力時に改行されます。

この初期値が設定されている引数を変更したい場合は、キーワードを指定して値を設定し引数として関数に渡します

スポンサーリンク

関数の作成方法

では実際にプログラム上で関数を定義して、関数を呼び出してみましょう。

関数の定義

関数の基本的な定義は以下です。

def 関数名( 引数1, 引数2, …. ) :
    …実施する処理…

関数は先頭にdefを使って定義し、その後に関数名と引数を指定する()を使い最後にコロン「:」をつけます

引数がない場合は、引数を省略して関数名の後に()のみを指定します

改行後にインデントを開けて、関数の実施する処理を記述します

では、具体的に関数を定義してその関数を呼び出してみましょう。

def hello():
    print("こんにちは")

def greeding(name):
    print("やあ!"+name+"さん、こんにちは")

hello()
greeding("ふっか")

上記は引数のない関数「hello」と引数のある関数「greeding」の2つを定義して関数を呼び出しています。

上記を実行すると、以下となります。

こんにちは
やあ!ふっかさん、こんにちは

ちなみにPythonはインタプリタ言語で上から順に処理をしていきますので、必ず実施する関数が呼び出しよりも上にくる必要があります

hello()
greeding("ふっか")

def hello():
    print("こんにちは")

def greeding(name):
    print("やあ!"+name+"さん、こんにちは")

上記ですと1行目で関数が呼び出しよりも上で定義されていないためエラーとなります。

戻り値を利用する場合

上記は戻り値がない場合の関数定義でしたが、戻り値がある場合の関数を定義すると以下となります。

def 関数名( 引数1, 引数2, …. ) :
    …実施する処理…

    return 値

戻り値のある関数は、実行文の最後にreturnと書いて戻り値として返す値を記載します。

def greeding(name):
    ret = "やあ!"+name+"さん、こんにちは"
    return ret

word = greeding("ふっか")
print(word)

先ほどのプログラムを若干処理を変えて、関数で戻り値を返すように変更しました。

先ほどの関数は関数内で表示処理をしていましたが、表示する文字列を作成してその文字列を戻り値として返す関数としました。

こうすることで、呼び出しの際に関数内での処理結果をreturnを使って受け取ることが可能となります。

キーワード引数とデフォルト値

先ほど使ったキーワード引数を関数定義として設定してみましょう。

キーワード変数は既にデフォルト値が設定されており、呼び出し時に省略可能な引数でした。

def 関数名( キー1 = 値1 , キー2 = 値2, …. ) :
    …実施する処理…

引数の所に「キー = 値」という形で記述されていて、キーワードとその項目のデフォルト値を同時に定義しています

これにより、キーワード引数が省略された時に指定のデフォルト値が設定されます。

では、実際にキーワード引数を使った関数を定義して使ってみましょう。

def greeding(name = "名前",age = 0):
    print("名前:"+name)
    print("年齢:"+str(age))
    print("----------------")

greeding(name = "ふっか")
greeding(age = 40)
greeding(name = "みどり",age = 10)
greeding()

これらを実行すると以下となります。

名前:ふっか
年齢:0
----------------
名前:名前
年齢:40
----------------
名前:みどり
年齢:10
----------------
名前:名前
年齢:0
----------------

上記からキーワード引数を指定した場合は、その指定した引数を使って出力されていることがわかります。

また、キーワード引数を指定しなかった場合は、関数で定義したデフォルト値で引数が設定されていることがわかります。

スポンサーリンク

【参考】その他の関数について

以上が関数を定義する基本的な方法でしたが、ここからは参考までにこういった関数定義もできるよという例として簡単に触れておきます

なので無理に覚えなくても大丈夫です、こんなのがあるんだーくらいで見ておいて下さい

可変長引数

多数のデータを引数として関数に渡したい場合、引数の数を好きなだけ自由に関数に渡すことが出来ます。

これを可変長引数と言います。

つまり、呼び出し側で引数を好きな数だけ渡すことが出来ます。

def 関数名( *引数 ) :
    …実施する処理…

可変長引数は、仮引数の変数名にアスタリスク「*」をつけて記述します。

これにより、引数が全てタプルとしてまとめられ、いくつ引数を指定しても関数側で扱えるようになります

ちなみに呼び出す側は*は使いません

では簡単な例を挙げてみます。

def numsum(*arg):
    nsum = 0
    sstr = ""
    for i in arg:
        sstr += str(i)+"+"
        nsum += i
    print(sstr[:-1]+"="+str(nsum))

numsum(4,3,7,8,4,6,5,3,2,4,6)
numsum(50,100,35,95,33)

1行目の関数定義の引数に「*arg」となっており、引数を可変長で受け取れることを示しています。

あとは引数で来た数字をタプルとしてfor文で回して、足し算の式を文字列で作ります。

7行目で足し算の最後の文字列「+」を削除して、代わりに「=」と合計値を表示しています。

これらを実行すると以下となります。

4+3+7+8+4+6+5+3+2+4+6=52
50+100+35+95+33=313

ですがこれリストを使って代用できるし、なんならそっちの方がスマートです。

def numsum(nlist):
    nsum = 0
    sstr = ""
    for i in nlist:
        sstr += str(i)+"+"
        nsum += i
    print(sstr[:-1]+"="+str(nsum))

list1=[4,3,7,8,4,6,5,3,2,4,6]
list2=[50,100,35,95,33]
numsum(list1)
numsum(list2)

なので好みかも知れませんが、あまり関数としては使うことはないかと思います。

ラムダ式

ラムダ式は説明するのがやや難しいのですが、簡単に言うと

  • 1行で書ける関数
  • 関数を変数に代入出来る

という感じで、関数にするまでもない処理をラムダ式で書いて変数に入れてあたかも関数を呼び出している感じに処理をします

いやいや、なんのこっちゃ

ですよねー、説明するより見た方が早いかも。

lambda 引数 : 実行する文

では具体的に見ていきましょう。

fun = lambda x,y : print(str(x)+"×"+str(y)+"="+str(x*y))

fun(1,2)
fun(55,13)
fun(132,123)

1行目でラムダ式の関数を変数funに代入しています。

関数の戻り値を変数に代入しているわけではなくて、関数そのものを変数に代入しています

なので、代入した変数に引数を指定してラムダ式の関数を呼び出しています

実際の処理は1行目のラムダ式のコロンの後に定義している、引数の2つの数字を掛け算するという処理になります。

なので実行した結果は以下。

1×2=2
55×13=715
132×123=16236

こういった関数を定義するまでもないような処理の場合に、ラムダ式を使って関数を定義し変数に入れて変数で引数を指定することで関数を実行します

ただし、これも実際は関数を作れば良いことなので、特に今の段階では無理して覚える必要はないです

ちなみに、上記のラムダ式を関数で定義すると以下となります

def fun(x,y):
    print(str(x)+"×"+str(y)+"="+str(x*y))

fun(1,2)
fun(55,13)
fun(132,123)

結果も全く同じですので、わからないうちは関数で定義して処理をする方が良いかと思います。

スポンサーリンク

まとめ

以上、Pythonでの関数の利用方法と、実際の関数の定義方法や色々な種類の関数について説明しました。