カナデKanade

11. 標準ライブラリ(道具箱)

JSON、乱数、日時、正規表現など、すぐ取り出して使える道具を知りましょう。

この章で学ぶこと

  • 道具箱(モジュール)から道具(関数)を取り出して使う方法(持ってこよう)
  • よく使う道具箱5つ: 数学、JSON、乱数、日時、正規表現

道具箱から取り出して使う

9章で関数を自分で作りましたね。切り上げ、ランダムな数を選ぶ、日付の計算のように、多くの人がよく使う関数は、カナデがあらかじめ作って道具箱に入れてあります。この道具箱をモジュール、モジュールを集めたものを標準ライブラリといいます。

〈数字に〉のようにいつも使ういくつかを除いて、道具は使う前に持ってくる必要があります。モジュールはすみつきかっこで書きます。

【数学】から〈切り上げ〉を持ってこよう
〈切り上げ〉(3.2)を出力しよう
  1. 【数学】から〈切り上げ〉を持ってこよう — 【数学】の道具箱から〈切り上げ〉を取り出します。
  2. そのあとは、9章の関数と同じように〈切り上げ〉(3.2)と書きます。4が出ます。

持ってくる方法はいくつかあります。

書き方 意味
【数学】から〈切り上げ〉を持ってこよう 1つだけ
【数学】から〈切り上げ〉と〈切り捨て〉を持ってこよう いくつも(とでつなぐ)
【数学】から全部持ってこよう そのモジュールの道具を全部
【数学】から〈切り上げ〉を〈上へ〉に持ってこよう 別の名前(別名)で
【数学】から〈切り上げ〉と〈切り捨て〉を持ってこよう
【数学】から〈切り上げ〉を〈上へ〉に持ってこよう

〈切り上げ〉(3.2)を出力しよう
〈切り捨て〉(3.8)を出力しよう
〈上へ〉(1.1)を出力しよう

4、3、2が出ます。別名は、自分で作った関数と名前がぶつかるときに使います。持ってこないで使うと「関数が見つかりません」というエラーになるので、このエラーを見たら、まず持ってきたかを確かめてください。

この章で見る道具箱

モジュール できること 道具
【数学】 切り上げと切り捨て(もっと多くの計算は12章) 〈切り上げ〉 〈切り捨て〉
【JSON】 JSONの文字列と値の変換 〈パース〉 〈文字列化〉
【乱数】 ランダムな値を選ぶ 〈実数〉 〈整数〉 〈選ぶ〉 〈シャッフル〉
【日時】 時刻を扱う 〈今〉 〈書式〉 〈読み取り〉 〈曜日〉 〈待つ〉
【正規表現】 文字のパターンを探す 〈検査〉 〈検索〉 〈グループ〉 〈全検索〉 〈置換〉 〈分割〉

全部は便利ですが、別のモジュールから同じ名前の道具を持ってくると、後のものが前のものを上書きします。名前がぶつかりそうなときは、必要なものだけを選んで持ってきてください。

JSON

JSONは、プログラムどうしがデータをやりとりするときによく使う文章の形式です。Webから受け取るデータの多くはJSONです。{"名前": "はな"}のように、カナデの辞書・リストとほとんど同じ形をしています。

〈パース〉はJSONの文字列をカナデの値に変えます。オブジェクトは辞書、配列はリスト、nullは空っぽになります。逆に〈文字列化〉は値をJSONの文字列にします。辞書のキーは文字列でなければならず、文字の順に並びます。2つ目の引数にインデントの幅を渡すと、読みやすく広げてくれます。

【JSON】から〈パース〉を持ってこよう
【JSON】から〈文字列化〉を持ってこよう

『文』を「{"名前": "はな", "点数": [90, 80]}」にしよう
『値』を〈パース〉(『文』)にしよう
『値』の「名前」を出力しよう

