【Python】関数・引数の使い方(def)

Pythonにおける関数・引数の使い方(def)について入門者向けにまとめました。

【はじめに】関数・引数とは

関数とは、「処理のまとまり」のことです。
プログラムの規模が大きくなるほど、関数で処理を分けて記述した方が、効率的で分かりやすいコードを書くことができます。
中学数学や高校数学でも「1次関数」「2次関数」が出てきましたが、プログラムでも考え方はほとんど同じです。

例えば、次のような1次関数について考えます。

(1) \begin{eqnarray*} f(x)=2x+1 \end{eqnarray*}

このとき、f(x)を関数、xを変数といいます。
この関数は、「変数xを2倍して1を加える処理をまとめたもの」と言えます。
一度そのような関数を定義しておけば

(2) \begin{eqnarray*} f(0)=1\\ f(1)=3\\ f(2)=5 \end{eqnarray*}

という風に処理を簡潔に記述できます。
プログラムの世界では、変数xのことを「引数」といいます。

【動画解説版】

【関数定義】呼び出し

Pythonでは、関数定義に「def 関数名:」を使います。
C言語のように関数に型を定義する必要はありません。

# -*- coding: utf-8
# 関数定義
def func():
  return 0

# 関数の呼び出し
x = func()

# 返り値を出力
print(x) # 0

■return文について
4行目にある「return」は関数を呼び出した時にreturnの右に記述した値を返します。
この返す値のことを「返り値」といいます。
このサンプルコードでは、「return 0」となっているので、func関数を呼び出すたびに常に0を返します。
そのため、変数xには0が代入されます。

【引数定義】関数に代入する値

引数とは、「関数に代入する値」のことです。
関数で処理させるのに必要なデータを渡す役割を持ちます。
関数同様、引数も型を定義する必要はありません。

書式

def 関数名(引数名1, 引数名2, ...):
# -*- coding: utf-8
# 関数定義
def func(a, b):
  c = a + b
  c = c * 2
  return c

# 関数呼び出し(1回目)
x = func(1, 2)

print(x)  # 6

# 関数呼び出し(2回目)
x = func(4, 5)

print(x)  # 18

上記のプログラムの場合、「関数の返り値は2つの引数を加算した値×2」となっています。
このように関数を定義しておけば、同じ計算式を2回も書く必要がなく、効率的で分かりやすい記述ができます。
計算式や処理が複雑になるほど、関数が便利になっていきます。

詳細
【Python】関数と引数の定義

【引数定義】値・配列によって処理が異なる

Pythonでは、関数の引数に渡した変数は、「値」か「配列」によって次のように処理が異なります。

項目 概要
関数に渡した値が変化しても、呼び出し元の変数には影響ありません。
配列 関数に渡した配列要素が変化すると、呼び出し元の配列にも影響がでます。

そのため、配列を引数にして渡した場合、要素を変更した配列をreturn文で返す必要はありません。

ソースコード

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-

# 関数の定義
def fanc(var, array):
    var = 10
    array[0] = 10 


var = 0
array = [0, 1, 2]

# 関数呼び出し
fanc(var, array)

print(var)   # 0
print(array) # [10, 1, 2]

変数varの呼び出し元の値は変化なしですが、配列arrayの要素は呼び出し元も変化しています。

詳細
【Python】関数に渡した値・配列の違い

【スコープ】ローカル変数とグローバル変数

スコープ(scope)とは、変数や関数などを参照できる範囲のことです。
この参照できる範囲の違いによって、変数はローカル変数グローバル変数に別れます。

説明
ローカル変数 ・関数の「内部」で定義された変数
・関数内での「参照・代入ともに可能」
グローバル変数 ・関数の「外部」で定義された変数
・関数内で「参照は可能」
・関数内で「代入は不可能
※代入したい場合は、「global」をつけて宣言する必要あり

グローバル変数の例

x = 0                   # グローバル変数

def my_func():
    print(x)             # 参照することはできる
    global x            # global宣言
    x = 1              # global宣言すれば代入可能
詳細
【Python】ローカル変数とグローバル変数

コマンドライン引数

コマンドライン引数とは、プログラムを実行するときに引数を渡すことができる機能です。
次のようにPythonファイルを実行すると、指定した引数を渡すことができます。

実行コマンド

python ファイル名 引数

プログラム

import sys

args = sys.argv

print(args) # 引数の値が表示

