📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

【初学者必見!】Python基礎力を底上げするための特訓20問 vol.2

いまにゅのプログラミング塾33:25

Transcription

[音楽]

ん dee [音楽] 2 [音楽] me [音楽]

21問目 情報の取得

以下の辞書から次の処理を行いましょう。

キーのみの表示。

与えの中に「男性」という文字列が存在するか。

全てのキーと値の表示。

それでは回答です。

まずはキーのみを表示しましょう。

こちらの `dictionary` という辞書に対してキーのみを表示したい場合は `dictionary.keys()` としてあげます。

そうするとこのように `a`, `b`, `c`, `d` というキーを表示させることができました。

次ですね、この与えの中に「男性」という文字列が存在するかという、いわゆる判定を行いたいと思います。

まずはですね、その子の値全部ですね、値のみを取り出してあげたいと思います。

値のみを取り出したい場合は非常に簡単です。

`dictionary.values()` と、これも同様にですね、`keys` でなく `values` としてあげると、このように値のみを取り出すことができます。

で、この中に、この中にですよ、「男性」という文字があるかどうかというのは、このようにしてあげます。

`'男性' in dictionary.values()`

`dictionary.values()` のバリューの中に「男性」という文字があるかということで、`True` となりました。「男性」という値が入っているので `True` となるのは大丈夫ですね。

では最後、全てのキーと値の表示ということで、まあこれですね、`dictionary.keys()` と `values` を使えばいいんですけれども、`for` 文を使うといいかなと思っています。

`for key, value in dictionary.items():`

ここで `items()` というのを使っています。この `items()` というのを使ってあげると、こちらの2つに値が入ります。

そのままです。`key` というものには辞書のこの `dictionary` の中のキーが入り、`value` にはこの辞書の中のバリュー値が入ります。

それぞれの方々ん。朝ので、まず最初にこの `a`、今西、その次 `b`、公平というのが入るので、こちらをプリント文で表示すると。

`f-string` を使いましょう。

`print(f"キーは {key} で、バリューは {value} です。")`

ここで `key` は `key` となって、そしてバリューですね。

`value` は `value` としてあげると、このように「キーは a、バリューは今西」、「キーは b、バリューは公平」といった形で取り出すことができました。

22問目 自称内の要素検索

以下の辞書から `c` と `e` というキーに対応する値を表示しましょう。

それでは回答です。

`c` と `e` の値をとってくるというのは、もう特に難しくないんじゃないかと思うかもしれません。

確かですね、普通にこのように `dictionary['c']` と知ってあげればとってくることが出来ますし、`dictionary['e']` とすればとってくることができます。

で、これでもいいんですけれども、今回お伝えしたいのは別の方法です。

何かというと、まあこのままでも取れるんですけども、`.get()` というメソッドを使用しても取れます。

これで `dictionary.get('c')` とすると、このように取ってくることができて、`dictionary.get('e')` とすると取ってくることができます。

何が違うの?という話なんですけども、こちらですね、仮に `f` というのがないキーなんですけれども、この `dictionary.get('f')` という形を実行すると、特に何もエラー起こりませんが、内容というのは起こるわけではなく、何も表示されないような形となります。

それに対して、通常を行うこちらの四角括弧で指定するやり方、これで指定するやり方だと、`KeyError` ということで、「`f` はないですよ」というエラーが起きるんですね。

これが大きな違いかなというふうに思っています。`.get()` を使用するとこのように、`f` というキーがなくてもエラー起きず、通常の方法でやるとエラーが起きるというところですね。

押さえていただけたらなと思います。

[音楽]

23問目 if文を使って条件分岐

`if` を使って以下の処理を実装してください。

それでは回答です。

まあ単なるですね、`if` 文となります。ではやっていきましょう。

`num = -1` ということで、整数形で定義しておきます。

そしたらまず「正の場合」ということで、`if num > 0:` とすれば、まず一番最初の条件に当てはまります。

