こんにちは、晶(あき)です。
8月15日からPythonの勉強を始めて、25日目になりました。
累計学習時間は約32時間。
昨日はまとまった時間が取れなかったので、模試を通して解く代わりに、これまで曖昧だったところを一つずつ復習しました。
Pythonエンジニア認定基礎試験に向けて問題演習を続けています。
Prime Studyの模試では、前回あと3問で合格ラインというところまで来ました。
あと少し。
……なのですが、問題を解けば解くほど、
「ここ、ちゃんと理解できてなかったな」
という部分が次々と出てきます。
今回は模試をもう一度通して解くのではなく、問題演習で見つかった弱点をひとつずつ掘り下げて復習しました。
エスケープシーケンス|バックスラッシュの数をちゃんと見る
まず引っかかったのが、エスケープシーケンス。
\nなら改行。
ここまでは覚えていました。
ところが、バックスラッシュそのものを文字として扱う場合が混ざると、一気に怪しくなります。
今回改めて分かったのは、見た目だけで
「\nがあるから改行!」
と判断しないこと。
バックスラッシュが複数ある場合は、左から順番に「どのバックスラッシュが何をエスケープしているのか」を確認する必要があります。
なんとなく見た目で解いていたところだったので、要注意ポイントとして教材に書き込むことにしました。
二重のリスト内包表記|普通のfor文に戻せばいい
二重のリスト内包表記も、以前から苦手なところです。
一行にforがいくつも並ぶと、それだけで頭の中がごちゃごちゃしていました。
今回、かなり分かりやすかったのが、
「先頭の式をappendするものと考えて、forは左から順番に展開する」
という考え方。
複雑な内包表記を、そのまま頭の中だけで処理する必要はありません。
分からなければ普通のfor文に戻して考えればいい。
これだけで、かなり追いやすくなりました。
試験中に二重内包表記が出てきても、焦らず一度普通のfor文に変換して考えることにします。
ジェネレーター|「一つずつ渡す」でようやく分かった
今回、一番じっくり確認したのがジェネレーターです。
最初は、
「returnがなかったらジェネレーター?」
「appendもジェネレーター?」
と、かなり曖昧な状態でした。
リストとジェネレーターの違いを整理して、ようやく自分の中でしっくりきたのが、
リストは値を全部作って持っておく。
ジェネレーターは必要になったときに一つずつ値を渡す。
というイメージです。
空のリストを作り、appendで値を追加して、最後にreturnする。
これは値を全部リストにためてから完成品を返しているので、ジェネレーターではありません。
一方、yieldを使ったジェネレーター関数は、一つ値を渡したところでいったん処理を止め、次に必要になったところから続きを実行できます。
今までは「yieldが出てきたらジェネレーター」と暗記していましたが、仕組みが少し分かったことで覚えやすくなりました。
super()|親クラスの処理をもう一度書かなくていい
クラスの継承とsuper()も復習しました。
問題自体は追えても、
「そもそも、なんでこんな仕組みが必要なんだろう?」
というところが自分の中で曖昧でした。
親クラスにすでにある処理を子クラスでもう一度書くのではなく、super()を使って親クラスの処理を再利用する。
つまり、同じコードを何度も書かなくていい。
これが分かると、一気に納得できました。
Pythonを勉強していると、こういう「すでにあるものを再利用する」という考え方が何度も出てくる気がします。
nonlocal|「この変数、私のローカルじゃありません」
スコープ関連では、nonlocalをかなり掘り下げました。
内側の関数で変数に値を代入すると、通常はその関数のローカル変数になります。
ところがnonlocalを宣言すると、新しいローカル変数を作るのではなく、外側の関数にある変数を使うことができます。
さらに、内側の関数からその値を書き換えることもできます。
globalが一番外側の変数を対象にするのに対して、nonlocalは外側の関数にある変数を対象にする。
ここは混同しないようにしたいところです。
正規表現はまだ覚えられない
そして現在も苦戦しているのが正規表現。
\d、\w、\sなど、記号を見るたびに、
「あなた誰でしたっけ?」
となっています。
正規表現は一気に覚えようとせず、記号を一つずつ分解して読むことにしました。
数字なのか、文字なのか、繰り返しなのか。
暗号のような文字列を丸ごと覚えるのではなく、一つずつ日本語に翻訳していく。
ここはまだまだ復習が必要そうです。
参考書を「自分専用の弱点攻略本」にする
32時間勉強してきて、勉強方法も少し変えることにしました。
これまでは参考書をなるべくきれいに使っていました。
でも、試験までに何度も同じところを確認するなら、もう直接書き込んでしまおうと思います。
記号も決めました。
- ✓:理解・確認済み
- ★:覚えたい、試験前に確認
- ⚠:何度も間違える
- ?:まだ理解が怪しい
さらに、赤・黒・青のペンとマーカーを使って、自分が間違えたところや、自分なりの覚え方を書き込んでいきます。
試験当日は全部を読み返すのではなく、★や⚠を中心に確認する予定です。
参考書をきれいに保存するのではなく、自分が間違えるところを集めた攻略本に改造することにしました。
32時間勉強して、ようやく「Pythonの考え方」が少し見えてきた
32時間勉強しても、まだ分からないことはたくさんあります。
むしろ問題を解けば解くほど、
「ここも理解が浅かった」
というところが出てきます。
でも、勉強を始めた頃とは少し変わってきました。
以前はコードを見て、
「何をしているのか分からない」
で止まっていました。
今は、
「これは何をしている?」
「なぜこんな仕組みがある?」
「つまり、こういうこと?」
と、一段ずつ掘り下げられるようになってきました。
内包表記なら短く書く。
ジェネレーターなら必要なものを一つずつ渡す。
継承やsuper()なら、すでにある処理を再利用する。
少しずつですが、
同じことを何度も書かない。すでにあるものを使う。必要なものを必要なときに扱う。
そんなPythonの合理的な考え方が見えてきた気がします。
Prime Studyは、前回あと3問。
次の模試では、今回潰した弱点がどれくらい点数につながるのか確認してみます。
まだまだ勉強は続きます。


コメント