【基本】Pythonの関数定義と基本機能について分かりやすく解説!

2022-08-03

Pocket

こんにちは、爽です。皆さん、いかがお過ごしでしょうか?

今回はPythonの関数定義と基本的な機能について確認します。
Pythonに限らず他言語でもそうですが、関数には大きく元々Pythonで用意されている関数と自分で関数を定義して作成する関数の2種類があります。今回は後者の自分で関数を定義して作成する方法についての解説です。

■この記事の対象読者
・Pythonに興味がある方
・Pythonを学び始めてみたい方

・Pythonの関数定義の詳細について知りたい方

なお、私はPythonをAnacondaをインストールしてJupyterで実行しています。MacのAnacondaのインストール方法とJupyterの使い方は下記記事にまとめているので良かったらご参考ください。

それではどうぞ!

関数とは

そもそも関数とはなんでしょうか。
様々な表現があると思いますが、私は関数を「何かの値を渡すと、その値を加工して何かしらの結果を返却してくれる機能」と捉えると分かりやすいと思ってます。

例えば高校数学でy = f(x)という式を習いますよね。
このfがまさに関数のことで、この関数fにxという値を渡すことで、xを加工することで何かしらの結果をyに返却しています。なので、関数とはこのfのようなものであるとイメージするといいと思います。
(結構感覚で書いてるので厳密には違うかもしれませんがあくまでイメージとして捉えてください。。)

Pythonの関数定義

基本形

Pythonで具体的に関数を定義する方法はdef 関数名():と書き、次の行にインデント(tabキー)を加えて、その関数が呼び出された場合に実行したい一連の処理を書きます。
また、定義した関数を実行したい場合は、関数名()と書きます。

def say_hello():
    print('hello')

#関数を実行
say_hello()
#>hello

#type関数
print(type(say_hello))
#><class 'function'>

#関数はfunctionオブジェクトであるので変数に格納し、その変数で関数を実行することもできる
f = say_hello
f()
#>hello

返り値を呼び出し元に返す

返り値を呼び出し元に返す場合は、関数の文末にreturnキーワードを書きます。
また、returnキーワードで返された返り値は変数に格納することができます。

def say_hello():
    word = 'hello'
    return word

#resultの中にreturnで返却された結果を格納
result = say_hello()
print(result)
#>hello

引数(パラメータ)

引数とはパラメータとも呼ばれ、関数実行時に渡す値のことです。y = f(x)でいうとxの部分ですね。
引数を用いることで関数で表現できる処理の幅はかなり広がるので必ず押さえておきましょう。

def say_something(word):
    #引数で渡された値を出力する
    print(word)
    
#関数実行時に引数を指定して関数を実行
say_something('hello')
say_something('good bye')

#>hello
#>good bye

また、Pythonでは引数のデータ型と返り値のデータ型の宣言ができます。
Pythonではあまりこのような書き方はされないようですが、いきなり出てきた時に驚かないようにここで押さえておきましょう。
なお、下記の下で記述したように宣言したデータ型以外も引数及び返り値として指定はできます。
ですので、この機能は開発者にその関数の引数のデータ型と返り値を明示するためにあって、強制力はありません。

#引数と返り値のデータ型の宣言
def add_num(a: int , b:int) -> int:
    return a + b

add_num(20,30)
#>50

#宣言したデータ型以外も引数及び返り値として指定可能。ただし分かりづらいのでこのような使い方は避けた方が無難
def add_num(a: int , b:int) -> int:
    return a + b

add_num('a','b')
#>'ab'

位置引数、キーワード引数、デフォルト引数

位置引数

引数が2つ以上ある場合、宣言されている引数の位置と実行時に渡される引数の位置は対応します。

def greeting(morning, noon, night):
    print('morning:', morning)
    print('noon:', noon)
    print('night:' ,night)

greeting('Good Morning', 'Good Afternoon', 'Good Evening')

#>morning: Good Morning
#>noon: Good Afternoon
#>night: Good Evening

従って、下記のように引数を指定する順番を間違えてしまうと意図しない結果となります。

def greeting(morning, noon, night):
    print('morning:', morning)
    print('noon:', noon)
    print('night:' ,night)

greeting('Good Afternoon', 'Good Morning', 'Good Evening')

#morningとnoonで出力したい結果が逆になっている
#>morning: Good Afternoon
#>noon: Good Morning
#>night: Good Evening

キーワード引数

直前でやったように引数を指定する順番の間違いを回避するためにはキーワード引数を使用する方法があります。
キーワード引数とは引数を指定する際に、どの引数に何を指定するかを明示する方法です。

def greeting(morning, noon, night):
    print('morning:', morning)
    print('noon:', noon)
    print('night:' ,night)

#順番が異なっていてもキーワード引数を使うことで意図した結果になっている
greeting(noon='Good Afternoon', morning='Good Morning', night='Good Evening')

#>morning: Good Morning
#>noon: Good Afternoon
#>night: Good Evening

位置引数とキーワード引数は混在させることができますが、下記のような使い方をするとエラーになるので、混在させる場合は気をつけてください。

def greeting(morning, noon, night):
    print('morning:', morning)
    print('noon:', noon)
    print('night:' ,night)

#noonにも引数を指定し、2番目の引数にも値を設定しているため、Pythonではエラーになる
greeting(noon='Good Afternoon', 'Good Morning', night='Good Evening')

