前回掲載した関数を使ってみようの続きになります。
目次
関数で便利な仕組み
クロージャー
def outer_function(x, y):
def inner_function():
return x + y
return inner_function
outer = outer_function(1, 3)
print(outer())
# 結果 4
ECサイトの商品金額に消費税を追加する処理にクロージャーを使用すると下記のようになります。
def tax_price(tax_rate):
def tax_calculation(price):
return int(price + (tax_rate * 0.01) * price)
return tax_calculation
# 消費税の率は 10% に設定
tax_func = tax_price(10)
print(tax_func(100)) # 100円の商品
print(tax_func(200)) # 200円の商品
# 結果
# 110
# 220
デコレータ
def deco(func):
def wrapper(*args, **kwargs):
print('--start--')
func(*args, **kwargs)
print('--end--')
return wrapper
# 指定の関数にデコレータで追加処理を行う
@deco
def text_print(text):
print(text)
text_print('abc')
# 結果
# --start--
# abc
# --end--
ラムダ
lists = [1, 2]
def num_multiply(lists, func):
for num in lists:
print(func(num))
def multiply(num):
return num * 10
num_multiply(lists, multiply)
# ラムダで関数multiplyを作成しなくてもよくなる
num_multiply(lists, lambda num: num * 10)
# 結果
# 10
# 20
# 10
# 20
ジェネレーター
def texts():
yield 'aaa'
yield 'bbb'
yield 'ccc'
g = texts()
print(next(g))
# nextを使うことで次の要素が返ります
print(next(g))
# nextを使うことで次の要素が返ります
print(next(g))
# 結果
# aaa
# bbb
# ccc
名前空間とスコープ
Pythonには要素を保管している空間が複数あり、グローバルとローカルの2種類に分かれています。ローカルの空間は関数単位で作成されます。
空間は独立した枠のような物になるためローカルA, ローカルBの2つがあった場合、設定が無い場合お互いの変数は参照・変更する事ができません。
スコープは変数がどの空間まで有効か範囲をあらわします。
グローバル変数を関数内で参照
text1 = 'abcde'
def func1():
print(text1) # printで出力
func1()
print(text1) # printで出力
# 結果
# abcde # 関数内の変数
# abcde # グローバルの変数
グローバル変数を関数内で変更(失敗)
text2 = 'abcde'
def func2():
text2 = 'ABCDE' # 変数書き換え
print(text2) # printで出力
func2()
print(text2) # printで出力
# 結果
# ABCDE # 関数内の変数は変更されます
# abcde # グローバルの変数は変更されず
グローバル変数を関数内で変更(成功)
text3 = 'abcde'
def func3():
global text3 # text3はグローバルですよ!
text3 = 'ABCDE' # 変数書き換え
print(text3) # printで出力
func3()
print(text3) # printで出力
# 結果
# ABCDE # 関数内の変数は変更されます
# ABCDE # グローバル変数は変更されます
まとめ
今回は関数に関して確認をしました。
次回は例外処理に関して確認をしていきます。
サンプルプログラム
こちらの記事で作成したプログラムはGitHub環境にアップしております。
下記からダウンロードいただけます。