カナデKanade

12. 標準ライブラリ2(もっと多くの道具)

数学、統計、テキスト、リスト、エンコード、ハッシュの道具をもっと知りましょう。

この章で学ぶこと

  • 数学、統計、テキスト、リストの道具箱の便利な道具
  • 関数を渡して使うリストの道具(〈変換〉、〈絞り込み〉 …)
  • エンコード、ハッシュ、CSV

11章で道具の持ってき方を覚えたら、今度はよく使われる道具をもっと見て回りましょう。どれもファイルやネットワークを使わない道具なので、このドキュメントの中ですぐに実行できます。

この章は参考書のように読んでもかまいません。 最初から全部覚える必要はありません。下の表で名前をざっと眺めておき、「こんな道具があったな」と思ったときに戻ってきて探して使えば大丈夫です。はじめてなら、数学、統計、テキスト、リストまで読めば十分です。

モジュール できること 道具
【数学】 計算を追加 〈平方根〉 〈べき乗〉 〈絶対値〉 〈四捨五入〉 〈サイン〉 〈コサイン〉 〈タンジェント〉 〈対数〉 〈円周率〉 〈最大公約数〉 〈階乗〉
【統計】 数字のリストを要約 〈合計〉 〈最小値〉 〈最大値〉 〈平均〉 〈中央値〉 〈標準偏差〉
【テキスト】 文字列を扱う 〈大文字〉 〈小文字〉 〈トリム〉 〈左埋め〉 〈右埋め〉 〈繰り返し〉 〈逆さ〉 〈始まるか〉 〈終わるか〉 〈連結〉 〈数える〉 〈位置〉
【リスト】 リストを扱う 〈並べ替え〉 〈反転〉 〈重複除去〉 〈範囲〉 〈平坦化〉 〈小分け〉 〈ペア〉 〈変換〉 〈絞り込み〉 〈畳み込み〉 〈探す〉 〈どれか〉 〈すべて〉 〈基準並べ替え〉
【エンコード】 文字列を別の形に 〈Base64エンコード〉 〈Base64デコード〉 〈URLエンコード〉 〈URLデコード〉
【ハッシュ】 文字列の指紋 〈SHA256〉
【CSV】 表の文字列を読み書き 〈パース〉 〈文字列化〉
【乱数】 (11章に加えて)固有番号 〈UUID〉

数学

〈平方根〉、〈べき乗〉(底, 指数)、〈絶対値〉は名前のとおりです。〈四捨五入〉(数, 桁数)は0.5を切り上げる方式(2.5は3、-2.5は-3)で、桁数は省略できます。〈対数〉(数)は自然対数、〈対数〉(数, 底)は底を決めた対数です。三角関数はラジアンを使います。〈最大公約数〉と〈階乗〉(0から170まで)は整数だけを受け取ります。計算できない値(負の数の平方根、0の対数、大きすぎてあふれる結果)はエラーになります。三角関数や対数などの計算は、エンジンによって最後の桁が違うことがあります。

【数学】から〈平方根〉を持ってこよう
【数学】から〈べき乗〉を持ってこよう
【数学】から〈四捨五入〉を持ってこよう
【数学】から〈最大公約数〉を持ってこよう
【数学】から〈階乗〉を持ってこよう

〈平方根〉(2)を出力しよう
〈べき乗〉(2, 10)を出力しよう
〈四捨五入〉(1234.5678, 2)を出力しよう
〈最大公約数〉(12, 18)を出力しよう
〈階乗〉(10)を出力しよう

統計

数字だけが入ったリストを受け取ります。〈標準偏差〉はPythonのstatistics.stdevと同じ標本標準偏差(n-1で割る)なので、値が2つ以上必要です。値が足りないリスト(空のリストの平均など)はエラーになります。

【統計】から〈平均〉を持ってこよう
【統計】から〈中央値〉を持ってこよう
【統計】から〈最大値〉を持ってこよう
【統計】から〈標準偏差〉を持ってこよう

『点数』を【70, 85, 92, 60, 88】にしよう
枠「平均{〈平均〉(『点数』)}、中央値{〈中央値〉(『点数』)}、最高{〈最大値〉(『点数』)}」を出力しよう
〈標準偏差〉(『点数』)を出力しよう

テキスト

