coLinux日記

coLinuxはフリーソフトを種として、よろずのシステムとぞなれりける。

SimplePrograms で Python を学ぶ その03

2024-03-15 08:46:37 | Python
SimplePrograms - Python Wiki
https://wiki.python.org/moin/SimplePrograms

の 3番目のプログラムは、

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


です。最後の行は表示で折り曲げられていたとしても、長い1行です。

3行なのでプログラムらしくなって来ました。1行目は形から配列ですね。多くの言語のように配列名の後に"[" と "]" があり、各要素を "," で分けるのですね。

説明文からfor によるループ表現と、enumerate() というビルトイン関数と、"%"とは別のフォーマットの方法がわかるようです。早速実行してみましょう。長い行は折れ曲がっているように見えますが1行です。

>>> 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
>>>

ここで各行のインデントが for ループの中を表すことが分かります。ループの中のプロンプトが "..." に変わるので、インデントしている行が続く限りループの中にあることになるようです。(インデントされていないように見える場合はインデントがあるという前提でご覧下さい。)ちなみに、... の後にインデントのない行を入れると

IndentationError: expected an indented block

のエラーになります。

問題は、for の後の、

i, name in enumerate(friends):

です。 まず Python では for の終わりに":"を付けるようです。よくある言語のように、 in の後ろのものから一つデータを生成して、in の前のものに代入するようです。in の前に ',' で分けた2つの変数に代入しているようですが、流石に類推は困難です。ここは、

The Python Language Reference
https://docs.python.org/3/reference/

を参照することにします。ちなみに、日本語ページはこちらです。(今はブラウザから適時翻訳できるので、そちらも活用できますね。)

https://docs.python.org/ja/3/reference/

リファレンスマニュアルで重要なのは索引ですが、右上の検索窓でも検索できます。

「enumerate(iterable,start=0)
enumerate オブジェクトを返します。 iterable は、シーケンスか iterator か、あるいはイテレーションをサポートするその他のオブジェクトでなければなりません。 enumerate() によって返されたイテレータの __next__() メソッドは、 (デフォルトでは 0 となる start からの) カウントと、 iterable 上のイテレーションによって得られた値を含むタプルを返します。」


と言うわけで、enumerate()関数は0から始まるカウンターとそれに対応するfriendsの要素の値を「タプル」(tuple)というペアにして返すようです。最初のカウンターは、friendsの何番目の要素かを示す値ですね。つまりループするたびに、enumerate()は、
0 , john
1 , pat
.....
のようにタプルを返す?わけです。返されたタプルの2つの値をそれぞれ i , name に代入して、friendsの全要素終了するまでループするのがこの記述ですね。

このenumerate()ですが、
>>> a,b = enumerate(friends,start=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
のような代入はできず。以下のように1つの変数には代入できます。
>>> a = enumerate(friends,start=0)

しかし、aの値は、
>>> print(a)
<enumerate object at 0x768749e0>
>>>
となるので、そのため a,b = のような代入ができなかったようです。当面は for の中で使うだけにしておいたほうが良さそうです。

ループの中の print()ですが、% の代わりに文字列の後ろに.format()が付加されています。「.」で繋ぐこういう形式はオブジェクトに対するメソッドとなることがよくあるものですが、python でも formatメソッドと言うそうです。

オブジェクトにあたる文字列は「置換フィールド」を含む文字列だそうで、{iteration} と {name} が置換フィールドに「キーワード」を指定した場合です。このキーワードの値は、formatメソッドのなかで、
キーワード=値
の形式で指定できるようです。ですから、
.format(iteration=i, name=name)
で、キーワードiterationの値を変数iの値に、キーワードnameの値を変数nameの値に指定するということのようです。
キーワードの値は文字列の指定場所に埋め込まれて、print()がその文字列を表示するわけですね。

formatメソッドは、他にも色々できそうなので今後に期待します。

また、
https://docs.python.org/ja/3/reference/compound_stmts.html#for
によると、「for文」と呼ぶのですね。

今後はプログラムからの推定が難しくなりそうなので、リファレンスを参考にすることになりそうです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする