第5章 演習課題

注釈

以下の課題はJupyter Notebookの使用を前提としているが,もちろん他の実行環境でも同等の処理を実現出来ていれば問題ない.

課題1

サンプルを実行して動作を確認しよう.

課題2

tupleの便利な使い方として関数の引数の扱いが挙げられる.

>>> def f(*args):
...     print(args) # 全ての引数を出力

のように引数に * を指定すると,それ以降に与えた引数は全てtupleとして引数(この場合は args )に格納される.これは多数のあらかじめ個数の分からない引数を受け取るために使われる.これは位置指定引数(positional argument)などと呼ばれる.

任意の個数・任意の型の引数を受け取り,受け取った全ての引数を出力する print_args 関数を作成せよ.例えば以下のような結果が得られればよい.Pythonの任意のオブジェクトを文字列表現に変換する str 関数を用いること.

>>> print_args('hello', (1, 2, 3), [], {'key' : 'val'}, None)
args[  0] = hello
args[  1] = (1, 2, 3)
args[  2] = []
args[  3] = {'key': 'val'}
args[  4] = None

なお,あらかじめ定義されているtupleを関数に渡すときに * を使って

>>> a = (0, 1, 2)
>>> print_args(*a)

のように渡すこともできる.これも使えるようになると便利である.

課題3

任意のlistを受け取りそこから重複するものを除いた新たなlistオブジェクトを返す関数 unique を作成せよ.ただし重複するもの以外の順番は保持するものとする.例えば以下のような結果が得られればよい.(やり方は色々あるが素直にループで処理する方法を考えてみよう.)

>>> unique(['a', 1, 'b', 2, 'c', 1, 2, 3, 'b', 'd', 'a', 3])
['a', 1, 'b', 2, 'c', 3, 'd']

課題4

dictは関数のキーワード引数を受け取るときに用いると便利である.

>>> def f(**kwargs):
...     print(kwargs)

のように引数に ** を指定すると,それ以降の任意のキーワード引数がdictとして引数(この場合 kwargs )に格納される.

任意個数のキーワード引数の引数名(キー)とその値を出力する関数 process_kwargs を作成せよ.ただし,引数 a, b は必ず与えられるものとし,もし与えられなかった場合にはデフォルトでNoneを出力するものとせよ.また引数名で辞書順にソートして出力せよ.

>>> process_kwargs(a='hi', c='chao', x=10, y=20, z=30)
a hi
b None
c chao
x 10
y 20
z 30

なお,あらかじめ定義されているdictを関数に渡すときに ** を使って

>>> a = {'a' : 'hi', 'c' : 'chao', 'x' : 10, 'y' : 20, 'z' : 30}
>>> print_kwargs(**a)

のように渡すこともできる.さらに,位置指定引数と合わせて

>>> def f(*args, **kwargs):
...     print(args)
...     print(kwargs)

のように使うことも可能である.注意すべきは必ず 位置指定引数の方がキーワード引数より先になければならない という点である.

課題5

JSON(JavaScript Object Notation)は特にウェブを介したデータのやり取りによく使われるデータの記述形式である.例えば以下は JSON GENERATOR というサイトで作ったダミーのJSONデータの抜粋である.このようにJSONはPythonのlistとdictを組み合わせたような形式で書かれている.

このようなJSON形式のデータはPython標準の json モジュールを用いることで非常に簡単に扱うことができる.ここでは実際にこのJSON文字列データからfirst nameとlast nameおよびemailを取り出して表示する関数 process_json1 を作成せよ.この例のJSON文字列をコピーアンドペーストで json_string という変数に格納し,実行すると以下のような結果が得られる.

>>> process_json1(json_string)
Hickman MORALES <hickman.morales@electonic.cg>
Emerson NORRIS <emerson.norris@recrisys.sj>
Shelly GARZA <shelly.garza@signity.mw>
Rhoda OWENS <rhoda.owens@kidgrease.cn>
Florence DODSON <florence.dodson@musanpoly.cy>

注釈

json.loads(json_string) によってJSON文字列をlistに変換することができる.listの各要素がdictオブジェクトになっているので,それらを逐一処理していけばよい.

課題6

課題5で扱ったJSON文字列から個人を特定できる情報を削除したJSON文字列を返す関数 process_json2 を作成せよ.例えば以下のような結果が得られればよい.

>>> print(process_json2(json_string))
[
  {
    "age": 28,
    "index": 0,
    "company": "Electonic",
    "favoriteFruit": "apple"
  },
  {
    "age": 59,
    "index": 1,
    "company": "Recrisys",
    "favoriteFruit": "strawberry"
  },
  {
    "age": 47,
    "index": 2,
    "company": "Signity",
    "favoriteFruit": "orange"
  },
  {
    "age": 30,
    "index": 3,
    "company": "Kidgrease",
    "favoriteFruit": "strawberry"
  },
  {
    "age": 18,
    "index": 4,
    "company": "Musanpoly",
    "favoriteFruit": "banana"
  }
]

注釈

json.dumps(object, indent=2) によって与えられたオブジェクトをJSON文字列に変換することができる.ここで引数indentに与える数値は文字列にしたときのインデント数である.