この場合、「正の値です」とという言葉を出力します。

で、そうでなければ、「なんだがゼロの場合」となっているので、これを `elif` とします。

`elif num == 0:` としてあげることで、2つ目の条件を書くことができます。

「この場合は値が0です」となりますね。

そしてどれにも当てはまらない場合は、ゼロでもなく正でもなければ `else` ということで、一番最後の条件、つまりこのプリント文表示となるのは、「負の値です」としてあげれば、これでは `-1` は「負の値です」、「0」の場合は「値が0です」、「1」の場合は「正の値です」と、このように知っているされました。

24目 論理演算子を使って複数条件の指定

以下の条件分岐に対応する実装を行ってください。

それでは解答です。

1つ前の問題と同じような流れで進めていきます。ではいきましょう。

`a` は整数ということで、まあ `a = 3` としておきましょう。

まず「0以上」をですね、`a >= 0` と「10%未満」で `a < 10` としてあげて、で、そして「10%未満」となっているので、これで `a < 10` としてあげます。

かつ「偶数」と言っているので、`&` としてあげましょう。

で、`& a % 2 == 0` で偶数ですね。

これが偶数です。

で、かつ「2桁」とかいた。

これは `&` と書いてあげましょう。

ということで、2つ、こちらの左側と右側の条件を `&` でつなげます。

この場合、「`a` は1桁の整数です」と出力しましょう。

そして `elif` ですね。

`elif` 次の条件 `elif a < 0:` で書きます。

「`a` が0未満」ということで、`a < 0` かつ「`a` が奇数」ですね。

奇数ということは、こちらと同じような形で、これが `a % 2 != 0` とすると、余りが1になるようなものだけ奇数になります。

ということで、この2つを掛け合わせると「`a` は奇数です」となります。

この辺はちょっと数学というか、中学校とかの数学を思い出しますね。

で、それ以外。

それ以外はまあ「単なる整数です」というふうに出力してあげましょう。

こんな感じですね。

で、これ見てあげると、`a = 3` なので「整数です」ということで、これに当てはまってなさそうな気がしますよね。

当てはまっていない。

まだ違いですね。

「1桁の整数です」さてここ、「偶数です」ですね。「整数です」になります。「奇数」なので、これが `a = 4` になると、ここに入って「偶数です」というふうになるわけです。

一応マイナスの値も確認しておきましょう。

`a = -4` 「整数です」と。

で、「負の奇数」の場合をここで出力したいので、このように `a = -3` とすると、「負の奇数ですよ」ということで、しっかりと条件が通っていることを確認することができました。

[音楽]

25問目 リストの要素を表示

下記リストの要素を先頭から順に出力しましょう。

それでは回答です。

複数の名前が入った `names` というリストから1つずつ取り出して出力したい場合には `for` 文を使用します。

`for name in names:` としてあげることで、複数の名前が入った `names` というリストから1つ取り出して `name` という変数に入れることができます。

これをプリント文で表示してあげると、このように順にですね、出力することができました。

26問目 時間関数レンジ関数を用いて0から9を出力しましょう

それでは回答です。

`range` 関数は一定の回数繰り返し使いたいときに用います。

まあ繰り返し使いたいというのは `for` 文の時ですね、使用します。

ではいきましょう。

`for i in range(10):` とします。

何回繰り返したいかという話なんですけれども、今回ですね、10回繰り返したいとしましょう。

今回で言うと0から9を出力するということで、まあ0から9の10個の数字を出すような形なので、`range(10)` としてあげましょう。

このようにしてあげることで、0から9までの値を出力することができました。

これですね、`range(0, 10, 2)` とすれば、0スタートでそこから20個取ってくる、といった書き方もすることができます。

27問目 強制終了

26問目の処理に追加で `i = 6` の時、「終了」と出力してループを抜け出せを実装しましょう。

それでは回答です。

`i = 6` の時、「終了」と出力するということで、`if i == 6:` という条件を追加しましょう。

