Python 関数

Pythonの関数

関数は、呼び出された時にのみ実行されるコードブロックです。

パラメータとして知られるデータを関数に渡すことができます。

関数は結果としてデータを返すことができます。

関数の作成

Pythonでは、関数はdefキーワードを使用して定義されます:

def my_function():
  print("関数からこんにちは")

関数の呼び出し

関数を呼び出すには、関数名の後に括弧を付けます:

def my_function():
  print("関数からこんにちは")

my_function()

引数

情報は引数として関数に渡すことができます。

引数は、関数名の後ろに括弧の中に指定します。カンマで区切って複数の引数を追加することができます。

次の例では、1つの引数(fname)を持つ関数があります。この関数が呼び出されるときに、最初の名前を渡し、関数内でフルネームを出力します:

def my_function(fname):
  print(fname + " Refsnes")

my_function("Emil")
my_function("Tobias")
my_function("Linus")

引数はPythonのドキュメントでしばしばargsとして短縮されます。

パラメータまたは引数?

パラメータと引数という用語は同じものを指します:関数に渡される情報。

関数の観点から:

パラメータは、関数の定義の括弧の内側にリストされる変数です。

引数は、関数が呼び出されるときに送信される値です。

引数の数

デフォルトでは、関数は正しい数の引数で呼び出す必要があります。つまり、関数が2つの引数を期待している場合、2つの引数で関数を呼び出す必要があります。

def my_function(fname, lname):
  print(fname + " " + lname)

my_function("Emil", "Refsnes")

関数を1つまたは3つの引数で呼び出そうとするとエラーが発生します:

def my_function(fname, lname):
  print(fname + " " + lname)

my_function("Emil")

任意の引数、*args

関数に渡される引数の数がわからない場合は、関数定義内のパラメータ名の前に*を追加します。

このようにして、関数は引数のタプルを受け取り、それに応じてアイテムにアクセスすることができます:

def my_function(*kids):
  print("最年少の子供は " + kids[2])

my_function("Emil", "Tobias", "Linus")

Pythonのドキュメントでは、任意の引数はしばしば*argsとして短縮されます。

キーワード引数

キー = 値の構文で引数を送信することもできます。

この方法では、引数の順序は重要ではありません。

def my_function(child3, child2, child1):
  print("最年少の子供は " + child3)

my_function(child1 = "Emil", child2 = "Tobias", child3 = "Linus")

キーワード引数というフレーズはPythonのドキュメントではしばしばkwargsとして短縮されます。

任意のキーワード引数、**kwargs

関数に渡されるキーワード引数の数がわからない場合は、関数定義内のパラメータ名の前に2つのアスタリスク**を追加します。

この方法で関数は引数の辞書を受け取り、それに応じてアイテムにアクセスすることができます:

def my_function(**kid):
  print("彼の姓は " + kid["lname"])

my_function(fname = "Tobias", lname = "Refsnes")

Pythonのドキュメントでは、任意のキーワード引数はしばしば**kwargsとして短縮されます。

デフォルトパラメータ値

次の例は、デフォルトパラメータ値の使用方法を示しています。

引数なしで関数を呼び出すと、デフォルト値が使用されます:

def my_function(country = "Norway"):
  print("私は " + country + " 出身です")

my_function("Sweden")
my_function("India")
my_function()
my_function("Brazil")

リストを引数として渡す

任意のデータ型の引数を関数に送信することができます(文字列、数値、リスト、辞書など)。関数に到達すると、それは同じデータ型として扱われます。

たとえば、リストを引数として送信すると、関数に到達するときもリストのままです:

def my_function(food):
  for x in food:
    print(x)

fruits = ["apple", "banana", "cherry"]

my_function(fruits)

戻り値

関数が値を返すようにするには、return文を使用します:

def my_function(x):
  return 5 * x

print(my_function(3))
print(my_function(5))
print(my_function(9))

pass文

関数定義には空にすることはできませんが、何らかの理由で内容のない関数定義がある場合は、エラーを避けるためにpass文を入れてください。

def myfunction():
  pass

位置引数のみ

関数に位置引数のみを持つことを指定することができます。または、キーワード引数のみを持つことを指定することもできます。

位置引数のみを指定するには、引数の後ろに , / を追加します:

def my_function(x, /):
  print(x)

my_function(3)

, / を追加しないと、関数が位置引数を期待していても、実際にはキーワード引数を使用できます:

def my_function(x):
  print(x)

my_function(x = 3)

, / を追加すると、キーワード引数を送信しようとするとエラーが発生します:

def my_function(x, /):
  print(x)

my_function(x = 3)

キーワード引数のみ

関数がキーワード引数のみを受け入れることを指定するには、引数の前に*を追加します:

def my_function(*, x):
  print(x)

my_function(x = 3)

*, を追加しないと、関数がキーワード引数を期待している場合でも、実際には位置引数を使用することができます:

def my_function(x):
  print(x)

my_function(3)

*, / を追加すると、位置引数を送信しようとするとエラーが発生します:

def my_function(*, x):
  print(x)

my_function(3)

位置引数のみとキーワード引数の組み合わせ

同じ関数内でこれら2つの引数タイプを組み合わせることができます。

/の前にある任意の引数は位置引数のみであり、*の後にある任意の引数はキーワード引数のみです。

def my_function(a, b, /, *, c, d):
  print(a + b + c + d)

my_function(5, 6, c = 7, d = 8)

再帰

Pythonは関数の再帰を受け入れることもできます。これは、定義された関数が自分自身を呼び出すことを意味します。

再帰は一般的な数学的およびプログラミングの概念です。これは、関数が自分自身を呼び出すことを意味します。これにより、データをループして結果に到達することができます。

開発者は、再帰は終了しない関数や、過剰なメモリやプロセッサパワーを使用する関数を書き込むのが比較的簡単であるため、非常に注意する必要があります。ただし、正しく書かれている場合、再帰は非常に効率的で数学的にエレガントなプログラミングアプローチとなります。

この例では、tri_recursion()は再帰的に呼び出す関数です。我々はk変数をデータとして使用し、それが0より大きい場合は(つまりそれが0でない場合)、再帰するたびに減少します。

再帰は、その条件が0より大きくない(つまり0である)場合に終了します。

新しい開発者にとっては、これが正確にどのように機能するかを理解するのに時間がかかる場合があります。これをテストして変更するのが最良の方法です。

def tri_recursion(k):
  if(k > 0):
    result = k + tri_recursion(k - 1)
    print(result)
  else:
    result = 0
  return result

print("\n\n再帰例の結果")
tri_recursion(6)