😎

Pythonの初心者レッスンーーPythonの関数

2024/06/23に公開

シーリズの目次

Pythonの初心者レッスンをここにまとめています。
https://zenn.dev/datasciencekun/articles/319e0f4b4021c5

関数は組織化され、再使用可能であり、単一または関連する機能のコード・セグメントを実装することです。
関数はアプリケーションのモジュール性とコードの重複利用を向上させます。Pythonにはprint()のような多くの内蔵関数がありますが、自分で関数を作成することもできます。これはカスタム関数と呼ばれます。

関数の定義と呼び出し

Pythonで関数を定義するには、defキーワードを使用します。
関数の呼び出しとは、定義された関数を実際に使用することを指します。
関数の一般的な構文は次のとおりです:

def 関数名(引数1, 引数2, ...): # 引数はオプションだ
    """ ドキュメンテーション文字列 (オプション) """
    処理内容
    return 戻り値 # オプション

関数名(引数1, 引数2, ...) # 呼び出し


:

def hello() :
    print("Hello World!")

# 関数の呼び出し
hello() # 出力: Hello World!

例2:

# 関数の定義
def greet(name):
    """指定された名前の挨拶を表示する"""
    print(f"こんにちは、{name}さん!")

# 関数の呼び出し
greet("太郎")  # 出力: こんにちは、太郎さん!

例3:

# 面積の計算
def area(width, height):
    return width * height
 
def print_welcome(name):
    print("Welcome", name)

# 関数の呼び出し
print_welcome("Runoob") # 出力: Welcome Runoob
w = 4
h = 5
print("area =", area(w, h)) # 出力: area = 20

パラメータ

Python関数のパラメータとは、関数を定義する際に指定する入力変数のことを指します。関数に渡される具体的な値は「引数」と呼ばれます。パラメータにはいくつかの種類があり、それぞれ異なる方法で値を関数に渡すことができます。以下に、Python関数のパラメータについて詳しく説明します。

  1. 位置引数 (Positional Arguments)
    位置引数は、関数を呼び出すときに、引数をその順序で渡します。
def greet(name, message):
    print(f"{message}, {name}!")

greet("Alice", "Hello")  # "Hello, Alice!" を出力
  1. キーワード引数 (Keyword Arguments)
    キーワード引数は、関数を呼び出すときに、引数名を指定して渡します。
def greet(name, message):
    print(f"{message}, {name}!")

greet(name="Alice", message="Hello")  # "Hello, Alice!" を出力
greet(message="Hi", name="Bob")       # "Hi, Bob!" を出力
  1. デフォルト引数 (Default Arguments)
    デフォルト引数は、関数定義時にデフォルト値を設定することができます。関数呼び出し時に引数が渡されなかった場合、デフォルト値が使用されます。
def greet(name, message="Hello"):
    print(f"{message}, {name}!")

greet("Alice")           # "Hello, Alice!" を出力
greet("Bob", "Hi")       # "Hi, Bob!" を出力
  1. 可変長引数 (Variable-Length Arguments)
    可変長引数は、関数が任意の数の引数を受け取ることを可能にします。これは、*args と **kwargs を使用して実現されます。
  • *args
    *argsはタプルとして位置引数を受け取ります。
def greet(*names):
    for name in names:
        print(f"Hello, {name}!")

greet("Alice", "Bob", "Charlie")  # "Hello, Alice!", "Hello, Bob!", "Hello, Charlie!" を順に出力

アスタリスク*を付けたパラメータはタプルとして導入され、名前の付いていない変数パラメータがすべて格納されます。

# 例
def printinfo( arg1, *vartuple ):
   "print全ての引数"
   print ("出力: ")
   print (arg1)
   print (vartuple)
 
# printinfo関数の呼び出し
printinfo( 70, 60, 50 )

出力:

70
(60, 50)
  • **kwargs
    **kwargs は辞書としてキーワード引数を受け取ります。
def greet(**kwargs):
    for name, message in kwargs.items():
        print(f"{message}, {name}!")

greet(Alice="Hello", Bob="Hi")  # "Hello, Alice!", "Hi, Bob!" を順に出力

2つのアスタリスク**を付けたパラメータは辞書形式で導入されます。

# 例
def printinfo( arg1, **vardict ):
   "print全ての引数"
   print ("输出: ")
   print (arg1)
   print (vardict)
 
# printinfo関数の呼び出し
printinfo(1, a=2,b=3)

出力:

1
{'a': 2, 'b': 3}
  1. キーワード専用引数 (Keyword-Only Arguments)
    キーワード専用引数は、* を使ってそれ以降の引数をキーワード引数として指定することができます。
def greet(name, *, message="Hello"):
    print(f"{message}, {name}!")

greet("Alice", message="Hi")  # "Hi, Alice!" を出力
  1. 位置専用引数 (Positional-Only Arguments)
    位置専用引数は、スラッシュ (/) を使ってそれ以前の引数を位置引数として指定することができます。
def greet(name, message, /):
    print(f"{message}, {name}!")

greet("Alice", "Hello")  # "Hello, Alice!" を出力

例:すべてを組み合わせる
以下の例は、上記の異なる種類のパラメータを組み合わせたものです。

