関数#

関数は処理をまとめた再利用可能なコードです。

関数を使うことで、同じ処理を複数回実行する必要がある場合に、コードを簡潔に保ち、修正や更新も容易になります。

len()dict()などの組み込み関数は関数の例です。

関数の定義#

関数を定義するには、

  • defを使って、関数を定義することを示します。その後、関数名を指定し、関数に対する引数を括弧に囲んで書き、最後にコロン(:)を書きます。

  • 関数本体では、処理を実行するためのコードを書きます。関数内で変数を宣言することもできますが、関数外で定義された変数を使用することもできます。

  • returnキーワードを使用して、関数が返す値を指定します。returnを省略すると、関数は何も返しません。

def 関数名(引数1, 引数2, ...):
    処理1
    処理2
    ...
    return 戻り値

以下は、引数として2つの数値を受け取り、その和を返す関数の例です。

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

この関数を呼び出すには、以下のようにします。

result = add_numbers(3, 5)
print(result) # 8が出力される
8

Note

関数の命名規則 関数の命名は基本的には自由ですが、以下のような慣習があります。

  • 関数名は、その関数が何を行うかを明確にするために、できるだけ短く、分かりやすくするように心がけます。

  • 関数名は、英小文字で始めます。

  • 複数の単語を含む関数名の場合、単語の間にはアンダースコア_を使用します。

  • Pythonの組み込み関数と同じ名前を使用しないようにします。

返値#

関数は受け取った引数を元に処理を行い、その結果の返値を返すことができます。

返値は、return で定義します。 return が実行されると、関数の処理はそこで終了するため、次に文があっても実行はされません。

戻り値returnは単一の値や文字列に限らず、複数の値でも可能ですし、リストを返すことも出来ます。

関数の返値がない場合は、None が返されます。

ローカル変数とグローバル変数#

スコープ#

Note

変数のスコープについて 一般に、プログラミングではグローバル変数ローカル変数と呼ばれるものがあります。

その名(global/local)が示すとおりグローバル変数とはどこからでも参照できる変数で、ローカル変数とは、ある有効範囲のみで参照できる変数です。

関数で代入される変数は、どれもローカルスコープに代入されます。

ローカルスコープは、関数が呼び出された時に生成され、関数の引数から値を受け取ります。関数が終了するとローカルスコープは消します。

testfuncの中で定義されているa=10は、関数の内部で定義(代入)される変数であるため、ローカル変数とみなされて処理が行われるので、グローバル変数であるa=2に影響しないです。

def testfunc():
    a = 10
    print("関数の内部", a, id(a))
    
a= 2 
print("関数の実行前", a, id(a))
testfunc()
print("関数の実行後", a, id(a)) 
関数の実行前 2 4338586768
関数の内部 10 4338587024
関数の実行後 2 4338586768

同じモジュールスコープで定義されたグローバル変数は、関数の内側でも参照できます。また、関数の内側では、グローバル変数だけではなく、同じモジュールスコープで定義した別の関数も呼び出せます。

次の例では、関数 func2() は、先に定義された関数 func1() を呼び出しています。

def func1(name):
    print("Hello", name, ", this is func1.")

def func2():
    func1("func2")

func2()
Hello func2 , this is func1.

同様に、モジュールスコープで import したモジュールも、そのスコープで定義された関数から参照できます。

の例は、モジュールスコープで import した time モジュールを関数 print_time() 内で参照し、time.asctime() 関数を呼び出して現在の日付と時間を取得しています。

import time

def print_time():
    # モジュールスコープで import した timeモジュールを利用
    now = time.asctime()
    print("It is", now)
    
print_time()
It is Tue Apr 22 18:01:29 2025

引数#

関数を定義する際に、ヘッダの括弧の中に関数へ渡す値を引数と言います。

関数を呼び出す際に引数に値を渡すことで、関数は受け取った値を処理することができます。

キーワード引数#