で、この時に「終了」というふうに出力しますが、まずここがこのような形で書きます。

`print("終了")`

で、これでループを抜け出すということで、この `for` はですね、このループ処理をやめたいときには何をするかというと、ここに `break` っていうのを使います。

`break`

このようにすることで、6となった時に「終了」として、そして `break`、つまりこのループを終了するような形となります。

ではやってみましょう。

はい、ということで0から5までで、6番目はここで出力されずに「終了」となって `break` したような形になりました。

28問目 ループの途中で特定の処理を実行

26問目の処理に追加で `i = 3` の時のみ出力結果が出ないように実装しましょう。

それでは回答です。

`i = 3` の時のみということで、先ほどと同様に `if` 文で `if i == 3:` としましょう。

そしたらこの `i = 3` の時のみ出力しないという形なので、ここで何を行うかというと、`break` をしてしまうと `for` 文が終わってしまいます。

そうではなく、この処理、1回の処理をスキップしたいですよという場合は `continue` を使用します。

`continue`

このようにすることではい、0, 1, 2、3っていうのが飛ばされています。

というのは、3の時にこの `if` 文の中に入り `continue` が実行されて、下のプリント文が実行されずに次の処理に入っているっていう形になるんですね。

ということで、ここに `continue` を入れてあげればOKなわけです。

29問目 複数のリスト同時に処理

下記2つのリストを用意し、それぞれのリストから姓名を同時に出力しましょう。

それでは回答です。

複数のリストですね。まあ今回で言うと2つのリスト、まあ2つ以上の場合もそうですけれども、基本的に複数のリストから要素を同時に取り出したい場合というのは、`zip` 関数を用います。

今回で言うともう最初に書いてしまいますが、

`for last_name, first_name in zip(last_names, first_names):`

`zip` として同時に取得したいリストをこの中に入れてあげます。

`last_names` と `first_names`。

この2つのリストから一個一個取り出して、まあ `last_names` から `last_name` と、`first_names` から `first_name` というふうに取り出して出力しますよといった形になります。

なので、このようになすと `+` ファーストとしてあげることで、

`print(f"{last_name} {first_name}")`

はい、このように「加藤 雄一」「佐藤 拓也」「田中 太郎」というふうに、それぞれが `last_name` と `first_name` という変数に格納されて出力されているような形となります。

30問目 要素と同時にインデックス情報の取得

下記リストを用意し、要素とそのインデックスを取得した上で「XX番目のYYです」と出力しましょう。

それでは回答です。

リストの要素とインデックス番号同時に取得したい場合には `enumerate` 関数を使用します。

`for index, element in enumerate(my_list):`

このようにすることで、まず `index` と `element` を単独で取得できます。

そうすると0、加藤、1、佐藤ということで、この0, 1, 2というのは `index` を意味しています。これがインデックス、そして `element` はこの実際の要素の中身ですね、を取得してくれています。

ということで、これを用いて「何番目の」としてあげるために `f-string` を使います。

`f-string` ですね。

`print(f"{index}番目の{element}です。")`

ここで `index` 番目の `element` です、としてあげることで、「0番目の加藤です」「1番目の佐藤です」「2番目の田中です」といったふうに出力することができました。

31問目 内包表記

以下の2つのパターンで0から9未満の2の倍数が入ったリストを作成しましょう。

1. からのリストをあらかじめ用意し、`for` ループ内で `append` 関数を用いて要素を追加する場合。

2. 1行で同様のリスト `numbers` を作成する場合。

それでは回答です。

まずは `for` 文で0から9未満の倍数、0, 2, 4, 6, 8という数値が入ったリストを作成しましょう。

ではいきます。

まず `numbers = []` というからのリストを作成し、こちらですね、中身は何も入っていないような状態です。

ここで `for` 文を回します。

`for i in range(5):`

これに対して `numbers.append(2 * i)` で `numbers` というリストに要素追加します。

