Python.use(better) 課題:行番号

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

課題:行番号

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

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

■ 全項目を確認する

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

$ python scale.py
>>> do()
...
10: step_body -- def body(name, start=1, end=None, number=True):
...
>>>


■ 各項目を実行する

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

>>> do(10)
>>> # -------------------------------------------------- step_body
>>> path
'/Applications/Python 3.1/Extras/Demo/scripts/queens.py'
>>> ex_body(path, end=5)
 1: #! /usr/bin/env python
 2: 
 3: """N queens problem.
 4: 
 5: The (well-known) problem is due to Niklaus Wirth.

>>> ex_body(path, start=81)
81:     q.solve()
82:     print("Found", q.nfound, "solutions.")
83: 
84: if __name__ == "__main__":
85:     main()

>>> ex_body(path, 14, 18)
14: class Queens:
15: 
16:     def __init__(self, n=N):
17:         self.n = n
18:         self.reset()

>>>

指定したファイルの内容を、行番号付きで出力します。

  • キーワード引数 end= によって終了行を指定できます。
  • キーワード引数 start= によって開始行を指定できます。

事例:コードの解説

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

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

    ## ----------------------------------------
    def ex_body(name, start=1, end=None):
        for e in body(name, start, end):
            print(e,end="")
        print()

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

■ #1: dict.get
    histo = {}                                   #1:
    for _ in range(100):
        n = randint(0, 9)
        histo[n] = histo.get(n, 0) + 1

変数 histo は、ヒストグラム(度数分布)を管理します。メソッド get を利用すると、

  • 乱数 n がキーに含まれるなら、対応する値が得られ、
  • 乱数 n がキーに含まれないなら、規定値 0 が得られるので、

同じ乱数 n が見つかると、対応する値をひとつずつ増やします。

■ #2: dict.values
    for k,v in histo.items():                    #2:
        print("{0:d}[{1:2d}]{2}".format(k, v, scale(v)))
    print("sum:",sum(histo.values()))

メソッド values を利用すると、ヒストグラム histo の値要素を列挙する、ジェネレーターが得られます。

  • 組み込み関数 sum によって、値要素の総和が得られます。
■ #3: dict.items
    for e in "min","max":                        #3:
        value = eval("%s(histo.values())"%e)
        s = [k for k,v in histo.items() if v==value]
        print("%s: %d %s"%(e,value,s))

メソッド items を利用すると、ヒストグラム histo の要素対 k,v を列挙する、ジェネレーターが得られます。

  • 組み込み関数 min によって、値要素の最小値 value が得られます。
  • 組み込み関数 max によって、値要素の最大値 value が得られます。
  • 一時変数 s には、最大値/最小値 value と同じ値要素 v を持つ、キー要素 k を列挙したリストを保持します。

関連記事

Last updated♪2009/11/05