見出し画像

【Python】SimplePrograms line 7 dictionary、そしてgenerator object



7行プログラムです。

コード

prices = {'apple': 0.40, 'banana': 0.50}
my_purchase = {
    'apple': 1,
    'banana': 6}
grocery_bill = sum(prices[fruit] * my_purchase[fruit]
                   for fruit in my_purchase)
print ('I owe the grocer $%.2f' % grocery_bill)

実行結果

I owe the grocer $3.40

解説

辞書です。

組み込みやってると、辞書もあまり使わなかったりする。


1行目から4行目。
まとめていきます。

prices = {'apple': 0.40, 'banana': 0.50}
my_purchase = {
    'apple': 1,
    'banana': 6}

2行目~4行目が途中で改行されているけれど、この改行を除くと結局のところこうなります。

prices      = {'apple': 0.40, 'banana': 0.50}
my_purchase = {'apple': 1,    'banana': 6}

あらまあ。
同じようなコードです。
違うのはシンボルと数字だけ。
中途半端に改行するよりも2行で書く方が見やすいけども。

1行目はフルーツの値段(price=価格)。
2行目はフルーツを買った数(purchase=購入)。


5~6行目。

grocery_bill = sum(prices[fruit] * my_purchase[fruit]
                   for fruit in my_purchase)

1行に書き直します。

grocery_bill = sum(prices[fruit] * my_purchase[fruit] for fruit in my_purchase)

1行に複数の命令が入っているのも苦手なのです。
これって、次のコードと同じなんですよね。

grocery_bill = 0
for fruit in my_purchase :
    grocery_bill += (prices[fruit] * my_purchase[fruit])

それが、この太字の部分が for 文の前にきちゃってる。

for fruit in my_purchase :
  grocery_bill += (prices[fruit] * my_purchase[fruit])

するとこうなる。

prices[fruit] * my_purchase[fruit] for fruit in my_purchase

これをそのまま関数「sum」の引数に渡している。
これはいったい、なんだろう。
なので表示してみた。

print(prices[fruit] * my_purchase[fruit] for fruit in my_purchase)

すると、こうなった。

<generator object <genexpr> at 0x0000018367AF4900>

generator object?
「at 0x0000018367AF4900」って、
これはポインタなの?

変数に放り込んでみる。

obj_gen = prices[fruit] * my_purchase[fruit] for fruit in my_purchase

怒られた。

    obj_gen = prices[fruit] * my_purchase[fruit] for fruit in my_purchase
                                                 ^^^
SyntaxError: invalid syntax

これなら?

obj_gen = (prices[fruit] * my_purchase[fruit] for fruit in my_purchase)

合格。

じゃあ、こんなことしてみる。

    print (obj_gen)
    print (*obj_gen)

へぇ~、「*obj_gen」が書けるんだ。
結果は。

<generator object col_gro.<locals>.<genexpr> at 0xf244f3c0>
0.4 3.0

「0.4」はリンゴ1個の値段。
「3.0」はバナナ6個の値段。
リンゴ1個と、
バナナ6個を買ったからね。

「0.4」と「3.0」がリストになって入っているということか?
いや、違う。
違うようなのである。

この「generator object」を追っかけているとどんどん脱線していく。
なので、これはまた改めて。


最後、7行目。

print ('I owe the grocer $%.2f' % grocery_bill)

これはいつもの「print」文です。
お買い物の総額を計算した結果を表示します。
「%f」は置換フィールドで、後ろの変数を浮動小数として扱います。
「%」と「f」の間の数値は表示する桁数になります。
今回の場合、「.2」とありますので小数以下2桁まで表示するという意味になります。


間違いや改善方法、追加情報などありましたら、是非是非コメントくださいませ。


この記事が気に入ったらサポートをしてみませんか?