どんな要素を追加するかというと、まあ `i` というこの中には数値として0, 1, 2, 3, 4という数字が入ります。

この2倍の数字を入れてあげればいいので、`2 * i` としてあげることで、これに `numbers` には、はい、こういった形の要素が入っています。

もう一つですね、今回の本題でもある1行で、というのが内包表記になっています。

内包表記ちゃんと覚えましょう。非常に便利です。

`numbers = [2 * i for i in range(5)]`

として、ここにですね、どのような要素を入れるかというのを入れるんですけども、まあ上のですね、`for` 文で1回作っておくとですね、わかりやすかったりします。

ここが `2 * i` として、まず最初に可でしたんですか。

`for i in range(5):`

これで全く同じことを実現することができます。

どういうことかというと、ここは `for` 文です。

もう見て皆さん見ての通りですね、わかるかと思うんですけど `for i in range(5)` がここに書いてあるのと同じことです。

で、この中で `i` というのが `for` 文で回されるんですけれども、それを使って要素に追加しますよと、リストの中に要素を追加しますよって時にこのような表現をします。

`i` をそのまま追加するのがなくて2倍した値を要素に追加して `numbers` というリストに入れてあげましょうねっていう意味です。

だから実行すると、`numbers` には0, 2, 4, 6, 8というのが入って、これは3倍すると0, 3, 6, 9という値が入るような形となります。

このようなですね、ワンライナー、1行で書く方法を内包表記というふうに呼びます。

[音楽]

[音楽]

32問目 ゼロであっただけの例外処理

10を `num` で割った時の結果を出力しましょう。

ゼロで割った、つまり割れない場合に「エラー」と出力しましょう。

それでは回答です。

10を `num` で割った時の結果を出力ということで、まずは `num` のですね、値で定義しておきましょう。

`num = 4` といただけます。

これで10を `num` で割るというのは `10 / num` という形になります。

で、これはを出力するということでプリント文で `f-string` を使いましょう。

`print(f"10 / {num} の結果は {10 / num} です。")`

はい、このような形で2.5という結果が出ます。

ただしこれが `num = 0` ですね。ゼロになるとこのようにエラーが出てしまいます。

ならこの場合エラーが起きないように「エラー」と単純にプリント文で出力するような形にしたい場合は、どのようにするかというと、エラーが起きるかもしれないこの文に対して、`try` というもので囲ってあげます。

`try:`

`except:`

の中に入れてあげます。

そしたらここでエラーが起きたとしても、何か者の対応することができて、`except` としてあげましょう。

`except:`

例えばですけれども、`print("エラー")` としてあげれば、一旦これはですね、4で割っているのでそのままエラー起こらず結果2.5と出てきますが、これだといいかもしれないですね。

ここで `num = 0` とします。

`print(f"10 / {num} の結果は {10 / num} です。")`

これ実行してみましょう。先ほどが `ZeroDivisionError` というふうに出た、まあ実際にエラーが出だと思うんですけど、エラーメッセージ違う。

そうだなんて、実際ここでエラーが発生したので、エラーが発生した場合この `except` 方の処理を実行しますよということで、「エラー」というのが出力されました。

33問目 具体的なエラー内容の出力

10をある数字 `num` で割った時の結果を出力しましょう。

また、エラーが `ZeroDivisionError` だった場合にエラー内容を出力しましょう。

それでは回答です。

先ほどの処理に加えていきたいと思います。

こちらの `except` の部分ですね。

`except ZeroDivisionError as e:`

と書かないとまずいかもしれないですね。

こちらで `except`。

ここでこのように実行すると `division by zero` と出てくるんですけど、`ZeroDivisionError` というのがエラー名です。

ここで `ZeroDivisionError` とコピーしてあげて、この `except` のところですね、ここを消して、`except ZeroDivisionError as e:` としてあげましょう。

このよう にすることで `ZeroDivisionError` というエラーだった場合にこの中に入ってきます。

