【Python3超入門】ファイル入出力と占いプログラム

Python3による占いプログラムの作成

占いプログラムはとっても簡単に作成できます。その前にプログラムを作成する準備として、知っておきたい関数を1個だけ紹介します。

それは乱数を発生させる関数です。

今回はランダムな整数値を発生させる関数であるrandom.randint(a, b)の使い方からはじめましょう。

Python3で整数の乱数を発生させるには?

[書式]

import random # import文では「モジュール」を読み込むことができます。モジュールとは便利なツールのようなものです。

random.randint(a, b) # a~bまでの整数の乱数を取得

[サンプルコード]

# randomモジュールの読み込み
import random

# randomモジュールに付属するいくつかのメソッドのうちrandint()を利用
# randint(1, 10)とすることで1から10までの範囲で整数の乱数を取得できる
print(random.randint(1, 10)) # 乱数なので実行結果は都度、異なる

是非、IDLEなどでサンプルコードを実際に手で動かして実行してみて下さいね。何度も同じようなことを申し上げて恐縮なのですが、プログラミングを上達させる早道は実際に手を動かしてコードを走らせてみることですからね!

またサンプルコードを参考に「あーでもない、こーでもない」と既存のソースコードを改良したり、機能を付け加えて遊ぶことも非常に効果的なプログラミングの学習法です。是非とも試してみて下さいませ!!!

サンプルコードは簡単ですね。

まずimport文でrandomモジュールを呼び出しておいて、randomモジュールの機能を拝借すればいいのです。具体的には、random.randint(乱数を発生させる整数の範囲)とすればいいのです。

サンプルコードの場合は実行する度に、1~10のいずれかの整数がランダムに表示されますよ。

さて、このrandintだけ知っていれば、Python3超入門【第1回】~【第10回】で学んだ知識で簡単ではありますが占いプログラムを作れます。

尚、占いプログラムはIDLEではなく、テキストエディタで作成し、忘れずに拡張子を(.py)にして、文字コードはUTF-8(ユーティーエフエイト)で保存して下さい。Windowsに付属しているメモ帳などの簡易テキストエディタを利用しても構いませんが、せっかくコーディングするなら支援機能満載のテキストエディタを利用することをお勧めします。以下に候補を挙げておきますね。

