思い返せば、「対話システムとは何か」を説明した第1回から、随分長い道のりをきたものです。今では皆さんも、対話システムのなかでも花形の1つであるQAシステムを作成できる知識を身に付けました。

そこで今回は、本連載でこれまで解説してきた内容を一度振り返ってみましょう。その上で、開発効率を高める+αの機能として「対話モード」を紹介します。

前回までに学んだコト

本連載では、対話システムの作成を通してPythonを使ったプログラミング方法を解説してきました。連載各回で作成した対話システムと、解説した内容は以下の通りです。

連載回 タイトル 作った対話システム 解説した内容
第1回 対話システムの世界へようこそ! - ・対話システムとは何か
第2回 Pythonをインストールしよう - ・Pythonのインストール方法
4回 Pythonスクリプトの作成と実行 あいさつするプログラムの作成 ・スクリプトの作成と実行方法
・オブジェクトを表示するprint関数
6回 オブジェクトを理解しよう 発話するプログラム ・オブジェクトとメソッド
・文字列オブジェクト
・文字列オブジェクトをフォーマットするformatメソッド
8回 日時を教えてくれる対話システムを作ってみよう 日時を教えてくれる対話システム ・モジュールの使い方
・日時を扱うdatetimeモジュール
・ユーザーの入力を取得するinput関数
・変数の使い方
・条件分岐のためのif文
10回 くじびき対話システムを作ろう くびじき対話システム ・繰り返し処理のためのwhile文
・真偽を表すブール値
・複数のオブジェクトをまとめて扱うリスト
・ランダム処理を扱うrandomモジュール
13回 QA対話システムを作ろう QA対話システム ・要素に対する繰り返し処理を行うfor文
・文字列マッチを行う正規表現とreモジュール
15回 関数を理解しよう - ・処理をまとめる関数の作り方
・使い方
18回 関数をテストしよう - ・関数やオブジェクトをまとめるモジュールの作り方
・使い方
・判定を行うassert文

皆さんはこうした内容を通じて、次のようなPythonの主要機能を理解し、使えるようになったはずです。

  • オブジェクトの使い方
  • 変数の使い方
  • 条件分岐を行うif文
  • 繰り返し処理を行うwhile文、for文
  • 処理をまとめる関数の作成と利用
  • 関数やオブジェクトをまとめるモジュールの作成/利用とテスト方法
  • Pythonが提供している便利なdatetime、random、reモジュールの使い方

Pythonには、ほかにも重要な機能がありますが、まずはこれらの主要機能を使いこなすことが大切です。連載で作成したプログラムをベースに、いろいろ試してみてください。

ちょっとした機能を簡単に試したい

前回までの内容を踏まえ、ここで”+α”の便利な機能をご紹介しましょう。

今までは、小さいプログラムであってもスクリプトファイルを作成して実行するという「プログラミングの基本動作」を繰り返してきました。しかし、実際の開発では「モジュールの関数がどんな動作をするか試しに使ってみたい」というように、一時的なプログラムを実行したいケースが多々発生します。

こうしたニーズに応えるものとして、Pythonは対話モードを提供しています。

今までは、Pythonスクリプトを実行する場合、「python」の後に半角スペースを挟んでスクリプトファイル名を指定し、次のように実行していました。

$ python スクリプトファイル名

それに対して、対話モードでは「python」のみを入力して実行します。それでは試してみましょう。

$ python
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32Type "help", "copyright", "credits" or "license" for more information.
>>>

「>>>」で止まりました!

「>>>」は、対話モードが起動してユーザーからの入力を待ち受けていることを表しています。ここに、Pythonのプログラムを直接入力することで実行できるのです。

例えば、複数のあいさつから1つをランダムで選ぶプログラムを書く必要があり、第10回で取り上げたrandomモジュールのchoice関数を試してみたいとしましょう。

randomモジュールを使うので、まずはrandomモジュールをインポートします。

>>> import random

入力が終わったら「Enter」キーを押すことで入力されたプログラムが実行されます。次の「>>>」が表示されていれば、問題なくimport文が実行されたことになります。

次の「>>>」が表示されていれば、問題なくimport文が実行されている

続けて、変数greetingsにあいさつの候補を代入します。

>>> greetings = ["こんにちは。", "元気ですか", "ごきげんよう"]

先ほどと同様に、入力が終わった後に「Enter」キーを押して実行することを忘れないでください! そして、そのなかからrandom.choice関数でランダムに1つを取得して変数resに代入します。