#>   Input In [29]
#>     greeting(noon='Good Afternoon', 'Good Morning', night='Good Evening')
#>                                                                         ^
#> SyntaxError: positional argument follows keyword argument

デフォルト引数

デフォルト引数とは、引数に何も指定されなかった場合に予め何を指定するかを設定できる機能です。

def greeting(morning='Good Morning', noon='Good Afternoon', night='Good Evening'):
    print('morning:', morning)
    print('noon:', noon)
    print('night:' ,night)
    
greeting()

#>morning: Good Morning
#>noon: Good Afternoon
#>night: Good Evening

もし、関数実行時にデフォルト引数が設定されている位置に異なる引数が指定された場合は、関数実行時の引数が優先されます。

def greeting(morning='Good Morning', noon='Good Afternoon', night='Good Evening'):
    print('morning:', morning)
    print('noon:', noon)
    print('night:' ,night)
    
greeting(noon='Hello')

#関数実行時に指定した引数が優先される
#>morning: Good Morning
#>noon: Hello
#>night: Good Evening

デフォルト引数の注意点

デフォルト引数はかなり便利な機能ですので使用することが多いと思います。ただし、使用の際に気をつけるべきことがあります。それはリスト型や辞書型などの参照渡しのオブジェクトはデフォルト引数に指定すべきではないということです。
もしデフォルト引数で空のリストを設定すると下記のような意図しない挙動が発生し、不具合の温床となりますので注意しましょう。

#デフォルト引数で空のリストを設定
def test(x, l=[]):
    l.append(x)
    return l

r = test(100)
print(r)
r = test(100)
print(r)

#>[100]
#デフォルト引数で初期化されるはずなのに前の結果が残ってしまい、100が2つ追加されたリストが返却されている
#>[100, 100]

この事象はリスト型のlはtest関数を生成した際に1度だけ生成されており、関数実行のたびに初期化されるわけではない為に発生します。
これを回避するためには、関数の実行のたびにリスト型を生成するようにします。

def test(x, l=None):
    if l is None:
        l = []
    l.append(x)
    return l

r = test(100)
print(r)
r = test(100)
print(r)

#>[100]
#>[100]

位置引数のタプル化とキーワード引数の辞書化

位置引数のタプル化

引数がいくつ渡されるかがわからない場合、引数を1つずつ設定するのが手間ですよね。そのような場合は引数に*argsキーワードを用いることで引数を複数設定する手間を省くことができます。

def say_something(*args):
    for arg in args:
        print(arg)
    
say_something('Hello','1','Good Bye')

#>Hello
#>1
#>Good Bye

#*argsにはリスト型やタプル型も指定できる
t = ('Hello','1','Good Bye')
say_something(t)

#>('Hello', '1', 'Good Bye')

キーワード引数の辞書化

キーワード引数を関数で辞書化したい場合は、**kwargsキーワードを用います。
例えば下記のように辞書を大量に生成したい場合に使えると思います。

def human(**kwargs):
    for k, v in kwargs.items():
        print(k, v)
    print(kwargs)

human(sex='man', age='31', like='Uklele')

#>sex man
#>age 31
#>like Uklele
#>{'sex': 'man', 'age': '31', 'like': 'Uklele'}

参考資料

この記事はUdemyのPython+FlaskでのWebアプリケーション開発講座!!~0からFlaskをマスターしてSNSを作成する~という講座と現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルという2つの講座を参考にさせていただき、作成しました。

Python+FlaskでのWebアプリケーション開発講座!!~0からFlaskをマスターしてSNSを作成する~

Udemyより抜粋

当講座は最低限のWeb開発の知識を知っていることが前提とはなりますが、とにかくPythonの説明とFlask開発の為の説明が充実しているのでおすすめです。
28時間に及ぶ長丁場の講座にはなりますが、絶対に聞く価値がある講座です。
これをマスターすればPythonでどんなアプリケーションでも作ることができると思います。

当講座のおすすめポイントを以下にまとめておきます。

当講座のおすすめポイント

とにかく説明が充実している

Webアプリ開発におけるフレームワークがなぜ有益なのか知ることができる

セキュリティ対策、Ajaxなどの技術も知れる

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

画像に alt 属性が指定されていません。ファイル名: a1ee3d048d6aa860662b6f58c4aa167f-1024x328.png

当講座はPythonの基礎から応用まで幅広く学べる講座なのでおすすめです。
この講座の講師はとにかくPythonについての知識が豊富ですし、話も適度な速さで聞き取りやすいです。さすがのシリコンバレーです。
また、最後の方に機械学習で使うライブラリについても解説があるので、データサイエンス・AIについても多少知ることができます。

当講座のおすすめポイントを以下にまとめておきます。

当講座のおすすめポイント

シリコンバレーで働いているということもあり、講師のPythonの知識が豊富

話も適度な速さで聞き取りやすい

コードの意味だけでなく、それをどう応用するかまで解説してくれる

なお、Udemyについては以下の記事でまとめていますのでご参考ください。

まとめ

ということで、今回は関数定義と基本的な機能について解説しました。
自作の関数はどのようなアプリケーションを作成する場合もほぼ必須の技術となりますのでぜひ押さえていただければと思います。なお、関数は機能が多すぎてこの記事では全て触れられていませんので、また次の記事で触れたいと思います。
では、今回はここまでとさせていただきます。