4. おみくじの気になるところを直す
ここまでで、一応おみくじらしい動きができた訳ですが、みなさん気になっている点があるかと思います。
- 表示が縦に長い
- 全体が一気に表示される
表示が縦に長い
最初の要件には
■要件
・実行すると「あなたの今日の運勢は・・・」とでて、「・」が10回表示されたあとに「おめでとうございます!大吉です」と表示します。
とあります。
誰もが
あなたの今日の運勢は・・・・・・・・・・・・・
というのを期待したんではないでしょうか?
しかし、実際には、
あなたの今日の運勢は・・・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ おめでとうございます!大吉です
となってしまいます。なぜでしょうか?
これは、
- print関数は末尾で自動的に改行する
仕様だからです。自動的に改行しないようにするためにはsys.stdout.write関数を使います。
sys.stdout.write(表示する文字列)
ここで、すでに覚えた2つのルールを思い出してください。
- 固定の文字列を扱うときは「'」または「"」で囲む。
- import文で外部モジュールを読み込む
最初のプログラムを次のように書き換えてみます。
import sys sys.stdout.write('あなたの今日の運勢は・・・') for i in range(10): sys.stdout.write('・') sys.stdout.write("おめでとうございます!大吉です")
これだと
実行結果あなたの今日の運勢は・・・・・・・・・・・・・おめでとうございます!大吉です
これも少し違いますね。
「おめでとうございます!」の前で改行すれば良さそうですが
sys.stdout.write(' おめでとうございます!大吉です')
ではうまく動きません(エラーになります)
pythonでは行末記号(javaでいう「;」)がないので、改行=文の終わりと認識されてしまうためです。
対処方法としては
2. 「"""」文字列を使う
「"""」で囲むと改行を含んだ文字列を記述できます
sys.stdout.write(""" おめでとうございます!大吉です""")
全体が一気に表示される
要件には明記されていませんが、その前に
実行したら、少し遊びの言葉を入れつつ、時間で演出しながら、「おめでとうございます!大吉です」と出すプログラムです。
とあります。ですが、今のプログラムでは「時間で演出」などしていません。
「・」は時間をかけて表示して何かしてる感じを出したいですね。
処理を一時停止させるにはtime.sleep関数を使います。
time.sleep(停止させる秒数)
ここで、次のことを思い出してください。
- インデントで繰り返し範囲を指定
- import文で外部モジュールを読み込む
for文で10回繰り返している「・」の表示の度に、1秒遅延させるとすると、
import sys import time print('あなたの今日の運勢は・・・') for i in range(10): time.sleep(1) sys.stdout.write('・') print('\nおめでとうございます!大吉です')
のようになります。
しれっと2箇所をprint文に戻しましたが、どうなるかは実際に動かしてみてください。