Pythonにおける関数・引数の使い方(def)について入門者向けにまとめました。
【はじめに】関数・引数とは
関数とは、「処理のまとまり」のことです。
プログラムの規模が大きくなるほど、関数で処理を分けて記述した方が、効率的で分かりやすいコードを書くことができます。
中学数学や高校数学でも「1次関数」「2次関数」が出てきましたが、プログラムでも考え方はほとんど同じです。
例
例えば、次のような1次関数について考えます。
(1)
このとき、を関数、
を変数といいます。
この関数は、「変数xを2倍して1を加える処理をまとめたもの」と言えます。
一度そのような関数を定義しておけば
(2)
という風に処理を簡潔に記述できます。
プログラムの世界では、変数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では、関数の引数に渡した変数は、「値」か「リスト」によって次のように処理が異なります。
項目 | 概要 |
---|---|
値 | 関数に渡した値が変化しても、呼び出し元の変数には影響ありません。 |
リスト | 関数に渡したリストの要素が変化すると、呼び出し元のリストにも影響がでます。 |
そのため、リストを引数にして渡した場合、要素を変更したリストを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の呼び出し元の値は変化なしですが、リストlistの要素は呼び出し元も変化しています。

ローカル変数とグローバル変数のスコープ
スコープ(scope)とは、変数や関数などを参照できる範囲のことです。
この参照できる範囲の違いによって、変数はローカル変数とグローバル変数に別れます。
– | 説明 |
---|---|
ローカル変数 | ・関数の「内部」で定義された変数 ・関数内での「参照・代入ともに可能」 |
グローバル変数 | ・関数の「外部」で定義された変数 ・関数内で「参照は可能」 ・関数内で「代入は不可能」 ※代入したい場合は、「global」をつけて宣言する必要あり |
グローバル変数の例
x = 0 # グローバル変数 def my_func(): print(x) # 参照することはできる global x # global宣言 x = 1 # global宣言すれば代入可能


コマンドライン引数
コマンドライン引数とは、プログラムを実行するときに引数を渡すことができる機能です。
次のように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の値が表示

可変長引数(*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')

exec関数
exec関数とは、コードを動的に実行させる機能です。
書式
exec(object[, globals[, locals]])
– | 説明 |
---|---|
引数(object) | 文字列やオブジェクトを渡します。 |
execに渡した引数に渡した文字列やオブジェクトが実行されます。
サンプルコード
print関数を文字列で渡して実行されます。
exec(print(Hello)) # hello
ファイルオブジェクトを渡して、TXTファイルを開きます
f = open("data.txt") exec(f)

イテレータ(iter・next関数)
イテレータとは、リストなどのオブジェクトから、順番に要素を取り出す機能です。
サンプルコード
array = [1, 2, 3] a = iter(array) print( next(a) ) # 1 print( next(a) ) # 2 print( next(a) ) # 3
関数 | 処理内容 |
---|---|
iter関数 | リスト等のオブジェクトをイテレータに変換 |
next関数 | イテレータから要素を順に取り出す |

デコレータ@
デコレータ(装飾)とは、指定した関数の「前後に特殊な処理を実行させる」機能です。
使い方は簡単で、指定したい関数の上に「@デコレータ名」を付けます。
また、前処理と後処理をデコレータ関数に記述します。
# デコレータの定義 def decolater(func): def wrapper(): print("前処理") # 前処理の実行 func() # デコレート対象の関数を実行 print("後処理") # 後処理の実行 return wrapper @decolater # デコレート対象の関数 def main(): print("メイン処理") main() # 前処理 > メイン処理 > 後処理


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‘:」はスクリプトファイルを将来的にモジュール化する場合や、自作モジュールの動作確認などに使います。


コメント