Python
プログラミング
python3
プログラミング学習

はじめに

  • 関数についておさらい

目次

  • 関数
  • 引数
  • 戻り値
  • 高度な引数利用
  • 関数オブジェクト
  • 関数のネスト
  • クロージャ
  • デコレータ
  • スコープ

関数

概要

  • 引数と呼ばれるデータを受取、定められた通りの処理を実行して結果を返す一連の命令群のこと
  • Pythonでは型の一つとして定義されている

関数の定義

  • defキーワードを利用して、関数名、関数に値を渡す引数名を定義する
  • 引数は省略可能
  • 戻り値は省略可能
構文
def function_name(args1, args2,...):
    処理
    [return 戻り値]
引数、戻り値なし
>>> def greet():
...     print('hello')
...
>>> greet()
hello
引数あり、戻り値なし
>>> def greet(hour):
...     if 6 <= hour < 12:
...             print('good morning')
...
>>> greet(10)
good morning
引数あり、戻り値あり
>>> def greet(hour):
...     if 6 <= hour < 12:
...             return 'good morning'
...
>>> print(greet(10))
good morning

高度な引数利用

引数のデフォルト値

  • 引数にデフォルト値を定義することができる
>>> def greet(hour=8):
...     if 6 <= hour < 12:
...             return 'good morning'
...     elif 12 <= hour < 18:
...             return 'hello'
...     else:
...             return 'good evening'
...
>>> print(greet())
good morning
>>> print(greet(14))
hello

キーワード付き引数

  • 引数名を指定して引数の値を渡すことができる
>>> def plus(x=10, y=0):
...     return x + y
...
>>> print(plus(y=199))
209
>>> print(plus(x=100, y=300))
400

可変長引数

  • 0個以上の引数をタプルで受け取る
  • 引数の前に*を付ける
>>> def plus(*args):
...     print(args)
...     result = 0
...     for val in args:
...             result += val
...     return result
...
>>> result = plus(10, 20, 30, 30)
(10, 20, 30, 30)
>>> print(result)
90

可変長キーワード付き引数

  • 0個以上のキーワード付き引数を辞書で受け取る
  • 引数の名前を指定して渡すことができる
  • 引数の前に**をつける
>>> def plus(**args):
...     print(args)
...     return args['a'] + args['b'] + args['c']
...
>>> result = plus(a=10, b=30, c=30)
{'a': 10, 'b': 30, 'c': 30}
>>> print(result)
70

関数オブジェクト

概要

  • 関数もオブジェクトと同様に利用することができる
記述例
>>> def plus(x, y):
...     return x + y
...
>>> def minus(x, y):
...     return x - y
...
>>> funcList = [plus, minus]
>>> for func in funcList:
...     print(func(1, 2))
...
3
-1
記述例(引数で利用)
>>> def calc(x=0, y=0, func=None):
...     if func is not None:
...             return func(x, y)
...
>>> def plus(x, y):
...     return x + y
...
>>> def minus(x, y):
...     return x - y
...
>>> result = calc(1, 2, plus)
>>> print(result)
3
>>> result = calc(1, 2, minus)
>>> print(result)
-1

関数のネスト

概要

  • 関数内に別の関数を定義することができる
記述例
>>> def calc(x, y):
...     z = 10
...     def plus(x, y):
...             print('x=' + str(x), 'y=' + str(y))
...             return x + y + z
...     print('z=' + str(z))
...     return plus(x, y)
...
>>> calc(1, 3)
z=10
x=1 y=3
14

クロージャ

概要

  • 関数オブジェクトの一種
  • 他の言語ではラムダ式や無名関数で実現している
記述例
>>> def calc(x, y):
...     def plus():
...             print(x + y)
...     return plus
...
>>> func = calc(1, 3)
>>> func()
4

デコレータ

概要

  • 関数定義時に関数を就職して新たな関数を作成すること
  • 複数の関数で共通な機能を作る時に利用される
記述例
>>> def calc(func):
...     def display(*args):
...             print('start')
...             print(func(*args))
...             print('end')
...     return display
...
>>> def plus(x, y):
...     return x + y
...
>>> calc(plus)(1, 2)
start
3
end
記述例(@シンボルの利用)
>>> def calc(func):
...     def display(*args):
...             print('start')
...             print(func(*args))
...             print('end')
...     return display
...
>>> @calc
... def plus(x, y):
...     return x + y
...
>>> plus(1, 2)
start
3
end

スコープ

変数のスコープ

  • プログラムに定義した変数の有効範囲

スコープの基本

  • 関数外で定義した変数は関数内で利用可能
  • 関数内で定義した変数は関数外では利用不可能
記述例①
>>> VALUE = 2
>>> def function1():
...     print(VALUE)
...
>>> function1()
2
記述例②
>>> def function1():
...     value = 1
...
>>> print(value)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'value' is not defined

グローバル変数の利用

  • 以下の例ではグローバル変数(VALUE)がローカル変数として扱われる
>>> VALUE = 2
>>> def function1():
...     VALUE = 1
...     print(VALUE)
...
>>> function1()
1
>>> print(VALUE)
2

グローバル変数の明示的な指定

  • グローバル変数に値を代入する場合、代入前に明示的な指定が必要
記述例
>>> VALUE = 2
>>> def function2():
...     global VALUE
...     VALUE = 1
...     print(VALUE)
...
>>> function2()
1
>>> print(VALUE)
1