見出し画像

【Python】SimplePrograms line 3 for文を使ってみよう(繰り返し処理)

3行プログラムです。

コード

friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
    print ("iteration {iteration} is {name}".format(iteration=i, name=name))

実行結果

iteration 0 is john
iteration 1 is pat
iteration 2 is gary
iteration 3 is michael

解説

print」が、だんだん凝ったものになってきますね。

まず、1行目。

friends = ['john', 'pat', 'gary', 'michael']

これはリストを生成しています。
friends」を表示するとこんな風に。

>>> print(friends)
['john', 'pat', 'gary', 'michael']
>>> 

friends」を個別に表示するとこんな風になります。

>>> print(friends[0])
john
>>> print(friends[1])
pat
>>> print(friends[2])
gary
>>> print(friends[3])
michael
>>>

次は「for」文。
この「for」文。ちょっとやっかいですね。
friends」のリストの中身を表示するプログラムは、一番基本的な形はこんな風になります。

for name in friends:
    print(name)

これは
friends のリストの中身を1つ name に取り出して name を表示する。これを、 frieds の全リスト分繰り返す。」
というプログラムです。
この場合、実行結果は次のようになります。

john
pat
gary
michael

SimplePrograms」の for 文は、これとは少し違います。

(1) 「i」がある
(2) 「enumerate」がある

enumerate」から考えてみましょう。
enumerate」を追加してみます。

for name in enumerate(friends):
    print(name)

実行結果はどうなるでしょうか。

(0, 'john')
(1, 'pat')
(2, 'gary')
(3, 'michael')

なるほどねぇ。
name」が「0、1、2、3、・・・」のように、ナンバリングされてますね。
ちなみに「enumerate」という英単語には「数え上げる」という意味があるようですが、まさに数えあげています。

name」から、番号と名前にアクセスできるのでしょうか。

for name in enumerate(friends):
    print(name[0], name[1])
0 john
1 pat
2 gary
3 michael

なるほど。
name」は、番号と名前をリストで持っているようです。

最初のコードは、こんな風にも書けるんですね。

for name in enumerate(friends):
    print("iteration %d is %s" % (name[0], name[1]))

とすると「i」の目的も見えてきました。
こうやって、「( )」でくくるとわかりやすいかもしれません。

for (i, name) in enumerate(friends):
    print("iteration %d is %s" % (i, name))

i」ではなくて「iteration」とした方がわかりやすいでしょうか。
こんな感じ。

for (iteration, name) in enumerate(friends):
    print("iteration %d is %s" % (iteration, name))

もうこれで十分な気がするけど、「SimplePrograms」の「print」文はさらに違います。

    print ("iteration {iteration} is {name}".format(iteration=i, name=name))

何でしょうねぇ、これは。

まず「.format」とあるけれども、これは
「文字列クラスの format メンバ」
ということのようです。
文字列「"iteration {iteration} is {name}"」のメンバということですね。
C++ は C を引きずったので、「"iteration {iteration} is {name}"」だけではクラスにはならなかったんだけれども、すべてのオブジェクトがクラスだとすれば、どんなオブジェクトもメンバを持つということでしょうか。

ちなみに「format」については、こちらに記載されています。

"iteration {iteration} is {name}"」は「書式指定文字列」。
{ }」は「置換フィールド」の意味になります。
%s」や「%d」などと同じで
「後で別のものに置き換えますよ」
ということを意味します。
置換する内容は「format」の引数で
iteration=i」や
name=name
と書いて、何に置換するのかを指定しています。

ですから、Python の書式指定には、
%s」や「%d」のような C 言語に似たものと
{iteration}」のような独自のものの
2種類があるようです。
あるいは、もっと他にもあるのかもしれません。


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


いいなと思ったら応援しよう!