つまり他のエラー、`ZeroDivisionError` じゃないエラーの場合はスルーされてしまうんですけれども、この `try` 文の中で起きたエラーが `ZeroDivisionError` だった場合にかぎり、この中の処理を実行します。

という ことで、この中の処理をそのまま `print(e)` としましょう。

そうすると `division by zero` となっています。

つまりこれ何が起こっているかというと、ここでゼロで割ったからエラーが起きてますよ。

で、そのエラー内容は `ZeroDivisionError` ですよ。

その `ZeroDivisionError` というのを `e` としてこちらの中で使用しています。

という形ですね。

その中にが `division by zero` という風にやっているわけです。

このようにしてあげると、エラーの内容によってば分岐を作ることができますので、`ZeroDivisionError` だったらこうしたい。

`ZeroDivisionError` じゃない他のエラーだったらこうしたいというふうに、エラーごとに対処方法を変えることができます。

34問目 エラー内容ごとの例外処理

次の `divide` 関数では、変数 `a` と `b` がそれぞれ数値の場合に正常に数値計算が行われます。

`a` または `b` が文字列の場合、つまり数値の方と異なる場合の例外処理を `except` 追加して実装しましょう。

それでは回答です。

まずこの `divide` 関数がしっかり動くかを確認しましょう。

`divide(10, 2)` とするとこのように `5.0` と出てきて、そしてまあ `divide(10, 0)` とするとこちらの `ZeroDivisionError` の方に入るので、このプリント部分が出力された形となります。

これに対して、あらたに例外処理を追加するわけですけれども、例えばですね、ここ `a = "10"` としたですね、これどうなるかというとエラーが発生するわけですよね。

違いますよと、`int` と `str` だと計算できませんよという `TypeError` が発生しているので、この場合の例外処理もですね、追加しておく必要があります。

ということで、頭に追加するべきは `except TypeError as e:` としてあげて、同様にエラー文を出力してあげればいいわけですよね。

基本的にここでエラーが起きるとしたらゼロで終わってしまった、もしくは `TypeError` で方が違うのに計算しようとしてるよという場合にエラーが起きます。

ただこちら `divide("10", 2)` としてみましょう。

はい、このように `unsupported operand type(s) for /: 'str' and 'int'` というふうに出ました。

これでもエラー文が出る、実際のエラーがレポート出力されるというよりも、こういった形で例外処理を行うことができたわけです。

同様に他のものに関しても、まあゼロで割ったとしてもこのような形になりますし、ここ、なんでしょうね、例えばこんな文字列にしたとしても、「こんなの出来ませんよ」という風に2つ目の例外処理を書き加えることができました。

35問目 通常終了時に行う処理

先ほどの `divide` 関数で例外処理が発生しなかった場合に「正常に終了しました」と表示されるようにしましょう。

それでは回答です。

正常に終了した場合の処理を書き加えましょう。

その場合は `except` ではなく `else` を追加します。

`else:`

`print("正常に終了しました。")`

と、してあげましょう。

で、このようにしてあげることで、実行して、これは正常に終了していないですが、ここで例えば `a = 10`, `b = 2` としてあげると、計算結果 `5.0`、「正常に終了しました」ということで、しっかりここエラーを取らず終了した場合はこちらの `else` も実行されるような形となりました。

36問目 例外も含めた終了時に行う処理

先ほどの `divide` 関数で例外処理発生の有無に限らず、すべての処理が「終了しました」と表示されるようにしましょう。

それでは回答です。

例外処理が発生したかどうかに限らず、必ずこの処理を行ってねというものを追加したい場合には、先ほどのこの `else` ではなく `finally` というものを追加してあげます。

`finally:`

`print("すべての処理が終了しました。")`

で、このようにしてあげることで、まあ例外が発生しようがなかろうが処理をここでですね、行うことができます。「すべての処理が終了しました」としておきましょう。

これ を実行します。