文字数と位置はすべて文字単位(ひらがな1文字が1つ)で数えます。〈トリム〉は前後の空白と改行、全角スペースまで取り除きます。〈左埋め〉(文字列, 幅, 埋める文字)は、文字列が幅より短いときだけ埋め、切り取りはしません。〈位置〉は最初に出てきた場所を1から数えて教え、なければ空っぽです。大文字小文字の変換は、英語のような一般的な文字が対象です。

【テキスト】から〈大文字〉を持ってこよう
【テキスト】から〈トリム〉を持ってこよう
【テキスト】から〈左埋め〉を持ってこよう
【テキスト】から〈連結〉を持ってこよう
【テキスト】から〈位置〉を持ってこよう
【テキスト】から〈数える〉を持ってこよう

〈大文字〉(「hello カナデ」)を出力しよう
枠「[{〈トリム〉(「   余白   」)}]」を出力しよう
〈左埋め〉(「7」, 3, 「0」)を出力しよう
〈連結〉(【「りんご」, 「みかん」, 「ぶどう」】, 「、」)を出力しよう
〈位置〉(「あいうえ」, 「う」)を出力しよう
〈数える〉(「banana」, 「an」)を出力しよう

リスト

〈並べ替え〉は数字同士または文字列同士だけを並べ替え、並べ替えた新しいリストを返します(元のリストはそのままです)。〈範囲〉(始め, 終わり)は終わりまでを含めて整数のリストを作り、始めが終わりより大きければ自動で逆順に数えます。3つ目の値は間隔です。〈重複除去〉は最初に出てきたものだけを残し、〈平坦化〉はリストの中のリストを1段階だけ開きます。

【リスト】から〈並べ替え〉を持ってこよう
【リスト】から〈範囲〉を持ってこよう
【リスト】から〈重複除去〉を持ってこよう
【リスト】から〈小分け〉を持ってこよう
【リスト】から〈ペア〉を持ってこよう

〈並べ替え〉(【3, 1, 2】)を出力しよう
〈範囲〉(1, 5)を出力しよう
〈範囲〉(10, 0, (0 - 5))を出力しよう
〈重複除去〉(【1, 2, 1, 3, 2】)を出力しよう
〈小分け〉(【1, 2, 3, 4, 5】, 2)を出力しよう
〈ペア〉(【「あ」, 「い」】, 【1, 2】)を出力しよう

関数を受け取るリストの道具

リストの項目ごとに自分で作った関数を適用する道具です。カナデには名前のない関数がないので、名前を付けて作った関数を〈名前〉で渡します(関数は項目を1つ受け取る形です)。

道具 できること
〈変換〉(リスト, 〈関数〉) 項目ごとに関数を適用した結果の新しいリストです
〈絞り込み〉(リスト, 〈関数〉) 関数が真を返した項目だけを残した新しいリストです
〈畳み込み〉(リスト, 〈関数〉, 初期値) 関数(ここまでの値, 項目)を順に適用して1つの値にまとめます
〈探す〉(リスト, 〈関数〉) 関数が真を返した最初の項目です(なければ空っぽ)
〈どれか〉(リスト, 〈関数〉) 1つでも真なら真です(空のリストは偽)
〈すべて〉(リスト, 〈関数〉) すべて真なら真です(空のリストは真)
〈基準並べ替え〉(リスト, 〈関数〉) 関数が返した値(数字同士または文字列同士)が小さい順に並べ替えた新しいリストです(同じなら元の順序を保ちます)

〈絞り込み〉、〈探す〉、〈どれか〉、〈すべて〉に渡す関数は、真か偽を返す必要があります。ほかの値を返すとエラーになります。

【リスト】から〈変換〉と〈絞り込み〉と〈畳み込み〉を持ってこよう
【リスト】から〈探す〉と〈基準並べ替え〉を持ってこよう

〈二倍〉を作ろう(『x』):
    (『x』 * 2)を返そう

〈偶数〉を作ろう(『x』):
    もし(『x』 % 2 == 0)なら:
        真を返そう
    偽を返そう

〈足す〉を作ろう(『合計』, 『x』):
    (『合計』 + 『x』)を返そう

〈文字数〉を作ろう(『文』):
    『文』の『長さ』を返そう

