In [7]:
# *による位置引数のタプル化
def show_args(*args):
    print('位置引数:', args)

show_args()
show_args(1,2,3,'テスト')

# **によるキーワード引数の辞書化
def show_kwargs(**kwargs):
    print('辞書引数:', kwargs)
    
show_kwargs(key1='値1', key2='値2', キー3='値3')


位置引数: ()
位置引数: (1, 2, 3, 'テスト')
辞書引数: {'key2': '値2', 'キー3': '値3', 'key1': '値1'}
渡された引数は'テスト1'です
渡された引数は'テスト2'です

In [8]:
# クロージャ
def return_closure(arg):
    def closure_function():
        return "渡された引数は'%s'です" % arg
    return closure_function

a = return_closure('テスト1')
b = return_closure('テスト2')

print(a())
print(b())


渡された引数は'テスト1'です
渡された引数は'テスト2'です

In [11]:
# ジェネレータ

def generator_range(first=0, last=10, step=1):
    number=first
    while number < last:
        yield number
        number+=step

ranger = generator_range(1,5)
for x in ranger:
    print(x)


1
2
3
4

In [5]:
# デコレータ(使わない場合)
# デコレータは、入力として関数をひとつ取り、別の関数を返す関数
def print_func(func):
    def new_function(*args, **kwargs):
        print('関数', func.__name__, 'を実行します。')
        print('位置引数は', args, 'です')
        print('キーワード引数は', kwargs, 'です')
        result = func(*args, **kwargs)
        print('実行結果は', result, 'です')
        return result
    return new_function

def add_ints(a, b, **dummy):
    return a+b

printer = print_func(add_ints)
print(printer(3,6, dummy='ダミー'))


関数 add_ints を実行します。
位置引数は (3, 6) です
キーワード引数は {'dummy': 'ダミー'} です
実行結果は 9 です
9

In [2]:
# デコレータ(使う場合)
def print_func(func):
    def new_function(*args, **kwargs):
        print('関数', func.__name__, 'を実行します。')
        print('位置引数は', args, 'です')
        print('キーワード引数は', kwargs, 'です')
        result = func(*args, **kwargs)
        print('実行結果は', result, 'です')
        return result
    return new_function

def square_it(func):
    def new_function(*args, **kwargs):
        result = func(*args, **kwargs)
        return result * result
    return new_function

@print_func
def add_ints(a, b, **dummy):
    return a+b

@print_func
@square_it
def add_ints2(a, b, **dummy):
    return a+b

print(add_ints(3,6, dummy='ダミー'))
print('------')
# こちらは実行結果が異なる
print(add_ints2(3,6, dummy='ダミー'))


関数 add_ints を実行します。
位置引数は (3, 6) です
キーワード引数は {'dummy': 'ダミー'} です
実行結果は 9 です
9
------
関数 new_function を実行します。
位置引数は (3, 6) です
キーワード引数は {'dummy': 'ダミー'} です
実行結果は 81 です
81

In [ ]: