Coding for KidsCoding for Kids
クリエイティブレベル挑戦教師ガイド
機能に投票
上級Python開発コース
チャプター
>
レベル

文字列 & 時間モジュール
文字列モジュール

目的

文字列モジュールを使用してアプリケーションデータを集計し、返信用の文書を送信する。

新しい農場建設用の資材が確保できたので、次は農場の新規人材に目を向ける時です。求人応募用の手紙がいくつかあり、通常ならかなりの文章作成が必要となりますが、文字列モジュールを利用することでテンプレート作成やテキストのフォーマットが可能になり、大量の文章を扱う作業が容易になります。

今回、文字列モジュールのインポート方法は他のモジュールとは少し異なります。モジュールを拡張するクラスをインポートする形になり、以下のように実行します:

import string from string import Template from string import Formatter

これにより、モジュール自体へのアクセスと、独自の関数を持つテンプレートおよびフォーマットのクラスへのアクセスが可能になります。ここでは、以下の関数とクラスを使用します:

  • string.capwords(): この関数は、文字列内の各単語の先頭文字を大文字にし、残りを小文字に変換することで適切な大文字小文字の表記にします。
  • Template(): これは文字列クラスで、テンプレートオブジェクトを生成するために使用されます。substitute() 関数を利用することで、$ 記号を用いたプレースホルダーをデータに置き換えることができます。これにより、必要に応じて再利用可能なモジュラーな文字列を作成できます。
  • Formatter(): こちらも文字列クラスで、文字列をフォーマットまたは構成するために使用されます。Template() クラスと似た動作をしますが、より堅牢かつ大規模な文字列シーケンスに対応します。format() 関数を使い、文字列内の {} を指定した場所にデータを挿入します。

まず、光るXマークの方へ歩いて行き、ファイリングキャビネットに向かいながら read() 関数を使用してください。これにより、各応募者の名前が付いたフォルダ(folder_afolder_bfolder_c の3つの定数リスト)にアクセスすることができます。

次に、緑のカーペット上の暗いXマークへ歩いて行き、机の方を向いてください。ここで、names_anames_bnames_c という3つのリストを作成します。リスト内包表記と string.capwords() 関数を使用して、各名前の正しい大文字小文字表記に整形してください。例えば、names_a には folder_a を用いて以下のように記述します: names_a = [string.capwords(x) for x in folder_a] 。同様にして names_bnames_c も作成してください。

次に、all_names というリストを作成し、3つの名前リスト (names_anames_bnames_c) を加算して一つの大きなリストにまとめます。例えば、all_names = names_a + names_b + names_c と記述します。これにより、すべてのリストが一つに合成されます。その後、Pythonの join() 関数を使用して、すべてのリスト項目を1つの文字列に連結します。連結時に各項目の間に挿入する文字列を引用符で指定できます。例えば、all_names = ", ".join(all_templates) と記述します。最後に、既に用意されている write() 関数を使用して、正しい大文字小文字の形式で全ての名前を出力してください。

次に、金色のXマークへ歩いて行き、机の方を向きます。ここではテンプレートを設定します。既に用意された2つのテンプレートオブジェクト、red_templateblue_template が以下のように存在します:

red_template = Template( "Hello, $name , thank you for applying for this position.") blue_template = Template( "Esteemed , $name , your application has been approved.")

これらのテンプレートはそれぞれ固有のメッセージを持っていますが、共通して $name とラベル付けされたプレースホルダーを含んでいます。$ 記号は、置き換え可能なプレースホルダーを示すために使用され、ここでは名前を表すために使われます。もし置き換える値がなければ、テンプレート内にそのままプレースホルダーが残ります。さらに、all_templates というリストを作成してください。

次に、4回のループを持つ for ループを作成し、3つの名前リスト中の名前を、テンプレート内の名前を含む形に置換します。例えば、names_a リストには red_template を適用してください。Template() クラスの substitute() 関数を使用して、テンプレート内の $name プレースホルダーをリスト内の各名前で置き換えます。

for x in range(4): names_a[x] = red_template.substitute(name=names_a[x])

同様の操作を names_bnames_c に対しても行い、names_b には red_template を、names_c には blue_template を使用してください。

すべての名前リストが新しいテンプレートで更新されたら、それらを確認します。新たに all_templates というリストを作成し、すべての名前リストを加算して結合してください。例えば、all_templates = names_a + names_b + names_c と記述します。その後、前述の join() 関数を用いて、テンプレート化された名前を読みやすい形に整形します。例: all_templates = "\n".join(all_templates) 。最後に、用意済みの write() 関数を使い、各名前のヘッダーを出力してください。

次に、赤いカーペット上の暗いXマークへ歩いて行き、机の方を向きます。ここでは最初の一連の手紙をフォーマットして出力します。クラス表記を用いて、red_1red_2 という2つのフォーマッターオブジェクトをそれぞれ作成してください。例: red_1 = Formatter()red_2 = Formatter() 。そして、手紙の内容を作成するために、red_letters というリストを作成してください。

これまでと同様に、4回のループを使用して、既存の2つの文字列を format() 関数でフォーマットし、名前の変数を挿入していきます。フォーマットされた各文字列は red_letters リストに追加され、送付される手紙のリストが作成されます。例えば、red_1 フォーマットオブジェクトは names_a リストを用いてフォーマットされ、red_letters リストに追加されます。

for x in range(4): red_letters.append(red_1.format( "{} Orientation will begin next week, please report to the office..." , names_a[x]))

同様に、red_2 フォーマッターオブジェクトも、対応する既存の文字列と names_b リストを使用して処理してください。すべての設定が完了したら、join() 関数を使用して red_letters 内のデータを1つの文字列にまとめます。例: red_letters = "\n".join(red_letters) 。そして、write() 関数を使用して、フォーマットされた全ての手紙を出力してください。

最後に、青いカーペット上の暗いXマークへ歩いて行き、机の方を向きます。ここでは、最後の一連の手紙をフォーマットして作成します。前述と同様に、blue_1blue_2 という2つのフォーマッターオブジェクトを作成してください。例: blue_1 = Formatter()blue_2 = Formatter() 。さらに、手紙を作成するために、blue_letters というリストを作成してください。

再び、4回のループを作成し、既存の文字列を用いて名前リストをフォーマットし、blue_letters リストに追加します。この場合、blue_1 フォーマッターオブジェクトは names_c リストと、blue_2 フォーマッターオブジェクトは names_b リストと組み合わせて使用してください。これは赤いカーペットの場合と同様の手法ですが、使用する値が異なることで、フォーマットとテンプレートの多様性を示しています。すべての処理が終わったら、write() 関数を使用して、最後の手紙を出力し、レベルを完了してください.

コードブック