Pythonの基礎 - 関数

提供:MochiuWiki : SUSE, EC, PCB
2021年11月24日 (水) 17:52時点におけるWiki (トーク | 投稿記録)による版 (文字列「</source>」を「</syntaxhighlight>」に置換)
ナビゲーションに移動 検索に移動

概要

関数は、よく使用する処理を手軽に実行することができるものである。

関数を呼び出すには、数値や文字列などの任意の引数を用意して実行する。そして、実行した結果を戻り値として返す。
この関数の結果を、他の処理や演算に利用することもできる。

また、Pythonには、予め組み込み関数というものが用意されている。Pythonの組み込み関数はこちらの公式サイトで確認できる。


関数

関数の定義

関数を作成するには関数名が必要である。
関数名は、変数の時と同様に使用できる文字が決まっている。

  • 小文字の英字(a-z)
  • 大文字の英字(A-Z)
  • 数字(0-9) ※ただし、関数の先頭文字としては使用できない
  • アンダースコア(_)


関数の作成

関数を定義するにはdef文を使用する。
def文に続けて関数名を記述した後、丸括弧()を記述する。丸括弧()の中には引数の定義を入れる場合もある。
文末にはコロンを記述する。また、関数のブロックはif文等と同様にインデントで字下げする。

<source lang="python">
def 関数名([引数の定義]):
    実行コード
</syntaxhighlight>


以下の例では、Hello!と返すSayHello関数である。

<source lang="python">
def SayHello():
    print("Hello!")

SayHello()

# 出力
Hello!
</syntaxhighlight>


上記のSayHello関数を変更して、引数に名前を入れてHello! <名前>を返す関数を作成する。

<source lang="python">
def SayHello(name):
    print("Hello!" + name)

SayHello("Python")

# 出力
Hello! Python
</syntaxhighlight>


組み込み関数の使用

組み込み関数を使用するには、関数名に丸括弧()を付けて呼び出す。

<source lang="python">
s = "Python"
print(len(s))

# 出力
6
</syntaxhighlight>



引数

位置引数

Pythonにおいて、関数の引数は複数指定できる。
先頭から順に引数の位置を対応させて渡されるのが位置引数である。
位置引数は、ここの引数の位置と意味を覚えておかないと正しく処理されないということに注意する。

<source lang="python">
def dinner_menu(food, drink, dessert):
    print("夕食は" + food + "を用意しています。")
    print("飲み物は" + drink + "をおすすめします。")
    print("デザートに" + dessert + "をどうぞ。")

dinner_menu("定食", "お茶", "ゼリー")

# 出力
夕食は 定食 を用意しています。
飲み物は お茶 をおすすめします。
デザートに ゼリー をどうぞ
</syntaxhighlight>


キーワード引数

キーワード引数とは、位置引数の混乱を避けるために、引数の名前を指定して使用する方法である。
キーワード引数は、関数実行時に引数に代入した形で関数を呼び出す。

上記の例を、キーワード引数を使用して実行する。

<source lang="python">
def dinner_menu(food, drink, dessert):
    print("夕食は" + food + "を用意しています。")
    print("飲み物は" + drink + "をおすすめします。")
    print("デザートに" + dessert + "をどうぞ。")

dinner_menu(food="定食", dessert="ゼリー", drink="お茶" )

# 出力
夕食は 定食 を用意しています。
飲み物は お茶 をおすすめします。
デザートに ゼリー をどうぞ
</syntaxhighlight>


また、位置引数とキーワード引数は、混在させて関数を呼び出すことができるが、位置引数を先に記述する必要がある。
以下の例のように、dinner_menu関数の先頭の引数がfoodなので、第1引数のfoodから記述している。
残りの引数は、キーワード引数を使用すれば順番は入れ替わっていても問題ない。

<source lang="python">
dinner_menu("定食", dessert="ゼリー", drink="お茶")
</syntaxhighlight>


デフォルト引数

デフォルト引数とは、関数を定義した時の引数に予め指定の値を入れておくことで、引数を指定せずに関数を呼び出した場合、その値で実行する引数である。
デフォルト引数の注意点は、リストや辞書をデフォルト引数に使用すると、操作を重ねる中でこれらを書き換えてバグに繋がることがあるので、使用しない方がよい。

以下の例では、引数を指定せずに関数を呼び出して、デフォルト引数の値で実行している。

<source lang="python">
def dinner_menu(food="定食", drink="お茶", dessert="ゼリー"):
    print("夕食は" + food + "を用意しています。")
    print("飲み物は" + drink + "をおすすめします。")
    print("デザートに" + dessert + "をどうぞ。")

dinner_menu()

# 出力
夕食は 定食 を用意しています。
飲み物は お茶 をおすすめします。
デザートに ゼリー をどうぞ
</syntaxhighlight>


また、引数を指定して呼び出すと、次のように結果を変更することができる。

<source lang="python">
dinner_menu("ハンバーグ", drink="赤ワイン", dessert="シャーベット")
</syntaxhighlight>



引数とアスタリスクでタプル化と辞書化