上記の例では、事前に定義した引数の順番に従って、関数は引数を受け取っています。

キーワード付き引数(キーワード引数)を使うと、関数は引数の変数名とその値の組みを受け取ることができます。 その際、引数は順不同で関数に渡すことができます。

def minus_numbers(x, y):
    result = x - y
    return result
print(minus_numbers(10, 5))
5
print(minus_numbers(y=10, x=5))
-5

デフォルト引数値の指定#

デフォルト引数値は、関数の定義時に引数に初期値を指定することによって設定できます。これにより、関数を呼び出すときに引数の値を省略することができます。

デフォルト引数値を指定するには、引数リスト内で引数の名前の後ろに等号と初期値を指定します。例えば、以下のように関数を定義することができます。

def greet(name, message="Hello"):
    print(f"{message}, {name}!")
greet("Alice")         # "Hello, Alice!"
greet("Bob", "Hi")     # "Hi, Bob!"
Hello, Alice!
Hi, Bob!

被除数と除数を指定し、割り算の結果を順番に計算する関数を作成してください。

  • 計算結果を返します

  • 計算不可能の場合、「計算できません」というエラーを表示してください

ユークリッドの互除法の関数を作成してください。

  • 除数が\(0\)によるエラーを制御してください。

  • 引数に渡す値の大小関係を考慮してください

*による位置引数の分解・接合(タプル化)#

関数定義の中で引数の一部として*を使うと、可変個の位置引数がタプルにまとめられてその引数にセットされるようになる。

この機能は、関数に異なる数の引数を渡す時に便利です。

def sum_all_numbers(*args):
    result = 0
    for i in args:
        print(i) # argsの中身を確認
        result += i
    return result
sum_all_numbers(1,2,3,4,5)
1
2
3
4
5
15

**によるキーワード引数の分解・接合(辞書化)#

可変個のキーワード引数は、関数定義の中でキーワード引数の数が可変であることを指定する方法です。

2つのアスタリスク(**)を使えば、キーワード引数を1個の辞書にまとめることができます。 引数の名前は辞書のキー、引数の値は辞書の値になっています。

def print_kwargs(**kwargs):
    for key, value in kwargs.items():
        print(key, value)
print_kwargs(a=1, b=2, c=3)
a 1
b 2
c 3

Note

引数の順番 関数の命名は基本的には自由ですが、以下のような慣習があります。

  1. 位置引数 : 関数定義で明示的に指定された引数です。位置引数は、引数の順序に基づいて値が関数に渡されます。

  2. キーワード引数: 引数の名前と値をペアとして指定する引数です。キーワード引数は、引数の名前を指定して値を関数に渡すことができます。

  3. 可変個の位置引数: 位置引数として渡された値は、タプルとして関数内で利用できます。

  4. キーワード引数: キーワード引数として渡された値は、辞書として関数内で利用できます。

複数の商品とその価格を受け取り、価格の合計を計算する関数を作成してください。

def calculation():

    return total


calculate_total(apple=300, orange=400, banana=100)

ラムダ関数#

ラムダ関数は、簡潔な関数を一行で定義するための手法です。

関数を定義するための従来のdefキーワードを使用せずに、lambdaキーワードを用いて直接関数を記述します。

ラムダ関数の一般的な構文は以下の通りです:

lambda arguments: expression

ここで、arguments関数の引数を表し、expressionは引数を使って実行する式です。

# 2つの数値を加算するラムダ関数
add = lambda x, y: x + y
print(add(3, 5))
8
# 与えられた数が偶数かどうかを判定するラムダ関数:
is_even = lambda x: x % 2 == 0
print(is_even(4))  # 出力: True
print(is_even(7))  # 出力: False
True
False

整数のリストが与えられたとき、そのリストから偶数の要素のみをフィルタリングするラムダ関数を作成してください。

浮動小数点数のリストが与えられたとき、そのリストの要素の平均値を計算するラムダ関数を作成してください。