【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で関数と引数を定義する方法について入門者向けにソースコード付きでまとめました。

【引数定義】値・リストによって処理が異なる

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の要素は呼び出し元も変化しています。

【Python】関数に渡した値・配列の違い
この記事では、Pythonにおいて関数に渡した値・配列の違いをソースコード付きで解説します。

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

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

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

グローバル変数の例

x = 0                   # グローバル変数

def my_func():
    print(x)             # 参照することはできる
    global x            # global宣言
    x = 1              # global宣言すれば代入可能
【Python】ローカル変数とグローバル変数
ローカル変数とグローバル変数についてPython入門者向けにまとめました。
【Python】関数内でグローバル変数に値を代入して書き換える
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】コマンドライン引数の使い方(複数)
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)
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文の使い方
exec関数の使い方とサンプルコードをPython入門者向けにまとめました。

イテレータ(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関数)
イテレータ(iter・next関数)の使い方とサンプルコードをPython入門者向けにまとめました。

デコレータ@

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

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

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

main() # 前処理 > メイン処理 > 後処理
【Python】@デコレータの使い方
Pythonでデコレータを使う方法について入門者向けにまとめました。
【Python】特殊関数(exec、iter、next)の使い方
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‘:」はスクリプトファイルを将来的にモジュール化する場合や、自作モジュールの動作確認などに使います。

【Python】 if __name__ == '__main__': の意味・使い方
この記事では、Pythonのif name == 'main': の意味や使い方などについて紹介します。
【Python入門】使い方とサンプル集
Pythonとは、統計処理や機械学習、ディープラーニングといった数値計算分野を中心に幅広い用途で利用されている人気なプログラミング言語です。 主な特徴として「効率のよい、短くて読みやすいコードを書きやすい」、「ライブラリが豊富なのでサクッと...

コメント