Python.use(better) スケール課題 #3

記事一覧入門編基礎編応用編中級編

Python.use(better)
スケール課題 #3《Python3.1|Jython2.5.0|IronPython2.6》

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

♪スタッフ研修用のセミナー教材(2003)に加筆(再構成)して、公式マニュアルの補足情報を提供します。

スケール課題:要求仕様 ★

■ step04a:if/else 文を利用する
def scale_04a(n):
    s = ""
    for e in range(n):
        if not e%10:
            s += str(e//10)
        if not e%5:
            s += "+"
        else:
            s += "."
    return s

if に続く条件式 not e%10 を満たすときだけ、if ブロックに記述したコードの断片を実行します。そのため、制御変数 e の値が 10 の倍数のときだけ、十の桁を表わす数字 str(e//10) を連結します。

>>> s; scale_04a(len(s))
'Type license() to see the full license text'
'0+....+....1+....+....2+....+....3+....+....4+..'

すると、10桁ごとに桁数を表わす数字が得られます。

■ 何が問題か

しかし、問題となるのは、与えられた文字列と長さが異なることです。得られた文字列には冗長な "+" が出力されています。本来なら、ここは数字だけを出力したいのです。
その理由は、2つの if ブロックが相互に独立して存在しているからです。つまり、2つの条件式は密接に関係するはずがそうなっていないために、冗長に処理されるわけです。この問題を解消するために、elif ブロックを導入します。

■ step04:if/elif/else 文を利用する
def scale_04(n):
    s = ""
    for e in range(n):
        if not e%10:
            s += str(e//10)
        elif not e%5:
            s += "+"
        else:
            s += "."
    return s

if に続く条件式 not e%10 を満たさないときには、elif に続く条件式 not e%5 を満たすかどうかを判定します。すると、if/elif/else ブロックに記述したコードの断片の中から「どれかひとつだけ」を実行します。そのため、冗長に処理を避けて、適切な文字列だけを連結します。

>>> s; scale_04(len(s))
'Type license() to see the full license text'
'0....+....1....+....2....+....3....+....4..'

その違いは、if と elif のわずか2文字だけですが、それによって出力される違いには大差があります。
《余録》


》作業中です《






Last updated♪2009/07/24