今日もやってまいりました、「1日1python」のお時間です。(ただし隔週放送)

あらかじめ生産量と価格のシーケンスを作っておけば、年を入力するだけでGNPまわりの計算をやってくれる関数。

name = ('goodsA', 'goodsB')
product2000 = (5, 10)
product2010 = (10, 20)
price2000 = (200, 100)
price2010 = (100, 50)
baseyear = '2000'

def nominalGNP(year): # 名目GNP
    productlist, pricelist = 'product' + str(year), 'price' + str(year)
    result = 0
    for foo in range(len(name)):
        result += eval(productlist)[foo] * eval(pricelist)[foo]
    return result

def realGNP(year): # 実質GNP
    productlist, pricelist = 'product' + str(year), 'price%s' % baseyear
    result = 0
    for foo in range(len(name)):
        result += eval(productlist)[foo] * eval(pricelist)[foo]
    return result

# GNPデフレーター(= 基準年に対するその年の物価の割合)
def GNPdeflator(year):
    return 1.0 * nominalGNP(year) / realGNP(year) * 100

# 消費者物価指数(= デフレーターと同様だが、
# あちらは「今年の買い物量で出費を比べる」
# こちらは「基準年の買い物量で出費を比べる」)
def CPI(year):
    pricelist, baseproductlist = 'price' + str(year), 'product%s' % baseyear
    a = 0
    for foo in range(len(name)):
        a += eval(pricelist)[foo] * eval(baseproductlist)[foo]
    return 1.0 * a / nominalGNP(baseyear) * 100

まあその、経済の入門本を読んでいてGNPデフレーターとCPIの違いがサッパリワケワカメで気晴らしがしたくて書いたんですね実は。

今回の噛まれポイントとその解決法。

# 噛まれポイント1
list1 = [...]
def foo(number):
    LIST = 'list' + str(number)
    return LIST[0]

これで foo() を実行しても list1 の内容は返してくれない。文字列を変数化する場合は eval() 関数を使う。この場合ならば eval(LIST)[0] でオーケイ。

# 噛まれポイント2
print 1 / 2

これは0になる。……いやその、こうして見ると当然なんだけど、式の要素が実数じゃなくて変数だったりすると案外ドツボっちゃったりするのだよ。ここで0.5と表示したい場合はどちらかを float() で括るか、あらかじめ 1.0 を掛けておけばよい。今回は後者を用いた。

以下の記事からリンクされています