Python.use(better)

前の記事記事一覧次の記事
Python.use(better)


実録:はじめてのプログラミング《11》

行番号課題(1)ファイル

行番号課題の仕様を確認したので、これから、関数 body が完成するまでの過程を紹介します。

def body(name, start=1, end=None):
    s,n = _body(name, start, end)
    format = "{{0:{0:d}d}}: {{1}}".format(len(str(n)))
    for i,e in enumerate(s):
        s[i] = format.format(start+i, e)
    return s

関数 body は、テキストファイル name を読み込んで、先頭 start から末尾 end までの各行に「行番号を挿入したもの」を要素とするリストを生成します。ここでは、補助関数 _body のリターン値 s,n を利用します。
変数 s は、テキストファイルの各行を要素とするリストを保持します。変数 n は、テキストファイルの行数を保持します。そこで、行番号を表示するのに必要な桁数を求めて、それを(変換フィールドを含む)文字列 format に埋め込みます。すると、

>>> n=85; "{{0:{0}d}}: {{1}}".format(len(str(n)))
'{0:2d}: {1}'

ここでは、n=85 になるので、そのリターン値として新たな(変換フィールドを含む)文字列 '{0:2d}: {1}' が得られます。これが、変数 format の値になって、行番号付きのソースコードの断片を生成します。すると、

>>> n=85; "{{0:{0}d}}: {{1}}".format(len(str(n))).format(3,"as happy as happy can be")
' 3: as happy as happy can be'

文字列の変換フィールド '{0:2d}: {1}' に従って、整形された文字列が得られます。このとき、最初に空白文字があるのは、'{0:2d}' になっているからです。

def _body(name, start=1, end=None):
    s = open(name).readlines(); N = len(s)
    if not end: end = N+1
    return s[start-1:end], N

補助関数 _body は、テキストファイル name を読み込んで、先頭 start から末尾 end までの各行を要素とするリスト s を生成するとともに、テキストファイルの行数 N をリターン値にします。
ファイルの内容を読み込むには、組み込み関数 open を利用します。メソッド file.readlines を利用すると、テキストファイルの各行を要素とするリストが得られます。引数 start を省略すると、ファイルの先頭行から読み込みます。引数 end を省略すると、ファイルの末尾行まで読み込みます。

Tips:コードの断片を実行時に生成する

行番号を表示するのに必要な桁数は、ファイルの行数によって確定します。そのため、コードの断片を実行時に生成する方法が必要になります。ここでは「変換フィールド」を含む文字列の内容が、ファイルの行数に合わせて変化します。《うさぎ》

Tips

Python 3 では、文字列の変換指令に代わる Tips が必要です。この話題は、関連記事で紹介します。《ひよ子》

Last updated♪09/03/07