def display_info(name, age=18, *args, **kwargs):
    print(f"Name: {name}")
    print(f"Age: {age}")
    print("Additional arguments:", args)
    print("Keyword arguments:", kwargs)

display_info("Alice", 25, "Student", "Python Developer", city="Tokyo", hobby="Reading")

この例では、name と age は位置引数とデフォルト引数、"Student" と "Python Developer" は可変長引数 (*args)、city と hobby はキーワード引数 (**kwargs) として渡されています。

パラメータ渡し

Pythonにおけるパラメータ渡しで、可変(mutable)オブジェクトと不変(immutable)オブジェクトを理解することは非常に重要です。これらの違いは、関数内で引数として渡されたオブジェクトがどのように扱われるかに影響を与えます。

不変オブジェクト (Immutable Objects)

不変オブジェクトは、一度作成されると変更することができないオブジェクトです。代表的な不変オブジェクトには、次のようなものがあります:

  • 数値型(int, float, complex)
  • 文字列(str)
  • タプル(tuple)

不変オブジェクトを関数に渡すと、関数内でそのオブジェクトが変更されることはありません。ただし、同じ名前の新しいオブジェクトを作成することはできます。

def modify_immutable(x):
    print(f"Original: {x}, id: {id(x)}")
    x = x + 1
    print(f"Modified: {x}, id: {id(x)}")

a = 10
print(f"Before function call: {a}, id: {id(a)}")
modify_immutable(a)
print(f"After function call: {a}, id: {id(a)}")

出力:

Before function call: 10, id: 140714995801312
Original: 10, id: 140714995801312
Modified: 11, id: 140714995801520
After function call: 10, id: 140714995801312

この例では、整数 a が関数 modify_immutable に渡されますが、関数内で新しい整数オブジェクトが作成され、元の a には影響を与えません。

可変オブジェクト (Mutable Objects)

可変オブジェクトは、変更可能なオブジェクトです。代表的な可変オブジェクトには、次のようなものがあります:

  • リスト(list)
  • 辞書(dict)
  • 集合(set)

可変オブジェクトを関数に渡すと、関数内でそのオブジェクトが変更されると、呼び出し元のオブジェクトにもその変更が反映されます。

def modify_mutable(lst):
    print(f"Original: {lst}, id: {id(lst)}")
    lst.append(4)
    print(f"Modified: {lst}, id: {id(lst)}")

my_list = [1, 2, 3]
print(f"Before function call: {my_list}, id: {id(my_list)}")
modify_mutable(my_list)
print(f"After function call: {my_list}, id: {id(my_list)}")

出力:

Before function call: [1, 2, 3], id: 140714996329216
Original: [1, 2, 3], id: 140714996329216
Modified: [1, 2, 3, 4], id: 140714996329216
After function call: [1, 2, 3, 4], id: 140714996329216

この例では、リスト my_list が関数 modify_mutable に渡されます。関数内でリストに要素を追加すると、呼び出し元のリストも変更されます。

この違いを理解することで、予期せぬ副作用を避けることができ、より堅牢なコードを書くことができます。

戻り値

関数はreturnステートメントを使って値を返すことができます。returnがない場合、関数はNoneを返します。

def add(a, b):
    return a + b

result = add(3, 5)
print(result)  # 出力: 8

ラムダ関数

ラムダ関数は、名前を持たない小さな無名関数のことです。lambdaキーワードを使って簡潔に定義することができます。通常の関数と同じように、引数を取り、式を評価して結果を返しますが、関数名を持たず、単一の式しか含むことができません。

  • ラムダ関数の構文
lambda 引数1, 引数2, ... :

# 普通の関数の定義
def add(x, y):
    return x + y

# ラムダ関数の定義
add_lambda = lambda x, y: x + y

# 両方の関数の呼び出し
print(add(2, 3))        # 出力: 5
print(add_lambda(2, 3))  # 出力: 5
  • ラムダ関数の使用例
  1. 高階関数と一緒に使用:
    高階関数(例えば、map、filter、sortedなど)は、関数を引数として取ることができます。ラムダ関数は、このような場合に便利です。
numbers = [1, 2, 3, 4, 5]

# map関数と一緒に使用
squares = list(map(lambda x: x**2, numbers))
print(squares)  # 出力: [1, 4, 9, 16, 25]

# filter関数と一緒に使用
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 出力: [2, 4]

# sorted関数と一緒に使用(複数の条件でソート)
points = [(1, 2), (3, 1), (5, -1), (2, 0)]
sorted_points = sorted(points, key=lambda point: (point[0], point[1]))
print(sorted_points)  # 出力: [(1, 2), (2, 0), (3, 1), (5, -1)]
  1. 即席の簡単な関数:
    簡単な関数をすばやく作成したい場合に、ラムダ関数を使うと便利です。
# 二乗の計算をするラムダ関数
square = lambda x: x**2
print(square(5))  # 出力: 25

# 文字列を反転するラムダ関数
reverse = lambda s: s[::-1]
print(reverse("Python"))  # 出力: nohtyP
  1. 関数の引数として使用:
    ラムダ関数を他の関数の引数として渡すことができます。
def apply_function(func, value):
    return func(value)

result = apply_function(lambda x: x + 10, 5)
print(result)  # 出力: 15

Discussion