`a = 10`, `b = 2` としたら、こちらで10割る2ということでちゃんと計算できた場合に「すべての処理が終了しました」という出力が出ますし、そうではなくゼロで割った場合というのもエラーが起きてるんですけれども、「すべての処理が終了しました」となりますし、同様にこのように文字列やっても「すべての処理が終了しました」という形で出力することができました。

ということで、例外が発生した、発生してない関係なく何かの処理を行いたい場合は `finally` を追加しましょう。

37問目 例外をスルー

こちらの `divide` 関数で `TypeError` の例外処理が発生した場合、何も処理を行わずスルーしましょう。

それでは回答です。

この `TypeError` のこの処理ですね。例外処理が発生した場合に今まで はここでこのプリント文でこちらのエラー内容を出力していましたが、そうではなく何も処理を行わない場合どうしたらいいのかというと、このプリント文を消します。

そしてここには `pass` と描きます。

`pass`

これで実行してあげると、はい、消えました。

ここで実際にはエラーが起きてこの処理が行われているんですけども、`pass` を記述したことによって、ここの中の処理何も行わずに最後の `finally` を出力して終わったという形になります。

このように例外処理ですね、`finally` と `else`、`pass` といったものを様々 なものを組み合わせて例外処理をですね、より効率よくを行っていくことができます。

[音楽]

38問目 クラスの基礎

`Person` クラスを用意し、クラス変数として `nationality` を設定し、クラスメソッドとして `say_hello` を実装しましょう。

`say_hello` メソッドでは「今日は私の国籍は〇〇です。」と出力するようにしましょう。

〇〇には国籍名 `nationality` が入ります。

それでは回答です。

まずはクラス `Person` ということで作っていきますが、クラスを定義する時には最初に `class` と書き、大文字で `Person` と書きます。

で、後の後ろにコロンとしてあげて、まずはクラス変数ということで設定します。

`nationality = "Japan"`

ここに設定するな `nationality` で、今回 `Japan` をつけておきます。

そして今回メソッドとして `say_hello` というのを用意する必要があるので、このクラスの中に `def say_hello(self):` というの入れます。

で、ここのクラスの中の関数の夜メソッドの中には `self` というのを必ず入れないといけません。

そしてこの中はプリント文で、

`print(f"今日は私の国籍は {self.nationality} です。")`

「今日は私の国籍は〇〇です。」としたいんですけれども、この〇〇に入るのは `nationality` でしたね。

ただこの `nationality` だけだと、このインスタンスごとの `nationality` での指定することができないよね。

これは必ず `self` というのをつけてあげる必要があります。

`self.nationality`

`self` とはなんだのって話なんですけれども、ここはですね、私のクラスの動画とかをですね、見ていただけるとよりわかるかなと思いますので説明はこちら割愛します。

ということで、ここに `self.nationality` としてあげることで、まずですね、クラスを定義することができました。

そしたらインスタンス化してあげて、

`person = Person()`

として、ここでクラスのまあインスタンス化を行います。

そしたらこの `person` の中の `nationality` という変数にはこの `Japan` という値が入っていて、このインスタンス `person` の `say_hello` メソッドに対しては、

`person.say_hello()`

「今日は私の国籍は Japan です。」となっています。

というのは、この `self.nationality` というのが、いわゆるこの `person` が持っている変数に値するので、`self.nationality` は `person.nationality` はということで、まあ全部同じなんですけれども、今回は `nationality` が `Japan` という値で設定されているので、「今日は私の国籍は Japan です。」という形になりました。

39問目 コンストラクターの設定

先ほどの `Person` クラスにコンストラクター(インスタンス生成時に呼び出される関数)を使って引数 `name` を設定して `name` というインスタンス変数を持たせましょう。

また、「say_my_name」という自分の名前を出力するクラスメソッドを実装しましょう。

それでは回答です。

まずはコンストラクターを作成しましょう。

