関数と引数

Python

関数は、複数回呼び出すことができるプログラムのブロックであり、特定のタスクを実行します。Pythonでは、defキーワードを使用して関数を定義します。

関数の定義

以下は、単純な関数の例です。この関数は、2つの引数を取り、それらを足し合わせた値を返します。

def add_numbers(x, y):
    return x + y

defキーワードを使用して、add_numbersという名前の関数を定義し、2つの引数xyを指定しました。関数本体では、returnキーワードを使用して、xyを足し合わせた結果を返します。

関数の呼び出し

関数を呼び出すには、関数名を指定し、引数を渡します。

result = add_numbers(5, 7)
print(result) # 12

この場合、add_numbers関数は、x5y7を渡され、その結果として12を返します。result変数には、add_numbers関数の戻り値が代入されます。

引数の種類

Pythonでは、以下の3種類の引数を関数に渡すことができます。

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

位置引数

位置引数は、引数の位置によって値が決まる引数です。上記の例では、add_numbers関数に2つの位置引数xyがあります。

result = add_numbers(5, 7)

この場合、5xに、7yに対応します。

キーワード引数

キーワード引数は、引数の名前によって値が決まる引数です。以下は、キーワード引数を使用して、同じ関数を呼び出す例です。

result = add_numbers(x=5, y=7)

この場合、引数の順序は関係ありません。代わりに、引数名を使用して各引数を明示的に指定します。

デフォルト引数

デフォルト引数は、関数を呼び出す際に値を指定しなかった場合に、デフォルト値が使用される引数です。以下は、デフォルト引数を使用して、関数を呼び出す例です。

以下はデフォルト引数の具体例です。

def greet(name="Anonymous"):
    print("Hello, " + name + "!")

greet("John")   # Output: Hello, John!
greet()         # Output: Hello, Anonymous!

可変長引数

可変長引数は、関数に可変数の引数を渡す方法です。Pythonでは、以下の2つの方法で可変長引数を扱うことができます。

*args

*argsを使うと、可変長の引数をタプルとして受け取ることができます。タプルとは、要素を変更できないリストのようなものです。以下は、*argsを使った可変長引数の例です。

def my_sum(*args):
    total = 0
    for num in args:
        total += num
    return total

result = my_sum(1, 2, 3, 4, 5)
print(result)  # 15

この例では、my_sum関数は可変長の引数をタプルとして受け取り、それらを合計した値を返します。

**kwargs

**kwargsを使うと、キーワード引数として渡された値を辞書として受け取ることができます。以下は、**kwargsを使った可変長引数の例です。