『辞書』を{「b」: 2, 「a」: 真}にしよう
〈文字列化〉(『辞書』)を出力しよう
〈文字列化〉(『辞書』, 2)を出力しよう

カナデの文字列はかぎかっこで囲むので、JSONの"はそのまま書けます。

乱数

〈実数〉()は0以上1未満の数、〈整数〉(最小, 最大)は2つの数の間(両端を含む)の整数を返します。〈選ぶ〉はリストから1つ選び、〈シャッフル〉は混ぜた新しいリストを返します(元のリストはそのままです)。実行するたびに結果が変わります。

【乱数】から〈整数〉を持ってこよう
【乱数】から〈選ぶ〉を持ってこよう
【乱数】から〈シャッフル〉を持ってこよう

『サイコロ』を〈整数〉(1, 6)にしよう
枠「サイコロは{『サイコロ』}が出ました。」を出力しよう

『メニュー』を【「カレー」, 「ラーメン」, 「うどん」】にしよう
枠「今日は{〈選ぶ〉(『メニュー』)}!」を出力しよう
〈シャッフル〉(『メニュー』)を出力しよう

日時

時刻は、1970年1月1日から経った秒(数字)で扱います。〈今〉()が現在の時刻を返し、〈書式〉(時刻, 書式)で文字列に、〈読み取り〉(文字列, 書式)でまた時刻に戻せます。書式ではYYYY(年)、MM(月)、DD(日)、HH(時)、mm(分)、ss(秒)だけが置き換わり、ほかの文字はそのままです。コンピューターに設定されたタイムゾーンを使います。〈曜日〉(時刻)は、曜日を月曜日の1から日曜日の7までの数字で教えてくれます。「2月30日」のように存在しない日付を読み取るとエラーになります。〈待つ〉(秒)は、その時間だけプログラムを止めて待ちます(0秒から3600秒まで、小数も使えます)。ブラウザのプレイグラウンドでも、画面が固まらずに待ちます。

【日時】から〈今〉を持ってこよう
【日時】から〈書式〉を持ってこよう
【日時】から〈読み取り〉を持ってこよう

『時刻』を〈読み取り〉(「2024-03-05 07:08:09」, 「YYYY-MM-DD HH:mm:ss」)にしよう
〈書式〉(『時刻』, 「YYYY年MM月DD日」)を出力しよう

『今』を〈今〉()にしよう
枠「今は{〈書式〉(『今』, 「HH:mm:ss」)}です。」を出力しよう

〈待つ〉でゆっくり数えることもできます。

【日時】から〈待つ〉を持ってこよう

「3」を出力しよう
〈待つ〉(0.3)を実行しよう
「2」を出力しよう
〈待つ〉(0.3)を実行しよう
「1」を出力しよう
〈待つ〉(0.3)を実行しよう
「発射!」を出力しよう

正規表現(少し難しいです)

「数字が続いている部分」「@が入っている単語」のように、文字の形(パターン)で探すときは正規表現を使います。正規表現はそれ自体が小さな言語なので、最初はなじみにくいです。今は飛ばして、必要になったときに戻ってきてもかまいません。道具はどれも先に(文字列, パターン)を受け取ります。

  • 〈検査〉: パターンがあるかを真/偽で教えます。
  • 〈検索〉: 最初に合った文字列を返します。なければ空っぽです。
  • 〈グループ〉: 最初に合った文字列と、( )で囲んだ部分をリストで返します。
  • 〈全検索〉: 合った文字列をすべてリストで返します。
  • 〈置換〉: 合った所を別の文字列に置き換えます。置き換える文字列の中の$1、$2は囲んだ部分、$$はドル記号です。
  • 〈分割〉: 合った所で区切って、リストで返します。
【正規表現】から〈検査〉を持ってこよう
【正規表現】から〈全検索〉を持ってこよう
【正規表現】から〈グループ〉を持ってこよう
【正規表現】から〈置換〉を持ってこよう
【正規表現】から〈分割〉を持ってこよう

