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