〈変換〉(【1, 2, 3】, 〈二倍〉)を出力しよう
〈絞り込み〉(【1, 2, 3, 4】, 〈偶数〉)を出力しよう
〈畳み込み〉(【1, 2, 3, 4】, 〈足す〉, 0)を出力しよう
〈探す〉(【1, 3, 4, 6】, 〈偶数〉)を出力しよう
〈基準並べ替え〉(【「ひらがなだよ」, 「木」, 「山川」】, 〈文字数〉)を出力しよう

エンコードとハッシュ

文字列はUTF-8として扱います。〈Base64エンコード〉と〈Base64デコード〉はbase64、〈URLエンコード〉と〈URLデコード〉はアドレスバーに入れられるよう%E3%81%82のように変えます(英数字と- _ . ~以外はすべて変換します)。形式が間違った文字列を読み取るとエラーになります。〈SHA256〉は文字列のSHA-256の値を16進数64桁で返します。

【エンコード】から〈Base64エンコード〉を持ってこよう
【エンコード】から〈Base64デコード〉を持ってこよう
【エンコード】から〈URLエンコード〉を持ってこよう
【ハッシュ】から〈SHA256〉を持ってこよう
【乱数】から〈UUID〉を持ってこよう

〈Base64エンコード〉(「日本」)を出力しよう
〈Base64デコード〉(「5pel5pys」)を出力しよう
〈URLエンコード〉(「あ い」)を出力しよう
〈SHA256〉(「abc」)を出力しよう
〈UUID〉()を出力しよう

〈UUID〉()は実行するたびに違うランダムなUUID(3b241101-e2bb-4255-8caf-4136c566a962のような文字列)を作ります。

CSV

【CSV】は、カンマで区切った表の文字列(CSV)を読み書きします。〈パース〉(文字列)は文字列を行のリストに変えます。行はセルの文字列のリストです。セルはいつも文字列なので、数字が必要なら〈数字に〉で変えて使ってください。セルの中にカンマや改行があるときは"で囲み、引用符そのものは""と書きます。2つ目の値で区切り文字を1文字で渡すこともできます(「;」など)。

【CSV】から〈パース〉を持ってこよう

『表』を【リスト】の〈パース〉(「名前,点数」)にしよう
『表』を出力しよう

〈文字列化〉(行のリスト)は反対に、行のリストを文字列にします。引用符は必要なセルにだけ付け、セルには文字列、数字、空っぽ(空のセル)だけを入れられます。行と行の間は改行で、最後の行の後ろには付きません。

【CSV】から〈文字列化〉を持ってこよう

〈文字列化〉(【【「名前」, 「メモ」】, 【「太郎」, 空っぽ】】)を出力しよう
〈文字列化〉(【【「あ」, 「い」】】, 「;」)を出力しよう

【JSON】にも〈パース〉と〈文字列化〉があるので、両方を使うときは別名を付けてください。閉じていない引用符のように形式が正しくない文字列はエラーになります。

【CSV】から〈パース〉を持ってこよう

〈パース〉(「"閉じていません」)を出力しよう

練習問題

1. 点数のリストの平均、いちばん高い点数、いちばん低い点数を出力してみましょう。(8章では繰り返し文で自分で求めましたが、【統計】を使えば1行です。)

『点数たち』を【72, 95, 88, 61, 90】にしよう
答えの例
【統計】から〈平均〉と〈最大値〉と〈最小値〉を持ってこよう

『点数たち』を【72, 95, 88, 61, 90】にしよう
枠「平均{〈平均〉(『点数たち』)}、最高{〈最大値〉(『点数たち』)}、最低{〈最小値〉(『点数たち』)}」を出力しよう

2. 名前のリストを、あいうえお順に並べ替えて出力してみましょう。

答えの例
【リスト】から〈並べ替え〉を持ってこよう

『名前たち』を【「そら」, 「あおい」, 「はな」】にしよう
(〈並べ替え〉(『名前たち』))を出力しよう

3. 文字を逆さにして、前から読んでも後ろから読んでも同じ言葉(例:「しんぶんし」)かどうかを確かめてみましょう。

答えの例
【テキスト】から〈逆さ〉を持ってこよう

『言葉』を「しんぶんし」にしよう
もし(『言葉』が〈逆さ〉(『言葉』)と同じだ)なら:
    「前から読んでも後ろから読んでも同じです!」を出力しよう
それ以外なら:
    「前と後ろで違います。」を出力しよう

次の章では、ファイルのパスを扱う【パス】の道具箱を見ます。

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