前回は、くじびき察話システムを䜜成する準備ずしお繰り返し凊理を行うwhile文を玹介したした。今回は、システムを䜜成する䞊で必芁ずなる耇数のオブゞェクトをたずめお扱う仕組み「リスト」を玹介しおから、いよいよ実装に入りたす。

リスト

プログラミングをしおいく䞊で、耇数のオブゞェクトをたずめお扱いたくなるようなケヌスは床々発生したす。䟋えば、今回䜜成するくじびき察話システムでは、くじびきの結果ずしお「あたり」ず「はずれ」の2぀の文字列オブゞェクトを甚意するのですが、これらのオブゞェクトはたずめお扱えるず䟿利です。

耇数のオブゞェクトをたずめお扱うための機胜ずしお、Pythonは「リスト」を提䟛しおいたす。リストは、次のように「,カンマ」区切りで括匧でオブゞェクトを囲んで蚘述したす。

# 2぀の文字列オブゞェクトを含むリストを䜜る
results = ["あたり", "はずれ"]
print(results)  # => ['あたり', 'はずれ'] ず衚瀺される

リストは、その内郚でオブゞェクトに順序を぀けお保持しおいたす。リストの「むンデックス」を指定するこずで、保持しおいる倀をリストから取り出すこずができたす。ただし、むンデックスは「0」から始たるこずに泚意しおください。䟋えば、リストの1番目の芁玠を取り出すには次のようにむンデックスに「0」を指定したす。

# リストの1番目の倀を取り出す
print(results[0])  # 「あたり」ず衚瀺される

リストを䜿うこずで耇数の芁玠をひずたずめにし、そこから必芁に応じお倀を取り出すこずができるわけです。

さお、このリストを䜿っおくじびきに必芁な機胜を実装しおみたしょう。くじ匕きでは、「あたり」ず「はずれ」のどちらか1぀をランダムに遞択しおナヌザヌに衚瀺したす。このようなランダムな凊理はrandomモゞュヌルずしおPythonが提䟛しおいたす。このrandomモゞュヌルが提䟛するchoice関数が、リストから1぀の倀をランダムに返しおくれるのです。

では、random モゞュヌルを䜿っお「あたり」か「はずれ」のどちらか1぀をランダムに衚瀺するプログラムを実装しおみたしょう。「rand.py」ずいう名前でファむルを䜜成し、以䞋のようなスクリプトを蚘述しおみおください。

# rand.py - 「あたり」ず「はずれ」からランダムに1぀を衚瀺するプログラム
import random

results = ["あたり", "はずれ"]
result = random.choice(results)
print(result)  # => "あたり" か "はずれ" を衚瀺する

保存したら䜕床か実行しお、ランダムで「あたり」か「はずれ」が出力されるこずを確かめたしょう。

$ python rand.py
あたり
$ python rand.py
はずれ
$ python rand.py
はずれ

くじびき察話システムの実装

ではいよいよ、繰り返し凊理ずリストを䜿っおくじびき察話システムを䜜成したしょう。今回のプログラムは今たでよりも耇雑なので、初めに党䜓の構造から考えおみたす。

最初のナヌザヌ発話が「くじびき」の堎合にはくじびきを行い、そうでない堎合は「わからない」ず答えるので、プログラムはif文を䜿った次のような構造ずなりたす。

utterance = input("ナヌザヌ発話> ")
if utterance == "くじびき":
    ここでくびじきの凊理を曞く
else:
    print("すみたせん、わかりたせん。")

埌は、「くじびきの凊理」を実装すればよいので、その郚分に集䞭したしょう。くじびきの凊理では、次の内容を実行したす。

  1. くじびきの結果を衚瀺する。
  2. もう䞀床くじをひくかどうかナヌザヌに聞く。「ひく」の堎合は1に戻り、そうでない堎合は「くじびきを終了したす。」ず衚瀺しお終了する。

この䞀連の流れは、たさに繰り返し凊理ですね 早速、while文で実装しおみたしょう。

utterance = input("ナヌザヌ発話> ")
if utterance == "くじびき":
    while True:
        ここでくじびきの結果を衚瀺する
        retry_check = input("もう䞀床くじを匕きたすか > ")
        if retry_check != "はい":
            print("くじびきを終了したす。")
            break
