coLinux日記

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

SimplePrograms で Python を学ぶ その11

2024-05-10 09:11:05 | Python
SimplePrograms - Python Wiki
https://wiki.python.org/moin/SimplePrograms

の 11番目のプログラムは、三重クオートの文字列 と whileループ です。

REFRAIN = '''
%d bottles of beer on the wall,
%d bottles of beer,
take one down, pass it around,
%d bottles of beer on the wall!
'''
bottles_of_beer = 9
while bottles_of_beer > 1:
  print (REFRAIN % (bottles_of_beer, bottles_of_beer,
    bottles_of_beer - 1))
  bottles_of_beer -= 1


つまり、 「'''文字列'''」 のことですね。
https://docs.python.org/ja/3/reference/lexical_analysis.html#literals
によると、Python では、

「リテラル (literal) とは、いくつかの組み込み型の定数を表記したものです。」

であり、その中の文字列リテラルの字句定義で、

「longstring ::= "'''" longstringitem* "'''" | '"""' longstringitem* '"""' 」

の、longstring に該当するものですね。 """ もあるようです。次の説明があります。

「三重クオートリテラル中には、三連のエスケープされないクオート文字でリテラルを終端してしまわないかぎり、エスケープされていない改行やクオートを書くことができます (さらに、それらはそのまま文字列中に残ります)。(ここでいう "クオート" とは、文字列の囲みを開始するときに使った文字を示し、' か " のいずれかです。)」

改行もそのまま文字列にできるので、print()での長い文章等の表示に使えるのですね。試してみましょう。

>>> a = '''one
... two
... three
... go'''
>>> print(a)
one
two
three
go
>>>

こうやって見た目通りに書けるので、プログラムが見やすくなるわけです。ところで、

>>> a
'one\ntwo\nthree\ngo'
>>>

普通の文字列ですね。改行は改行文字(\n)として入っています。同じ文字列を b に代入します。

>>> b = 'one\ntwo\nthree\ngo'
>>> b
'one\ntwo\nthree\ngo'
>>>

print()で表示してみると、三重クォートの文字列とまったく同じです。

>>> print(b)
one
two
three
go
>>>

さて、while ループの部分を簡単にするとこんな感じです。

>>> a = 3
>>> while a > 1:
...       print('Number %d' % a )
...       a -= 1
...
Number 3
Number 2
>>>

while ループは、while 横の条件を満たす間はループするという、一般的な使い方ですね。
-= は、aの値を一つ減らす一般的な形式で、
a = a - 1
と等価でしょう。これが無いとループを終了できないわけです。
while ループも forと一緒で、break や else が使えるのが python らしいところですね。

このプログラムも 例によって prog-011.py ファイルとして実行してみました。
$ ./prog-011.py

9 bottles of beer on the wall,
9 bottles of beer,
take one down, pass it around,
8 bottles of beer on the wall!


8 bottles of beer on the wall,
8 bottles of beer,
take one down, pass it around,
7 bottles of beer on the wall!


7 bottles of beer on the wall,
・・・・・・・・・・・・・・・・省略・・・・・・・・・・・・・・・・・

2 bottles of beer on the wall,
2 bottles of beer,
take one down, pass it around,
1 bottles of beer on the wall!



''' の最初の改行と、最後の改行も含んで、最初と最後に空行、結果的に途中2行空行になっているわけです。
ちなみに、whileループ内の print() の途中は、インデントによって継続行と見なされていますね。

今回出てきた三重クオートの文字列は改行文字(\n)を見た目通りに設定できるので便利そうですが、タブ文字(\t)はどうでしょうか。
確かめるプログラムはこんな感じです。
$ cat test-011.py
a = 'abc\ndef123456\nghi\t\tjkl'
print(a)

b = '''abc
def123456
ghi          jkl'''
print(b)

$
( b に代入する三重クオートの途中の空白はタブ文字2つです。)  

タブ間隔を3文字にするには、tabs コマンドを使い、その後にプログラムを実行してみます。
$ tabs -3
$
$ python3 test-011.py
abc
def123456
ghi           jkl
abc
def123456
ghi           jkl
$

タブ文字も問題なく使用できました。(このブログで表示は乱れることがあります。)

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« SimplePrograms で Python を... | トップ | SimplePrograms で Python を... »
最新の画像もっと見る

コメントを投稿

Python」カテゴリの最新記事