>>> res = random.choice(greetings)

最後に、print関数で変数resの値を表示してみましょう。

>>> print(res)
元気ですか

期待通り、greetringsのリスト中の1つの挨拶が表示されましたね!

この対話モードには、print関数を使わなくてもオブジェクトを表示できるという特徴があります。試しに「res」と入力し、何が表示されるか確かめてみましょう。

>>> res
'元気ですか'

変数resに代入されている文字列オブジェクトが表示されました! しかし、よく注意して見てみるとprint関数でresを表示した際は「元気ですか」と表示されたのに対し、今回は「’元気ですか’」と「’(シングルクォート)」で囲まれています。どういうことでしょうか?

実は、Pythonではオブジェクトごとに「表示に適した表現」と「オブジェクトを表す表現」が定義されています。

print関数は「表示に適した表現」を表示しますが、「>>> res」のようにオブジェクトを入力した場合は「オブジェクトを表す表現」が表示されることになります。

文字列オブジェクトの場合、「表示に適した表現」には文字列自体が、「オブジェクトを表す表現」には文字列を「’」で囲んだ文字列が定義されているため、このような表示の違いが生まれます

※ 第5回で説明したように、Pythonでは文字列オブジェクトを表すのに「”(ダブルクォート)」で囲ってもシングルクォートで囲っても同じです。

日時オブジェクトで確認してみよう

文字列オブジェクトでは、表示結果の違いがわかりにくかったかもしれません。より理解しやすい例として、第7回で解説したdatetimeモジュールのdatetime.datetime.now関数の戻り値で何が起きるか見てみましょう。

>>> import datetime
>>> now = datetime.datetime.now()
>>> print(now)
2019-12-13 21:30:14.005063

変数nowにdatetime.datetime.now関数で得られる日時オブジェクトを代入し、そのオブジェクトをprint関数で表示してみました。この場合、「現在の日時を表す文字列」が表示されます。

では、日時オブジェクトを直接表示してみるとどうなるでしょうか?

>>> now
datetime.datetime(2019, 12, 13, 21, 30, 14, 5063)

print関数で表示した場合との違いが顕著に異なることがわかりますね! これが日時オブジェクトの「オブジェクトを表す表現」となります。表にまとめてみましょう。

対話モードでのコマンド 表示される内容 文字列オブジェクトの表示例 日時オブジェクトの表示例
print関数で表示 表示に適した表現 元気ですか 2019-12-13 21:30:14.005063
オブジェクトを入力 オブジェクトを表す表現 '元気ですか' datetime.datetime(2019, 12, 13, 21, 30, 14, 5063)

「オブジェクトを表す表現」は読みづらく感じるかもしれませんが、それ自身で同じオブジェクトを生成できる必要があるため、このような詳細な形式になるのです。もし、オブジェクト自身のことを知りたいのであれば、オブジェクトを直接表示することをお薦めします。

対話モードを使い終わったら、exit関数で終了しましょう。

>>> exit()

これで、元のコマンドプロンプトの画面に戻ります。

* * *

対話モードは便利な反面、終了すると書いた内容が消えてしまうので、もう一度実行するのは大変です。そのため、本連載では今まで対話モードは紹介せずに、第3回で紹介した「テキストエディタでプログラムを書き、コマンドプロンプトで実行する」というプログラム開発の基本的なやり方を守ってきました。

しかし、プログラム開発の流れが身に付いた今ならば、用途に応じて適切に対話モードを活用することができるでしょう。テキストエディタでのプログラム作成を中心としながら、新しい関数などが出てきたら対話モードで試し、動作を理解したらテキストエディタに書いて開発を進めると、よりスムーズにプログラミングできます。ぜひ積極的に使っていってください。

今回は、今まで紹介した機能をまとめた上で、読者の方からのご質問にお答えするかたちで開発を便利にする対話モードを紹介しました。対話モードでプログラミングを加速させましょう!

著者紹介


株式会社NTTドコモ
R&Dイノベーション本部 サービスイノベーション部
阿部憲幸

2015年京都大学大学院理学研究科数学・数理解析専攻修了。 同年、NECに入社。 2016年から国立研究開発法人情報通信研究機構出向。 2018年より現職。 自然言語処理、特に対話システムの研究開発に従事。 毎日話したくなるAIを夢見て日夜コーディングに励む。
GitHub:https://github.com/noriyukipy