def my_func(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

my_func(name="John", age=30, city="New York")

この例では、my_func関数はキーワード引数として渡された値を辞書として受け取り、それらをforループで順に出力します。

*argsと**kwargsを組み合わせる

*args**kwargsを同時に使うこともできます。この場合、可変長の引数とキーワード引数を両方受け取ることができます。以下は、*args**kwargsを使った可変長引数の例です。

def my_func(*args, **kwargs):
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(f"{key}: {value}")

my_func(1, 2, 3, name="John", age=30, city="New York")

この例では、my_func関数は可変長の引数をタプルとして受け取り、キーワード引数を辞書として受け取ります。forループでそれらを順に出力します。

変数のスコープ

変数のスコープは、その変数がどの範囲で使用できるかを指します。Pythonには、グローバルスコープ(グローバル変数が使用可能な範囲)、ローカルスコープ(関数内の変数が使用可能な範囲)、および組み込みスコープ(Pythonによって提供される関数や変数が使用可能な範囲)の3つのスコープがあります。

global_var = "I am global"  # グローバル変数

def my_function():
    local_var = "I am local"  # ローカル変数
    print(local_var)
    print(global_var)

my_function()
print(global_var)

上記のコードは、関数内で定義された local_var は関数の内部でのみ使用でき、グローバルスコープの global_var は関数内外で使用できることを示しています。

ラムダ式

ラムダ式は、無名の関数を作成する方法です。ラムダ式は、lambda キーワードを使用して定義され、1つ以上の引数と1つの式から構成されます。式の結果がラムダ式の戻り値となります。

addition = lambda x, y: x + y
print(addition(3, 5))

上記のコードは、 addition 変数にラムダ式を代入し、その後、 addition 関数を呼び出して2つの引数を追加します。

イテレータ

イテレータ(iterator)とは、要素の集まりから順番に要素を取り出すことができるオブジェクトです。Pythonでは、イテレータは __next__() メソッドを持つオブジェクトとして定義されています。イテレータを使用することで、リストや辞書などの複数の要素を含むデータ構造から、1つずつ要素を取り出して処理を行うことができます。

イテレータの使い方

イテレータを作成するには、 iter() 関数を使用します。これにより、イテレータオブジェクトが生成されます。以下の例では、リストをイテレータオブジェクトに変換し、 __next__() メソッドを呼び出すことでリストの要素を1つずつ取り出しています。

# リストをイテレータに変換
my_list = [1, 2, 3]
my_iterator = iter(my_list)

# イテレータから要素を取り出す
print(next(my_iterator))  # 1
print(next(my_iterator))  # 2
print(next(my_iterator))  # 3

# イテレータの最後に到達したため、StopIterationが発生する
print(next(my_iterator))  # StopIteration

イテレータは、for文で簡単に使用することができます。以下の例では、リストの各要素に対して処理を行っています。

# for文でイテレータを使用する
my_list = [1, 2, 3]
for i in my_list:
    print(i)

ジェネレータ

Pythonのジェネレータ(generator)は、イテレータを簡単に作成するための強力なツールです。ジェネレータは、必要な時に必要なだけ要素を生成するため、イテレータと同じく非常に効率的です。

ジェネレータは、Pythonの関数と同じように定義されますが、一般的な関数と異なり、returnステートメントを使わずに、yieldステートメントを使って値を返します。

ジェネレータの定義

ジェネレータを定義するには、通常の関数と同じように、defキーワードを使用します。ただし、関数の本体内でyieldステートメントを使用することで、ジェネレータを作成できます。

def my_generator():
    yield 1
    yield 2
    yield 3

上記の例では、ジェネレータmy_generator()を定義しています。このジェネレータは、1, 2, 3の3つの値を生成するために3つのyieldステートメントを使用しています。このジェネレータは、次のように使用できます。

gen = my_generator()
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3

ジェネレータは、next()関数を使用して呼び出され、必要なだけ要素を生成します。最後に要素が生成された後にnext()関数を呼び出すと、StopIteration例外が発生します。

ジェネレータ式

ジェネレータは、リストや集合などのコンテナオブジェクトを生成するためのリスト内包表記のような構文であるジェネレータ式を使用しても生成することができます。

gen = (i * 2 for i in range(3))
print(next(gen)) # 0
print(next(gen)) # 2
print(next(gen)) # 4

上記の例では、ジェネレータ式を使用して0, 2, 4の3つの値を生成するジェネレータを作成しています。

デコレータ

デコレータとは

デコレータは、Pythonにおける関数やクラスに対する機能追加を可能にする仕組みです。Pythonのデコレータは、関数に引数として別の関数を渡し、渡された関数に対して機能を付加するためのものです。

デコレータを使うことで、既存の関数やクラスの機能を変更することなく、簡単に新しい機能を追加することができます。また、デコレータは関数を修飾することができるため、複数の関数に同じ機能を追加することができます。

デコレータの使い方

デコレータを使用する場合は、まずデコレータとなる関数を定義します。次に、デコレータとして追加したい機能を定義した関数を作成します。そして、デコレータ関数の引数にデコレータを追加したい関数を渡し、渡された関数に機能を追加する処理を実装します。最後に、デコレータを追加したい関数に対して、@デコレータ名のようにデコレータを記述することで、デコレータを追加することができます。

以下は、引数をログに出力するデコレータの例です。

def log(func):
    def wrapper(*args, **kwargs):
        print(f"Called {func.__name__} with args: {args}, kwargs: {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@log
def my_function(a, b):
    return a + b

result = my_function(1, 2)
print(result)

上記のコードでは、logというデコレータ関数を定義し、wrapperという新しい関数を定義しています。wrapper関数では、funcという引数に渡された関数を呼び出し、その前後にログ出力の処理を追加しています。そして、wrapper関数を戻り値として返します。

次に、my_functionという関数を定義しています。この関数に@logというデコレータを追加することで、my_function関数に対してログ出力の機能が追加されます。

最後に、my_functionを呼び出し、その結果をresultに代入し、resultを表示しています。このコードを実行すると、以下のような結果が表示されます。

Called my_function with args: (1, 2), kwargs: {}
3

コメント