当サイト一押し!Python3と相性のいいテキストエディタ一覧

  • Atomエディタ(https://atom.io/)<今一番ナウでヤングな高機能エディタ>

おまけ:Atomエディタの使い方の基礎

インストールが完了したら、上部のメニューバーから、Windows環境の方は[Setting]を、MAC環境の方はATOMメニューから[Prefereces・・・]を選択し、[Setting]画面を開きます。次に[+install]を選択すると、[install Packages]が開くので、そこの検索ボックスから以下の2つのパッケージをインストールして下さい。

  • japanese-menu
  • autocomplete-python

とりあえず、この2つのパッケージをATOMに入れておけば快適にPythonプログラムが書けます。

で、.pyの拡張子、文字コードUTF-8で保存したら、コマンドプロンプトなどのターミナルで、カレントフォルダに移動し、python filename.pyと入力すればPythonのスクリプトファイルを実行できます。MACの場合はターミナルで、
Python3 filename.pyと入力すればOKです。

尚Windowsのコマンドプロンプトの場合、カレントフォルダへの移動は、cd フォルダのパスで指定します。MACのターミナルでもカレントフォルダへの移動はcd フォルダのパスでOKです。

ちなみにフォルダ移動はCドライブ直下に、Pythonとかpyといった名前のフォルダを作成しておいて、そこにPythonのソースコードを置いておくと便利です。なぜなら、cdコマンドの後に長ったらしいファイルパスを入力せずに済むからです。

それでは早速、簡易占いプログラムのコードを見ていきましょう。

# randomモジュールをインポート
import random

# 入力された数字を整数にする関数、入力が整数でなければ0を返す
def number_input(message):
    result = input(message)
    # isdigit()関数で数値が入力されているかチェック
    if(result.isdigit()):
        result = int(result)
        return result
    else:
        return 0

# 占い結果を判断し、占い結果メッセージを表示する関数
def judgment(omikuji):
    # 1-9の整数の乱数を発生させる
    rand = random.randint(1, 9)
    if(omikuji == rand): # ユーザーの入力と乱数値が一致した場合
        print("素晴らしい!超大喜です!なんでも願いが叶います!")
    elif(omikuji > rand): #ユーザーの入力の方が乱数値よりも多い場合
        print("まぁまぁかな。ラッキーアイテムは任天堂3DS!")
    elif(omikuji < rand): # ユーザーの入力の方が乱数値よりも少ない場合
        print("かなりまずいですよ。すぐにラッキーアイテムのスマホを手に入れて下さい!")

# 何回繰り返すか分からないので意図的に無限ループを生成
while(True):
    omikuji = number_input("1から9の中で一番好きな数字を入力して下さい\n\n")

    # omikujiの値が1から9のいづれかである場合
    if((omikuji != 0) and (omikuji > 0) and (omikuji < 10)):

        # omikujiはint型なので文字列と連結するために文字列型に変換[str()]
        print("あなたの好きな数字は" + str(omikuji) + "ですね!\n\n")
        print("それではその数字からあなたの命運を占って差し上げましょう。\n\n")

        # 占い結果を判断し、占い結果メッセージを表示する関数を呼び出し
        judgment(omikuji)

        # 正常に占いが終わったのでwhile文を抜けてプログラムを終了
        break

    # omikujiの値が1から9のどれにも該当しない場合
    else:
        print("1-9の数字を入力して下さい。\n\n")

まず最初に2つの関数を定義しています。

1つ目の関数はnumber_input()、2つめの関数はjudgment()です。それぞれ順番に説明しますね。

number_input()関数を作ったのは、もし数値入力を何度も求めることになると、そのたびにわざわざ、input()関数で文字列型の数値を受け取って、その数値が本当に文字ではなく数値なのかを判定して、その上で、int()関数で数値に変換するという処理を何度も書きたくないからです。

そう忘れてはいけない!input()関数の戻り値は必ず文字列型でしたね。例え100と入力しても”100″という文字列型の数値が返ってくるのです。しかし、isdigit()関数はとっても有能で、文字列型の”100″でもそれが数字の形をしていれば、それは数値であると判断してくれるんでしたね。

で、int(“100”)とすると、その戻り値は純粋な整数としての100でした。でもint(“apple”)とするとエラーが起きてプログラムが止まってしまいます。そこで事前に、isdigit()で数値かどうかチェックし、数値ならint()で整数値に変換して返します。

もし数値でないなら、エラーとして0を返します。

お次はjudgment()関数です。この関数は単純明快です。ただ単に、1から9の乱数を発生させて、それがユーザーが入力した値と同じだった場合、ユーザーが入力した値よりも大きかった場合、ユーザーが入力した場合よりも小さかった場合に分けて、占い結果のメッセージを画面に表示するだけですね。

で、何回ユーザーが入力ミスするかは不明なので、あえて意図的にwhile(True)で無限ループを作ります。そして変数omikujiにユーザーからの入力をnumber_input関数を利用して、受け取ります。

number_input()関数はエラーならば0を返しますから、まず0以外でないといけません。またユーザーに1から9の数値の入力を求めているので、omikujiは0より大きく、10より小さくなければなりません。

これら3つの条件をandでつないでいるだけです。そしてこの3つの条件を全てクリアできたら、占いをはじめる旨のメッセージを表示し、さらにjudgment()関数にomikujiを渡して、最終的な占い結果を画面に表示します。

ここまでやったらプログラムの目的は果たしたので、breakでwhileループを抜け、プログラムを終了します。

逆に、omikujiの値が、1~9のいづれにも該当しない場合はelse以下でエラーメッセージを表示し、もう1回、whileループをやり直す形になります。

これで占いプログラムの解説は終わりにしたいと思います。

Python3のファイル入出力

まずはテキストファイルに文字列を保存する基本的なコードから理解しましょう。

ファイルを読み書きするには、まずはPythonからファイルを開かないと話がはじまりません。

open(ファイル名, モード)関数を実行するとファイルオブジェクトを返します。

例:file_object = open(‘test.txt’, ‘wt’)

上記の例のwtはファイルを開く際のモードを意味します。

モードには以下のような種類があります。

モードの1文字目

モード 意味
r 読み出し。
w 書き込み。指定したファイル名が存在しない場合はそのファイルを新規作成した上で書き込みする。

またファイルが既に存在している場合には上書きされる。

x 書き込み。但し、指定したファイルが存在しない場合のみ使える。
a 書き込み。ファイルが既に存在する場合は、そのファイルの末尾に追記する。

モードの2文字目

モード 意味
t テキストを意味する。
b バイナリを意味する。

従って、例えば「’wt’」と指定すると、ファイルを新規作成か若しくは上書きする。そしてそれはテキストファイルであることを意味する。ってな感じです。

では実際にテキストファイルを新規作成し、そこに文章を保存する簡単なコードを見てみましょう。

# テキストファイルに保存したい文章。
str = '''やっぱりPython3を選んで正解だった。
面白くて仕方がない。
他の言語なんてもう考えられない。'''

# (もし該当ファイルが存在しなければ)test.txtを新規作成した上でモードwtで開く。
file = open('test.txt', 'wt')

# 開いたファイルオブジェクトにstrの内容を書き込み。
file.write(str)

# 一度開いたファイルオブジェクトは忘れずにクローズする。
file.close()

str=”’こんにちは!
筆者の鹿丸です!
Python3の入門記事を書いています”’

このように”’で囲むことで複数行に渡る文章を1つの変数にセットすることができます。

file = open(‘test.txt’, ‘wt’)で、新規作成または上書きのテキストモードで、text.txtを開きます。このopen()関数はファイルオブジェクトを返すので、変数fileにはtest.txtのファイルオブジェクトが格納されます。

尚「オブジェクト」については、次の解説以降で解説しますので、今は分からなくてだいじょうぶですよ。

で、flie.write(str)とすることで、ファイルオブジェクトにstrにセットされている文字列が保存されます。

すなわち、test.txtにstrの中身が保存されます。

最後に一度開いたファイルオブジェクトは必ずクローズするようにします。

とまあ、???となる部分もあるかもしれませんが、もう少し先に進めば完全理解できるはずです。

でも、細かい意味は分からなくても、Pythonスクリプトからテキストファイルを生成し、そこに好きな文字列を書き込むのは簡単だなと思いませんか?

今回はPython3におけるファイル入出力のさわりだけ、簡単に紹介しました。いずれ必ず、かなり詳しくファイル入出力を説明いたしますので、今後とも当サイトをよろしくお願い申し上げます。

コメント