コマンドライン引数(複数)

複数のコマンドライン引数を渡す場合は次のようになります。

実行コマンド

python ファイル名 引数1 引数2 引数3

プログラム

import sys

args = sys.argv

print(args[0]) # 引数1の値が表示
print(args[1]) # 引数2の値が表示
print(args[2]) # 引数3の値が表示
詳細
【Python】コマンドライン引数の使い方(複数)

可変長引数(*args、**kwargs)

可変長引数とは、その名の通り「引数の個数が固定でなく可変である」ものです。
関数やメソッドを可変長引数にすることで「任意の数の引数を与える」ことができます。
Pythonには、2種類の可変長引数(*args、**kwargs)が用意されています。

*args

引数名の前にアスタリスク(*)を1つ付けると、可変長引数として定義されます。
下の実行例のように可変長引数に複数の値を入れると、「タプル」で関数やメソッドに引き渡されます。

def myfunc(*args):
    print(args) # ('hello', 'world', 1)
 
myfunc('hello', 'world', 1)

**kwargs

引数名の前にアスタリスク(*)を2つ付けると、可変長引数として定義されます。
ただし、先程の1つの場合と違って、「ディクショナリ型(辞書型)」で引き渡されます。

def myfunc(**kwargs):
    print(kwargs) # {'hello': 1, 'world': 'untan'}
 
myfunc(hello=1, world='untan')
詳細
【Python】可変長引数の使い方(*args、**kwargs)

【実行】exec関数

exec関数とは、コードを動的に実行させる機能です。

書式

exec(object[, globals[, locals]])
説明
引数(object) 文字列やオブジェクトを渡します。

execに渡した引数に渡した文字列やオブジェクトが実行されます。

サンプルコード

print関数を文字列で渡して実行されます。

exec(print(Hello)) # hello

ファイルオブジェクトを渡して、TXTファイルを開きます

f = open("data.txt")
exec(f)
詳細
【Python】exec文の使い方

【イテレータ】iter関数、next関数

イテレータとは、リストなどのオブジェクトから、順番に要素を取り出す機能です。

サンプルコード

array = [1, 2, 3]
a = iter(array)

print( next(a) ) # 1
print( next(a) ) # 2
print( next(a) ) # 3
関数 処理内容
iter関数 リスト等のオブジェクトをイテレータに変換
next関数 イテレータから要素を順に取り出す
詳細
【Python】イテレータの使い方(iter・next関数)

【デコレータ】@

デコレータ(装飾)とは、指定した関数の「前後に特殊な処理を実行させる」機能です。
使い方は簡単で、指定したい関数の上に「@デコレータ名」を付けます。
また、前処理と後処理をデコレータ関数に記述します。

# デコレータの定義
def decolater(func):
    def wrapper():
        print("前処理")   # 前処理の実行
        func()            # デコレート対象の関数を実行
        print("後処理")   # 後処理の実行
    return wrapper

@decolater
# デコレート対象の関数
def main():
    print("メイン処理")

main() # 前処理 > メイン処理 > 後処理
詳細
【Python】@デコレータの使い方
【Python】特殊関数(exec、iter、next)の使い方

if __name__ == ‘__main__’: の使い方

「if name == ‘main‘: 」は、「スクリプトファイルが直接実行された場合のみ実行する」という意味です。
直接以外の場合は実行されません。

name変数はPythonスクリプトを読み込む際に自動的に作成され、実行中のスクリプトのモジュール名が代入されます。
Pythonスクリプトを直接実行した場合、そのスクリプトファイルはmainモジュールとして扱われます。
そのため、name変数内にmainという値が代入されます。

実行例

def example():
    print('黒竜双剋勝利剣')

if __name__ == '__main__':
    example()

上記のプログラムを直接実行した場合、example関数が実行されるため、「黒竜双剋勝利」と表示されます。
その理由を細かくまとめると以下の通りになります。

処理の流れ
1 スクリプトファイルを直接実行する。
2 name変数が自動で生成される。
3 name変数に’main’が代入される。
4 if文の条件式が真になる。
5 example関数を実行する。
6 「黒竜双剋勝利」と表示される。

「if name == ‘main‘:」はスクリプトファイルを将来的にモジュール化する場合や、自作モジュールの動作確認などに使います。

【参考記事】if name == ‘main’: の意味・使い方

参考文献・関連記事
関連 【Python入門】サンプル集
関連記事