コンストラクターですね、ここに `def __init__(self, name):` と書いて、アンダーバーアンダーバー `init` アンダーバーアンダーバーというのを作ります。

これがコンストラクターになります。

で、この中に `self` というのを言って、今回引数でですね、コンストラクターインスタンスを生成する際にで `name` という変数を設定します。

ただここに引数には `name` というのを入れてあげましょう。

そして `self.name = name` とします。

つまりこの引数で採ってきたものをここに入れて、`self.name` というのはまあインスタンスの `name` と変数に引数で採ってきた `name` というものを入れてあげますよという形になります。

ちょっと難しいですね。この辺は先ほどお伝えしたように私のクラスの動画を見ていただくとよりわかるかなと思います。

そしてもう一つが `def say_my_name(self):` というのを作りますね。

ここも `self` という引数を入れてあげた上で、ここに `print(f"私の名前は {self.name} です。")` とします。

`f-string` を使いましょう。

`self.name` です。

としてあげます。

このようにすることで `self.name` インスタンスの名前をとってくることができるので、例えばマイクだったらマイクですとか、今西だったら今西ですという形になります。

まず再提起しましょう。

そしたら `person = Person("今西")` というインスタンスを作りましょうか。

`Person` で床に `今西` という名前を得ていただけます。

というのは、この `__init__` の中にここに `name` という引数を用意しますよね。

なのでここに `今西` っての入れてるわけです。

これでインスタンス化してあげるとコンストラクターが起動して、このインスタンスの `name` に `今西` っていうのを入れてくれているわけです。

なのでここの `person.nationality` を見ると、「Japan」というのが設定されていますが、これもうデフォルトでですね、ここに設定されていますが、`person.name` とすると引数で設定した「今西」っていう文字がここに入っています。

で、もう一つ `person.say_my_name()` と、というのを、してあげると、ここで「私の名前は今西です」というふうに、このですね、関数メソッドを出力することができました。

40問目 クラスの継承

先ほどの `Person` クラスを継承した `Kid` クラスを作成しましょう。

その際に自分の年齢を出力するようにクラスメソッド `say_hello` を変更し ましょう。

それでは回答です。

まずは `Kid` クラスを作成します。

クラスの作成は先程と同様で `class Kid(Person):` とします。

今回は継承します。先ほど作成した `Person` というクラスを継承して新たに `Kid` クラスを作りたいので、継承したいい `Person` というクラス名はここに記載してあります。

で、ここのでコロンを入れて、今回 `def say_hello(self, age):` というのを新たに上書きして作ります。

で、ここでまあ `age` というのを引数にとってあげて、こう何をするかというと、

`print(f"私の名前は {self.name} です。年齢は {age} 歳です。")`

とします。

はい、これできっとですね、クラスの `Kid` だといえばですね、そうすれば `kid = Kid("健介")` というインスタンスを紐解く、`Kid` クラスをインスタンス化します。

となった時に、これでインスタンスができるかというとできません。

なぜかというと、先ほどの `Person` というクラスにはコンストラクター、こちらの `__init__` には `name` を指定しなければいけないっていうのを設定しているので、ここには引数にちゃんと名前を入れる必要がありますが、ここにまあ例えばですけれども `健介` という名前を入れて、これでインスタンス化してあげましょう。

そうするとここに `kid.name` には「健介」が入っていき、`kid.nationality` には「Japan」が入っています。

というのは `Person` という先ほどのクラスを継承しているので、クラスの `Person` というクラスの中に入っていた `nationality` を引き継いでます。

かつこの「健介」というのを指定したので `name` には「健介」というのが入っています。

そして `def say_hello` です。

新たにこちら作った `say_hello` を実行してみると、`kid.say_hello(age=12)` と引数に年齢を入れる必要があるので、例えば12としてみましょう。

これで実行してみます。

「私の名前は健介です。年齢は12歳です。」ということで、この引数に設定した値をここに入れることができたので、これで完成となります。