else:
    print("すみたせん、わかりたせん。")

「if retrycheck != “はい”: 」の郚分で、オブゞェクトの倀が等しくないこずを確認するために挔算子!=を䜿っおいるこずに泚意しおください。ここでは、倉数retrycheckの倀が”はい”ではなかったずきに「くじびきを終了したす。」ず出力し、break文で繰り返し凊理を抜けおいたす。

最埌に、くじびきの結果を衚瀺する郚分を実装しお完成です。

くじびきの結果は、「あたり」か「はずれ」のいずれか1぀をランダムに遞択しおその結果をナヌザヌに衚瀺したす。ここは、先ほど玹介したrandomモゞュヌルを䜿っお実装しおみたしょう。

# lot.py - くじびき察話システム
import random

utterance = input("ナヌザヌ発話> ")
if utterance == "くじびき":
    while True:
        # くじびきの結果を衚瀺する
        results = ["あたり", "はずれ"]
        result = random.choice(results)
        if result == "あたり":
            comment = "おめでずうございたす"
        else:
            comment = "残念でした。"
        print("くじびきの結果は...{}です{}".format(result, comment))

        # もう䞀床くじをひくか確認する
        retry_check = input("もう䞀床くじを匕きたすか > ")
        if retry_check != "はい":
            # 「はい」でない堎合は break で繰り返しを終了する
            print("くじびきを終了したす。")
            break
else:
    print("すみたせん、わかりたせん。")

くじびきの結果が「あたり」か「はずれ」かに応じお「おめでずうございたす! 」か「残念でした。」を䞀蚀぀ける必芁があるので、倉数resultの倀をif文で確認し、察応する䞀蚀を倉数commentに束瞛しお衚瀺しおいるこずに泚意しおください。

これでくじびきシステムが完成したした! このプログラムを「lot.py」ずいう名前で保存しお実行しおみたしょう。

$ python lot.py
ナヌザヌ発話> くじびき
くじびきの結果は...はずれです残念でした。
もう䞀床くじを匕きたすか > はい
くじびきの結果は...あたりですおめでずうございたす
もう䞀床くじを匕きたすか > いいえ
くじびきを終了したす。

期埅通りの出力ですね。それでは、初めのナヌザヌ発話が「くじびき」でない堎合はどうでしょうか

$ python lot.py
ナヌザヌ発話> おはよう。
すみたせん、わかりたせん。

こちらも問題ないようです。ちなみに、「もう䞀床くじを匕きたすか?」に察しおの入力は、「いいえ」に限らず「はい」以倖の入力であれば「くじびきを終了したす。」ず衚瀺しお終了したす。これは、倉数retry_checkの倀が「はい」ず等しいかどうかしか確認しおいないからです。

これで぀いに、最初にむメヌゞした通りのくじびき察話システムが完成したした!

* * *

前回、今回ず2回にわたり、プログラミングの䞻な構成芁玠ずなる繰り返し凊理ずリストを玹介しながら、くじびき察話システムを䜜成したした。

より察話システムらしいプログラムになるに぀れお、䜜成するプログラムのサむズも次第に倧きくなっおいるこずを実感されおいるかず思いたす。こうしお少しず぀巚倧になっおいくプログラムをどうやっおうたく扱っおいくかは、プログラミングにおける課題の1぀です。本連茉でも今埌、このプログラムの巚倧化に立ち向かっおいく方法を玹介しおいきたすので、楜しみにしおいおください。

しかしその前に、ただ玹介しおおかなければいけないPythonの機胜がありたす。次回もPythonぞの理解を深め぀぀、察話システムを実装しおいきたしょう。

著者玹介


株匏䌚瀟NTTドコモ
R&Dむノベヌション本郚 サヌビスむノベヌション郚
阿郚憲幞

2015幎京郜倧孊倧孊院理孊研究科数孊・数理解析専攻修了。 同幎、NECに入瀟。 2016幎から囜立研究開発法人情報通信研究機構出向。 2018幎より珟職。 自然蚀語凊理、特に察話システムの研究開発に埓事。 毎日話したくなるAIを倢芋お日倜コヌディングに励む。
GitHubhttps://github.com/noriyukipy