〈検査〉(「abc123」, 「[0-9]+」)を出力しよう
〈全検索〉(「a1b22c333」, 「[0-9]+」)を出力しよう
〈グループ〉(「2024-03-05」, 「([0-9]+)-([0-9]+)-([0-9]+)」)を出力しよう
〈置換〉(「山田 鈴木」, 「([^ ]+) ([^ ]+)」, 「$2 $1」)を出力しよう
〈分割〉(「りんご, みかん,ぶどう」, 「, ?」)を出力しよう

正規表現は、GoとJavaScriptが共通で使える文法だけが使えます。文字列の何もない所に合う場合(空の文字列に合うパターン)は、〈全検索〉、〈置換〉、〈分割〉では無視されます。先頭に(?i)(大文字小文字を無視)、(?m)、(?s)を付けてオプションを指定できます。

一緒に使ってみよう: 月曜日をからかう

いくつものモジュールをまとめて持ってくると、こんなものも作れます。〈曜日〉(時刻)は、月曜日が1、日曜日が7の数字を返します。明日が月曜日なら、【JSON】で読み込んでおいたからかいの言葉の中から1つを【乱数】で選んで聞かせます。

【日時】から〈今〉を持ってこよう
【日時】から〈曜日〉を持ってこよう
【乱数】から〈選ぶ〉を持ってこよう
【JSON】から〈パース〉を持ってこよう

『からかい』を〈パース〉(「["明日は月曜日ですって…週末はもう伝説になりましたね。", "月曜日が近づいてきます!目覚ましの音を先に聞いておきましょう。", "明日は月曜日!お布団の外は危険ですよ。"]」)にしよう

『明日』を(〈今〉() + 86400)にしよう
『曜日番号』を〈曜日〉(『明日』)にしよう

もし(『曜日番号』が1と同じだ)なら:
    〈選ぶ〉(『からかい』)を出力しよう
それ以外なら:
    「明日は月曜日ではありません。今日はからかうネタがありませんね。」を出力しよう

まとめ

やりたいこと 書き方
道具を持ってくる 【モジュール】から〈道具〉を持ってこよう
いくつも/全部 〈あ〉と〈い〉を持ってこよう、【モジュール】から全部持ってこよう
別の名前で 〈道具〉を〈新しい名前〉に持ってこよう
ランダムな整数 【乱数】の〈整数〉(1, 6)
今の時刻を文字に 【日時】の〈書式〉(〈今〉(), 「HH:mm」)
JSON ↔ 値 【JSON】の〈パース〉、〈文字列化〉

練習問題

1. サイコロを2つ振って、2つの目と合計を出力してみましょう。

答えの例
【乱数】から〈整数〉を持ってこよう

『あ』を〈整数〉(1, 6)にしよう
『い』を〈整数〉(1, 6)にしよう
枠「{『あ』} + {『い』} = {『あ』 + 『い』}」を出力しよう

2. お昼のメニューのリストを作って、その中から1つをランダムに選び、「今日のお昼は○○!」と出力してみましょう。

答えの例
【乱数】から〈選ぶ〉を持ってこよう

『メニュー』を【「おにぎり」, 「ラーメン」, 「とんかつ」, 「カレー」】にしよう
枠「今日のお昼は{〈選ぶ〉(『メニュー』)}!」を出力しよう

3. 下のJSONの文から、2人目の友だちの名前を取り出して出力してみましょう。

『文』を「[{"名前": "はな"}, {"名前": "そら"}]」にしよう
答えの例
【JSON】から〈パース〉を持ってこよう

『文』を「[{"名前": "はな"}, {"名前": "そら"}]」にしよう
『友だち』を〈パース〉(『文』)にしよう
((『友だち』の2番目)の「名前」)を出力しよう

次の章では、もっと多くの道具箱(統計、テキスト、リストの道具など)を見て回ります。

プレイグラウンド
結果
コードを書いて「実行」ボタンを押してください。