複数の引数をまとめて扱う方法がある。 それは、アスタリスク*を使用して位置引数をタプル化することと、キーワード引数を辞書化することである。 ここでは、このタプル化、辞書化のそれぞれの方法について記載する。

アスタリスク*で位置引数のタプル化

以下の関数が定義されているものとする。

<source lang="python">
def dinner_menu(food, drink, dessert):
    print(food)
    print(drink)
    print(dessert)
</syntaxhighlight>


上記の関数の3つの引数をタプル化して1つに纏めて記述する。
以下の例では、アスタリスク*を使用して*argsという引数で纏めている。(このargsは、Pythonで慣習的に指定されている)
*argsで引数が纏められて、それを変数argにfor文で順に取得して出力している。

<source lang="python">
def dinner_menu(*args):
    for arg in args:
        print(arg)

dinner_menu("定食", "お茶", "ゼリー")

# 出力
定食
お茶
ゼリー
</syntaxhighlight>


また、位置引数とタプルを使用して次のように記述することもできる。
以下の例では、関数の引数に位置引数と*argsを使用している。タプルtを作成して、関数を呼び出す時に*argsの位置にこのタプルを入れて実行している。

<source lang="python">
def dinner_menu(food, *args):
    print(food)
    for arg in args:
        print(arg)

t = ("お茶", "ゼリー")
dinner_menu("定食", *t)

# 出力
定食
お茶
ゼリー
</syntaxhighlight>


アスタリスク**でキーワード引数の辞書化

以下の関数が定義されているものとする。

<source lang="python">
def food(breakfast="パン", lunch="牛丼", dinner="定食"):
    print(breakfast, lunch, dinner)

food(breakfast="パン", lunch="チャーハン", dinner="ハンバーグ")

# 出力
パン チャーハン ハンバーグ
</syntaxhighlight>


この関数の定義の3つのキーワード引数を辞書として1つに纏めて記述する。
以下の例では、引数をアスタリスク**とkwargsで纏めている。(このkwargsは、Pythonで慣習的に指定されている)

<source lang="python">
def food(**kwargs):
    print(kwargs)

food(breakfast="パン", lunch="チャーハン", dinner="ハンバーグ")

# 出力
{'breakfast' : 'パン', 'lunch' : 'チャーハン', 'dinner' : 'ハンバーグ'}
</syntaxhighlight>


これは、以下のように、items関数を使用してキーと値を取得する形で記述することもできる。

<source lang="python">
def food(**kwargs):
    for k, v in kwargs.items():
        print(k, v)

food(breakfast="パン", lunch="チャーハン", dinner="ハンバーグ")

# 出力
breakfast パン
lunch チャーハン
dinner ハンバーグ
</syntaxhighlight>


また、以下のように、辞書型変数dicを作成してfood関数の引数**kwargsに渡すこともできる。

<source lang="python">
def food(**kwargs):
    for k, v in kwargs.items():
        print(k, v)

dic = {"breakfast" : "パン", "lunch" : "チャーハン", "dinner" : "ハンバーグ"}
food(**dic)

# 出力
breakfast パン
lunch チャーハン
dinner ハンバーグ 
</syntaxhighlight>



位置引数・タプル化・辞書化を全て組み合わせる

上記に記載した位置引数、タプル化、辞書化を全て組み合わせて使用する。

以下の例では、food関数の引数に、位置引数、*args、**kwargsを指定して順に出力している。
最初の引数は位置引数として、次の2つの引数はタプル化されて、次の2つのキーワード引数は辞書化されて、それぞれが対応している。
注意点は、第2引数*argsと第3引数**kwargsの順番を間違えるとエラーになるので順番を間違えないようにすること。

<source lang="python">
def food(breakfast, *args, **kwargs):
   print(breakfast)
   print(args)
   print(kwargs)

food("パン", "チャーハン", "定食", today="ステーキ", tomorrow="餃子")

# 出力
'パン'
('チャーハン', '定食')
{'today' : 'ステーキ', 'tomorrow' : '餃子'}
</syntaxhighlight>



コールバック関数

Pythonでは、変数に関数を代入したり、関数の引数として関数を定義したり、関数の戻り値として関数を返すことができる。
これにより、Pythonは他の言語では難しいことが行うことができる。

<source lang="python">
def hello():
    print("Hello, Python")

def CallbackFunc(callback):
   callback()

CalbackFunc(hello)

# 出力
Hello, Python
</syntaxhighlight>


関数内関数

関数は、他の関数を関数の中で定義することができる。

以下の例では、外側の関数とその中で定義される内側の関数を定義する。
ここでは、外側の関数名をOuterFunc、内側の関数名をInnerFuncとする。

外側の関数では、2つの引数を加算して、内側の関数では、2つの引数を加えて10倍して、それをprintで出力している。

<source lang="python">
def OuterFunc(a, b):
    def InnerFunc(c, d):
        return (c + d) * 10
    Outvalue = a + b
    InValue = InnerFunc(a, b)
    print(a, b, "OutValue =", OutValue, "InValue =" , InValue)

OuterFunc(3, 4)

# 出力
7
70
</syntaxhighlight>