pythonで作ってみよう!!

pythonを楽しく学ぶために、おみくじ、占い、ジャンケンなど、実際に作りながら勉強してみます!

第3回 おみくじの気になるところを直す

4. おみくじの気になるところを直す

ここまでで、一応おみくじらしい動きができた訳ですが、みなさん気になっている点があるかと思います。

  1. 表示が縦に長い
  2. 全体が一気に表示される

表示が縦に長い

最初の要件には

■要件
・実行すると「あなたの今日の運勢は・・・」とでて、「・」が10回表示されたあとに「おめでとうございます!大吉です」と表示します。

とあります。
誰もが

実行結果
 あなたの今日の運勢は・・・・・・・・・・・・・

というのを期待したんではないでしょうか?
しかし、実際には、

実行結果
あなたの今日の運勢は・・・
・
・
・
・
・
・
・
・
・
・
おめでとうございます!大吉です

となってしまいます。なぜでしょうか?

これは、

  • print関数は末尾で自動的に改行する

仕様だからです。自動的に改行しないようにするためにはsys.stdout.write関数を使います。

sys.stdout.write(表示する文字列)

ここで、すでに覚えた2つのルールを思い出してください。

  1. 固定の文字列を扱うときは「'」または「"」で囲む。
  2. import文で外部モジュールを読み込む

最初のプログラムを次のように書き換えてみます。

import sys
sys.stdout.write('あなたの今日の運勢は・・・')
for i in range(10):
    sys.stdout.write('・')
sys.stdout.write("おめでとうございます!大吉です")

これだと

実行結果
あなたの今日の運勢は・・・・・・・・・・・・・おめでとうございます!大吉です

これも少し違いますね。
「おめでとうございます!」の前で改行すれば良さそうですが

sys.stdout.write('
おめでとうございます!大吉です')

ではうまく動きません(エラーになります)
pythonでは行末記号(javaでいう「;」)がないので、改行=文の終わりと認識されてしまうためです。
対処方法としては

1. エスケープシーケンスを使う
sys.stdout.write('\nおめでとうございます!大吉です')

※改行記号は「\n」で表します

2. 「"""」文字列を使う

「"""」で囲むと改行を含んだ文字列を記述できます

sys.stdout.write("""
おめでとうございます!大吉です""")

全体が一気に表示される

要件には明記されていませんが、その前に

実行したら、少し遊びの言葉を入れつつ、時間で演出しながら、「おめでとうございます!大吉です」と出すプログラムです。

とあります。ですが、今のプログラムでは「時間で演出」などしていません。
「・」は時間をかけて表示して何かしてる感じを出したいですね。
処理を一時停止させるにはtime.sleep関数を使います。

time.sleep(停止させる秒数)

ここで、次のことを思い出してください。

  1. インデントで繰り返し範囲を指定
  2. import文で外部モジュールを読み込む

for文で10回繰り返している「・」の表示の度に、1秒遅延させるとすると、

import sys
import time
print('あなたの今日の運勢は・・・')
for i in range(10):
    time.sleep(1)
    sys.stdout.write('・')
print('\nおめでとうございます!大吉です')

のようになります。
しれっと2箇所をprint文に戻しましたが、どうなるかは実際に動かしてみてください。