Python.use(better) #body: step09 -- print("".join(s),end="")

記事一覧 Python.use(better)《Python3.1》

body: step09 -- print("".join(s),end="")

《著》森こねこ、小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

課題を作成する過程を通して「ファイル操作」の理解を深めます。
※ Python1.5 で作成した例題を、Python3.1 で再構成しました。

事例:コードの解説

    def body(file, start=1, end=None):
        with open(file) as s:
            s = s.readlines()
            format = "%%%dd: %%s"%len("%d"%len(s))
            s = [format%(start+i,e)                      #1:
                for i,e in enumerate(s[start-1:end])]
            print("".join(s),end="")

    ## ----------------------------------------
    local = locals()
    ex_body3(local, "temp")

前例》と同等の機能を「内包」で実現します。

■ #1: 内包を利用する
            s = [format%(start+i,e)                      #1:
                for i,e in enumerate(s[start-1:end])]
            print("".join(s),end="")

start-1 から end の手前までの各要素 e をもとに、変換指令で整形した文字列 format を列挙した、部分リスト s が得られます。

  • リスト s の各要素を連結 join した文字列を出力します。

事例:モジュールを起動する

■ 全項目を確認する

全ステップの「項目」を確認するには、関数 do を利用します。

$ python -i my_range.py
>>> do()
0: step00 -- open(file,"w")
1: step01 -- s.write(...)
2: step02 -- open(file,"r")
3: step03 -- for i,e in enumerate(f):
4: step04x -- f.readlines()
5: step05 -- print(format%(n,e),end="")
6: step06 -- def body(file):
7: step07 -- def body(file, end=None):
8: step08 -- def body(file, start=1, end=None):
9: step09 -- print("".join(s),end="")
>>>
■ 各項目を実行する

各ステップの「動作」を確認するには、関数 do に実引数を指定します。

>>> do(9)
>>> # -------------------------------------------------- step09
>>> body('temp')
 1: A - 65
 2: B - 66
 3: C - 67
 4: D - 68
 5: E - 69
 6: F - 70
 7: G - 71
 8: H - 72
 9: I - 73
10: J - 74
>>> body('temp',end=3)
 1: A - 65
 2: B - 66
 3: C - 67
>>> body('temp',start=8)
 8: H - 72
 9: I - 73
10: J - 74
>>> body('temp',start=3,end=5)
 3: C - 67
 4: D - 68
 5: E - 69
>>> body('temp',end=8,start=6)
 6: F - 70
 7: G - 71
 8: H - 72
>>>

ファイル 'temp' を作成するとともに、行番号に続いて各行を出力します。

  • 先頭行から 3 行目までを出力します。
  • 8 行目から末尾行までを出力します。
  • 3 行目から 5 行目までを出力します。
  • 6 行目から 8 行目までを出力します。

《余録》テストケース

def ex_body3(local, n):
    ex_body2(local, n)

    source = '''
body({0!r},start=8)
body({0!r},start=3,end=5)
body({0!r},end=8,start=6)
'''.split("\n")

    for e in source[1:-1]:
        print_(e.format(n), local)

》こちらに移動中です《
TOP


関連記事

Last updated♪2009/11/13