【Python】関数を使ってみよう!(2)

Pythonロゴ

前回掲載した関数を使ってみようの続きになります。

関数で便利な仕組み

クロージャー

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環境にアップしております。
下記からダウンロードいただけます。

参考 def2.py スクリプトGitHub python-beginner