Python.use(better) #range: step04x -- def myrange(*args):
‖記事一覧‖ Python.use(better)《Python3.1》
range: 04x -- def myrange(*args):
《著》森こねこ、小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28
組み込み関数と同等の機能を実現する過程を通して「関数」の理解を深めます。
※ Python1.5 で作成した例題を、Python3.1 で再構成しました。
事例:コードの解説
《 前ステップ 》で規定した関数が、任意の引数に対処できるようにします。
def myrange(*args):
if len(args)==1:
c,n = 0,args[0]
else:
c,n = args
s = []
while c < n:
s.append(c)
c += 1
return s
■ #1: 可変長の引数
def myrange(*args): if len(args)==1: c,n = 0,args[0] else: c,n = args
「*」に続く引数 args は、任意の位置引数を列挙したリストを保持します。
- 引数を1つ指定したときには、変数 c に規定値 0 を設定します。
- 引数を2つ指定したときには、各引数を順に変数 c,n に設定します。
■ 何が問題か
可変長の引数に対処するためのコードの断片を、myrange の本体に追加しました。しかし、それ以外のコードの断片は不変です。そこで《 次のステップ 》では、要求仕様の変更に依存する/しない部分を、分割統治する方法を紹介します。
事例:モジュールを起動する
■ 全項目を確認する
全ステップの「項目」を確認するには、関数 do を利用します。
$ python -i my_range.py >>> do() 0: step00 -- def myrange(n): 1: step01 -- while n: 2: step02 -- s[0:0] = str(n) 3: step03 -- def myrange(c, n): 4: step04x -- def myrange(*args): 5: step05 -- @myrange_args 6: step06 -- def myrange(c, n, m): 7: step07x -- def myrange_args(f): 8: step08 -- def myrange_keys(f): 9: step09 -- def g(*args, **keys): 10: step10 -- yield start 11: step_spyOn -- @spyOn >>>
■ 各項目を実行する
各ステップの「動作」を確認するには、関数 do に実引数を指定します。
>>> do(4) >>> # -------------------------------------------------- step04x >>> for e in range(5): s = range(e+-1,3) print(s,list(s)) range(-1, 3) [-1, 0, 1, 2] range(0, 3) [0, 1, 2] range(1, 3) [1, 2] range(2, 3) [2] range(3, 3) >>> for e in range(5): s = myrange(e+-1,3) print("myrange(%d,3)"%(e-1), s) myrange(-1,3) [-1, 0, 1, 2] myrange(0,3) [0, 1, 2] myrange(1,3) [1, 2] myrange(2,3) [2] myrange(3,3) >>> for e in range(4): s = range(e) print(s,list(s)) range(0, 0) range(0, 1) [0] range(0, 2) [0, 1] range(0, 3) [0, 1, 2] >>> for e in range(4): s = myrange(e) print("myrange(%d)"%e, s) myrange(0) myrange(1) [0] myrange(2) [0, 1] myrange(3) [0, 1, 2] >>>
新たに作成した関数 myrange が、組み込み関数 range に準拠していることを確認します。
- 引数で指定した範囲の数列を列挙した、リストが得られます。
《余録》テストケース
def ex_range2a(local, start, end): ex_range2(local, start, end) # n = end - start + 1 X = '''for e in range({0}): s = range(e) print(s,list(s))'''.format(n) print_(X, local, "exec") X = '''for e in range({0}): s = myrange(e) print("myrange(%d)"%e, s)'''.format(n) print_(X, local, "exec")
》こちらに移動中です《
↑TOP