1. はじめに
Pythonは、多くのプログラムで関数を使用しています。関数は、プログラム内で複数回実行される処理をまとめることができ、コードの見通しを良くし、コードの再利用性を高めることができます。本記事では、Pythonにおける関数の基本的な使い方について解説します。
2. ユーザー定義関数
2.1. ユーザー定義関数とは
Pythonでは、ユーザーが自分で関数を定義することができます。これを「ユーザー定義関数」と呼びます。
2.2. 関数を定義する方法
関数を定義するには、「def」キーワードを使用します。次のように書きます。
def 関数名(引数):
処理
例えば、2つの数値を足し合わせる関数を定義するには、次のように書きます。
def add(a, b):
return a + b
2.3. 関数を呼び出す方法
定義した関数を呼び出すには、次のように書きます。
関数名(引数)
例えば、上記で定義した「add」関数を呼び出すには、次のように書きます。
result = add(1, 2)
print(result)
この場合、関数「add」に引数として「1」と「2」を渡し、戻り値を変数「result」に代入しています。「print(result)」では、変数「result」の値を出力しています。実行すると、次のようになります。
3
3. 引数と戻り値
3.1. 引数とは
関数に引数を渡すことができます。引数とは、関数の実行に必要な値のことです。関数に引数を渡す場合、次のように書きます。
関数を実行した結果を返すことができます。これを「戻り値」と呼びます。戻り値を返す場合、「return」キーワードを使用します。次のように書きます。
def 関数名(引数1, 引数2):
処理
return 戻り値
例えば、2つの数値を引数として受け取り、足し合わせた結果を戻り値として返す関数を定義するには、次のように書きます。
def add(a, b):
return a + b
4. 引数の渡し方
4.1. 位置引数
関数に引数を渡す場合、位置引数を使用することができます。位置引数とは、引数の位置によって、どの引数がどの変数に渡されるかが決まる引数のことです。次のように書きます。
def 関数名(引数1, 引数2):
処理
例えば、2つの数値を引数として受け取り、足し合わせた結果を戻り値として返す関数を定義するには、次のように書きます。
def add(a, b):
return a + b
この場合、引数「a」には、関数呼び出し時に渡された1番目の引数が代入され、引数「b」には、関数呼び出し時に渡された2番目の引数が代入されます。例えば、次のように関数を呼び出すと、3が戻り値として返されます。
result = add(1, 2)
print(result) # 3
4.2. キーワード引数
関数に引数を渡す場合、キーワード引数を使用することができます。キーワード引数とは、引数をキーワードと値のペアで渡す方法のことです。次のように書きます。
def 関数名(引数1=default1, 引数2=default2):
処理
例えば、2つの数値を引数として受け取り、掛け算した結果を戻り値として返す関数を定義するには、次のように書きます。
def mul(a=1, b=1):
return a * b
この場合、引数「a」には、関数呼び出し時に渡された「a=1」の値が代入され、引数「b」には、関数び出し時に渡された「b=2」の値が代入されます。例えば、次のように関数を呼び出すと、2が戻り値として返されます。
result = mul(a=1, b=2)
print(result) # 2
4.3. 可変長引数
関数に可変長の引数を渡す場合、「*args」と「**kwargs」を使用することができます。「*args」は、複数の位置引数をタプルとして受け取ります。一方、「**kwargs」は、複数のキーワード引数を辞書として受け取ります。
def 関数名(*args, **kwargs):
処理
例えば、可変長の位置引数を受け取り、その合計を戻り値として返す関数を定義するには、次のように書きます。
def add_all(*args):
result = 0
for arg in args:
result += arg
return result
この場合、引数「*args」には、関数呼び出し時に渡された位置引数がタプルとして代入されます。例えば、次のように関数を呼び出すと、6が戻り値として返されます。
result = add_all(1, 2, 3)
print(result) # 6
5. 参照渡しと値渡し
関数に引数を渡す場合、Pythonでは、参照渡しと値渡しの2つの方法があります。
5.1. 参照渡し
参照渡しとは、引数として渡された変数のアドレスを渡す方法です。関数内で変数の値を変更すると、呼び出し元の変数の値も変更されます。
def 関数名(引数):
処理
例えば、引数として渡されたリストの先頭に「0」を追加する関数を定義するには、次のように書きます。
def add_zero(lst):
lst.insert(0, 0)
この場合、引数「lst」には、呼び出し元で定義されたリストオブジェクトのアドレスが渡されます。例えば、次のように関数を呼び出すと、元のリストも変更されます。
my_list = [1, 2, 3]
add_zero(my_list)
print(my_list) # [0, 1, 2, 3]
5.2. 値渡し
値渡しとは、引数として渡された変数の値を渡す方法です。関数内で
変数の値を変更しても、呼び出し元の変数の値は変更されません。
def 関数名(引数):
処理
例えば、引数として渡された整数を2倍にする関数を定義するには、次のように書きます。
def double(x):
x = x * 2
return x
この場合、引数「x」には、呼び出し元で定義された整数値がコピーされます。例えば、次のように関数を呼び出しても、元の変数の値は変更されません。
my_int = 5
double(my_int)
print(my_int) # 5
6. デフォルト引数
関数の引数には、デフォルト値を設定することができます。デフォルト値を設定することで、引数が省略された場合に、デフォルト値が使用されます。
def 関数名(引数1=default1, 引数2=default2):
処理
例えば、2つの数値を引数として受け取り、足し合わせた結果を戻り値として返す関数を定義するには、次のように書きます。
def add(a=0, b=0):
return a + b
この場合、引数「a」と「b」には、デフォルト値として0が設定されています。例えば、次のように関数を呼び出すと、0が戻り値として返されます。
result = add()
print(result) # 0
7.引数に型を指定するタイプヒント
7.1. タイプヒントとは
Python 3.5以降、関数の引数や戻り値に型を指定することができるようになりました。これを「タイプヒント」と呼びます。タイプヒントを使用することで、コードの可読性を向上させ、コードの品質を高めることができます。
7.2. タイプヒントを使用する利点
タイプヒントを使用する利点は、以下のとおりです。
- コードの可読性を向上させることができる。
- コードの品質を高めることができる。
- IDEなどのツールによる静的解析が可能になる。
- バグの早期発見や予防が可能になる。
また、タイプヒントは静的型付け言語の恩恵をPythonでも得られることを狙いとしているためより深くメリットについて知りたい場合は以下の記事も参考にしてみてください。
7.3. タイプヒントの書き方と使用方法
タイプヒントを使用する場合は、引数や戻り値の型をアノテーションする必要があります。アノテーションは、引数や戻り値の型を指定するために、「:」を使用します。
def 関数名(引数名: 型名) -> 型名:
処理
例えば、整数値を2倍にして返す関数を定義するには、次のように書きます。
def double(x: int) -> int:
return x * 2
この場合、引数「x」の型は「int」で、戻り値の型も「int」になっています。タイプヒントを使用した関数の場合、引数に期待する型以外の値を渡した場合には、実行時エラーが発生するため、コードの品質を高めることができます。
8. スコープとグローバル変数
8.1. スコープとは
スコープとは、変数や関数が参照可能な範囲のことを指します。Pythonでは、変数や関数を定義すると、その変数や関数は定義された場所から最も近いスコープで参照することができます。
8.2. グローバル変数とは
グローバル変数とは、どこからでも参照可能な変数のことを指します。Pythonでは、関数内でグローバル変数を参照する場合、global文を使用する必要があります。
8.3. グローバル変数の使用例
例えば、グローバル変数「count」を定義し、関数「increment」内で参照する場合、次のように書きます。
count = 0
def increment():
global count
count += 1
return count
この場合、関数「increment」内でグローバル変数「count」を参照するために、「global count」という文が必要になります。また、関数「increment」を実行することで、グローバル変数「count」の値が1ずつ増加し、戻り値として返されます。
print(increment()) # 1
print(increment()) # 2
print(increment()) # 3
なお、グローバル変数の使用は、プログラムの可読性や保守性を低下させる可能性があるため、適切に使用することが重要です。また、グローバル変数が多用される場合、名前の衝突や誤った値の参照などの問題が発生する可能性があるため、注意が必要です。
コメント