CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
吉政創成 アシスタントの菱沼です。
今回も「いちばんやさしいPython入門教室(大澤 文孝氏著) 」を片手に勉強していきます。
さて、前回はモジュールについて改めて確認し、短縮して使う方法などを学びました。
これで「Chapter4 プログラムを構成する基本的な機能」で上げられたPythonのプログラムを構成する6大要素を全て学んだことになります。
振り返りたい方は以下URL、第8回目あたりからご確認ください。
https://www.school.ctc-g.co.jp/columns/hishinuma/
今回からはLesson5に入ります。
この章ではヒット&ブローという数字当てゲームを作っていくようです。
本記事では作るのに使うrandomを中心に、ちょっとだけシーケンスについてまとめてみました。
マスターマインドともいうらしいこのゲーム、出題側が数桁の数字を提示し、回答者はその数字を予想します。回答者が予想した数字の中で、数字があっているだけならブロー、数字とその位置があっているならヒットの判定を受けるというものです。先に出た結果をもとにさらに予想して、最終的に数字が全て合うまでやり、なるべく少ない回数で回答に至るようにします。
ここで作るものは最終的に4桁の数字にするようですが、最初から4桁では難しいので、まずは1桁で作成していくようです。
さて、出題側が出す数字はランダムで生成するようです。
引用-------------
P.123
ランダムな値を生成するには、randomモジュールを使います。
(中略)
randomモジュールをインポートすると、「random.関数名」で、ランダムな値に関する、さまざまな機能が使えるようになります。
「randint(らんどいんと)」という関数を使うと、特定の範囲の整数のランダムな値を取得できます。たとえば、「random.randint(0,9)」と書けば、0から9までのランダムな値を取得できます。
--------------------
早速用意されているサンプルコードを実行してみました。それが次の図です。
3回実行してみましたが、確かに毎回違う数字が出ています。
randomモジュールにもやはり複数の関数があります。テキストでは主な関数として以下が紹介されています。
引用P.124)
関数 |
説明 |
random.seed(a,version) |
ランダムな値の元となる値を設定する。ふだんは使う必要がないが、実行するたびにわざと同じ系列の値を出したり、よりランダム性を増したりしたいときなどに使う。 |
random.randint(a,b) |
a以上b以下のランダムな整数を返す。 |
random.choice(seq) |
seqのなかからランダムに一つ取り出す。 |
random.shuffle(x) |
xをランダムな順に並べ替える。 |
random.random() |
0.0以上~1.0未満のランダムな小数値を返す。 |
それ以外には次のような関数が含まれていました。上で紹介したものにはラインを引いてあります。
ところで、choiceのところに(seq)とあります。今までに見かけた記憶がないので調べてみましたら、シーケンス(Sequence)型のことのようです。
シーケンスとは、データが順序だてて保存されているもので、その保存された並び順の通りに処理が行われるそうです。一般的にプログラミング言語では配列とも言われているそうです。
Pythonでは、リスト(list)、タプル(tuple)、レンジ(range)、文字列(string)がシーケンス型に該当するようです。例えば値をカンマで区切って列挙して全体を[]で囲んだことがあります([1,2,3,4]のような)が、それがリストになります。イメージはこんな感じ。
赤字と青字で番号を振っていますが、これは格納されたデータに対して順番に番号が付けられており、それをインデックス番号と呼ぶそうです。
前から数えるときは最初の値は0から始まりますが、後ろから数える場合は最後の数字は-1となって、前に行くにつれて-2、-3となっていきます。シーケンス型の機能であるスライスをすると文字を要素化することも可能です。
ちなみにインデックス番号を数えるのが面倒くさいというときは関数を使えばいいようです。それをやってみたのが次の画像です。
まずは文字を要素に分けました。その後行った処理は、赤が前から数えて何番目の値が何かを出すもの、青が後ろ数えて何番目の値が何かを出すもの、緑が特定の値のインデックス番号を出したものになります。
さて、これでランダムな1桁の数字を表示する方法がわかりました。次に文字を入力できるようにする方法です。
引用----------
P.124
文字入力するにはいくつかの方法がありますが、「input」という関数を使うのが簡単です。
>>> b = input(“数を入れてね>”)
括弧のなかは、ユーザーに表示したいメッセージです。この例だと、画面には「数を入れてね>」と表示され、文字入力待ちの状態になります。そしてユーザーが文字を入力するとその結果がinput関数から返され、上記の礼なら変数bに格納されます。
-------------
次の図がそのサンプルコードと、実行結果です。
これは「数を入れてね」のところに、自分が思う数字を入れると、その数字が変数bに代入されるという処理になります。
この二つ(randomとinput)を組合せたうえで、その値があっているかを検証し、表現する箇所を作れば一桁のランダムな数字を当てるゲームができるようです。
それを試しているサンプルコードが次の図です。わかりやすいようにプログラムが出すランダムな数字も一緒に表示されています。
ところでinputだけのサンプルコードの時、「b=input(“数を入れてね>”)」だけでしたが、このサンプルコードでは該当の個所は「b = int(input(“数を入れてね>”))」に変わっています。その理由は次の通りです。
引用-----
P.127
「random.randint(0,9)」で作ったランダムな値は、0から9の「数値」です。それに対して、「input」で入力したものは「文字列」として認識されます。Pythonの場合、「==」で「数値」「と文字列」を比較して、等しいと判定することはありません。
では、これをどのように解決したらいいでしょうか。それは、「文字列」で入力したものをいったん「数値」に変換すればいいのです。整数に変換する場合には「int」という関数を使います。
-------------
さて、せっかくなのでちょっと応用して早速いつものご一家でやってみます。
たらちゃんが遊びたがっている人を当てるという意味不明なゲームです。
変数isonoを作成し、その中に磯野家の皆さんに入っていただき、random.choiceを使って、isonoリストから誰かを選んでもらいました。
ちゃんとできました。
文字列の場合、intは要りません。print(a)を削除すれば、カンニングも不可能になります。
ためしにprint(a)を削除し、はずれのときに答えを言うようにしました。
かつおちゃんより、たま(猫)と遊びたかったようです。私もたまと遊びたい…。
では今回はここで終了です。お付き合いいただきありがとうございました。
参考サイト:
ランダムに出力!Pythonでrandomを使う方法【初心者向け】
Pythonでリストからランダムに要素を選択するchoice, sample, choices
Pythonのrandom.choices関数を利用してランダム値に重み付けする方法を現役エンジニアが解説【初心者向け】
Pythonのシーケンス(sequence)型とミュータブル・イミュータブル
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes