関数

関数

Python ではdefキーワードを使って関数を定義します。関数を定義することで、よく似たような処理を何度も行いたくなったときに関数を定義すると、コードが読みやすくなり、また実行のコードを書くのも楽になります。また、コードに間違いがあり、修正することになったときに修正しやすくなったりと大変便利です。

今回は例としてnumbersリストにある値の2乗の値を新しいリストに格納するコードを作成します。

def square(): # 関数を定義する宣言
  numbers = [1,2,3,4,5] # リストの作成
  sq = [i**2 for i in numbers] # 作成したリストから2乗の値のリストを作成
  return sq

作成した関数を実行するには関数名を呼び出すコードを書きます。

square()
[1, 4, 9, 16, 25]

この関数squareは作成したリストから2乗の値のリストであるsqを戻り値として返しているので、これを別の変数に代入して保持しておくことができます。

a = square()
print(a)
[1, 4, 9, 16, 25]

注意すべき点としては、関数squareの中で定義されている変数numberssqはこの関数の中でのみ有効であるという点です。実際リストの説明の際に作成した変数numbersは変更されていません。また変数sqは関数外では定義されていないことが下のコードで確認することができます。

# numbersは変更されていない
print(numbers)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 変数 sq は定義されていない
print(sq)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-82-81145e174852> in <module>()
      1 # 変数 sq は定義されていない
----> 2 print(sq)

NameError: name 'sq' is not defined

これでは一見すると、2乗したい値のリストを変更して使いたいときに、関数の中でいちいち2乗したいリストを書き換えて実行しなくてはならないように思えます。この不便さを回避する関数の機能として「引数」があります。これにより、「与えられたリストの値を2乗する」という機能を持たせることができるようになります。実際にそのコードを作成してみます。

def new_square(numbers_list):
  sq = [i**2 for i in numbers_list]
  return sq  

このnew_square関数には引数が一つあります。それは関数内でnumbers_listと名付けられており、関数を呼び出す際に引数の値を指定することでこのnumbers_listに値を代入した上で関数内のコードが実行されます。実際にこの関数は下記のように使うことができます。

new_square(numbers)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

別の数のリストを作成して関数を実行することも確認しましょう。

new_numbers = [3,5,7,2]
new_square(new_numbers)
[9, 25, 49, 4]

これで、任意の数値のリストに対して2乗した値のリストを返す関数を作ることができました。しかし、2乗だけでなく時には3乗や4乗したの値のリストが欲しくなる場合があるかもしれません。その場合は引数にデフォルト値をつけて関数を定義すると便利です。例えば以下のようにコードを作成します。

def power(numbers_list, index=2):
  sq = [i**index for i in numbers_list]
  return sq

これをデフォルトのまま呼び出すには次のようにします。

power(new_numbers)
[9, 25, 49, 4]

2乗ではなく、3乗のリストを得るには次のようデフォルト値を上書きします。

power(new_numbers, 3)
[27, 125, 343, 8]