【Python】Python Cookbook, 3rd Edition での学習記録

 

可変長リストと可変長辞書型を引数に渡す

make_element.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*- 
"""
引数を使って HTML のタグと値を作成する。引用元は以下。
Python Cookbook, 3rd Edition. 2013.pdf 
7.1. Writing Functions That Accept Any Number of Arguments
"""
import html

def make_element(name, value, **attrs):
    keyvals = [' %s="%s"' % item for item in attrs.items() ]
    attr_str = ''.join(keyvals)
    element = '<{n}{a}>{v}</{n}>'.format(n=name, a=attr_str, v=html.escape(value))
    return element


if __name__ == '__main__':
    print(make_element('item', 'Albatross', size='large', quantity=6))
    # <item quantity="6" size="large">Albatross</item>
    print(make_element('p', '<spam>'))
    # <p>&lt;spam&gt;</p>

 

可変長リストを引数に渡す

mininum.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*- 
"""
整数型のリストから最小値を抽出する。引用元は以下。
Python Cookbook, 3rd Edition. 2013.pdf 
7.2. Writing Functions That Only Accept Keyword Arguments
"""
def mininum(*values, clip=None):
    m = min(values)
    if clip is not None:
        m = clip if clip > m else m
    return m

if __name__ == '__main__':
    print(mininum(-2, -1, 0, 1, 2))
    print(mininum(-2, -1, 0, 1, 2, clip=0 ))

 

関数に注釈を付ける

annotate.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*- 
"""
引用元は以下。
Python Cookbook, 3rd Edition. 2013.pdf 
7.3. Attaching Information Metadata to Function Arguments
"""
def add(x:int, y:int) -> int:
    return x + y;

if __name__ == '__main__':
    print(add.__annotations__)
    # {'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}
    print(add(2,3))

 

lambda 式による足し算式

def add と同じことを lambda の一行で実現している。

#!/usr/bin/env python3
# -*- coding: utf-8 -*- 
"""
引用元は以下。
Python Cookbook, 3rd Edition. 2013.pdf 
7.6. Defining Anonymous or Inline Functions
"""
def add(x:int, y:int) -> int:
    return x + y;

if __name__ == '__main__':
    cal_add = lambda x, y : x + y
    print(cal_add(2,3))
    print(add(2,3))

 

lambda 式による名前のソート

lambda_list.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*- 
"""
ファミリーネームをキーにして、辞書順に並び替える
引用元
Python Cookbook, 3rd Edition. 2013.pdf 
7.6. Defining Anonymous or Inline Functions
"""
if __name__ == '__main__':
    names = ['David Beazley', 'Brian Jones','Raymond Hettinger', 'Ned Batchelder']
    print(sorted(names, key=lambda name: name.split()[-1].lower()))
    # ['Ned Batchelder', 'David Beazley', 'Raymond Hettinger', 'Brian Jones']

 

lambda 式によるインクリメント

下記 lambda 式で lambda x : x+n for n in range(5) とすると 4 しか返らないので注意すること
lambda_imcrement.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*- 
"""
引用元。
Python Cookbook, 3rd Edition. 2013.pdf 
7.6. Defining Anonymous or Inline Functions
"""
if __name__ == '__main__':
    funcs = [lambda x, n=n: x+n for n in range(5) ]
    for f in funcs:
        print(f(0))