こんにちは、Pythonエンジニア育成推進協会 顧問理事の寺田です。私は試験の問題策定とコミュニティ連携を行う立場です。
実践試験Tipsは、当協会のPython3エンジニア認定実践試験を受験される予定の方に向けて、何回かに分けてちょっとした情報をお伝えしていく目的で作成しています。
前回はPython3エンジニア認定実践試験とはどういった試験なのか、その主教材との向き合い方や試験に向けて押さえておくべきポイントとして、主教材のChapter1とChapter2についてお話しました。
今回は主教材のChapter3 Pythonの言語仕様についてお話したいと思います。
■学習のポイント:Chapter3 Python言語仕様について
Python3エンジニア認定実践試験は、主教材「Python実践レシピ」(技術評論社)の中から出題されます。
出題範囲については以下のページをご確認ください。
さて、今回はChapter3のPythonの言語仕様です。
この試験と主教材に限らず、Pythonの言語仕様に関しては基礎試験でもやっている範囲になりますので、基本的な文法に関しては既に学習済みであることを前提としています。そのため、実践試験においては主教材ともに基本的な文法については触れていません。チュートリアルから1歩進んだところ、つまり、基礎試験では押さえきれなかった部分の言語仕様が対象となります。
Chapter3からの出題は17.5%となっており、出題数は7問になりますので、出題枠が多い部類になります。ここは全問正解する勢いでやっていただくのが重要になるかと思います。
■Chapter3 言語仕様
さて、この章では例外処理、with文、関数の引数、アンパック、内包表記、ジェネレータ、デコレーターの7項目があります。例外処理やwith文は普段からPythonを書いている人にとっては難しいものではないと思います。
▽例外処理
例外処理の中の独自例外の定義に関しては、そんなに多くの場面で使うことが無い可能性があるため、普段やったことが無い方が多いかもしれません。とはいえ、大きなシステムを作るようなケースでは、特定の独自例外を作ることが出てきます。そのため、例外の作り方を学んでおけば、必要になったときにそんなに困ることなく作り込めるのではないかと思います。
▽with文
with文を使用すること自体は一般的に広まっていることだと思いますが、with文の本質はコンテキストマネージャと呼ばれるものであり、処理の途中で何らかの現象が発生したとしても必ずfinally処理が行われるといったところに特徴があります。
つまり、最初に入る時と出る時の挙動をコンテキストマネージャーで決めておくことで、決められた挙動を取ってくれるということになります。
with文についてはclassや特殊メソッドについて理解していない場合には、この文章を読んだだけでは理解できないかもしれません。その場合には、Chapter4で紹介されているclass構文と併せて読んでみてください。そうすると、コンテキストマネージャというものをwith文がラップして上手く動いてるのだということが分かるかと思います。
実際にI/O処理する場合は、ほとんどがwith文で書かれるのが一般的になっています。そのため、finally処理やclose処理を気にせずに書けるということがwith文の重要な用途であるということは覚えておいてください。
▽関数の引数
厳密に知っている方にとってはよく知っている内容かと思いますが、実際の現場で見ていると、位置引数とキーワード引き数の使い分けを意識して使用している人がそんなにいないという印象があります。これに関してはPythonのチュートリアルにも書いてありますが、そこまで注目している方はあまりいないようです。実際、デフォルト付きの引数がどの場面で使えるのか、またはデフォルト付き引数の評価タイミングを知らなかったという方は結構いますので、実践レシピでは一通り解説を入れています。
また、よく利用されている構文である、可変長の位置引数(例:*args)や可変長キーワード引数(例:**kwargs)がありますが、この辺りに関してはPythonの基礎的なものとして主教材で紹介した上で出題範囲にも入れています。
これ以外に、キーワード専用引数や、キーワード専用引数、*を使った後の引数、/を使った後の引数がどのような挙動をするかという部分も含まれています。この辺はPythonにとって比較的新しめな仕様になっていますので、知らない人が多いかと考えて紹介しています。
▽アンパック
アンパックは、タプルやリストの2要素以上でも同時に一気に代入できるというものになります。
ここも普段から使っているものだと思いますので、読んで頂ければすんなり理解できるかなと思います。
▽内包表記
内法表記はよく使っているかと思いますが、苦手だと思っている方については、しっかり学んでもらう必要があるかと思います。
内法表記のシリーズには、リスト、辞書、セットの3つがあります。これに似た形ものとして、ジェネレータ式と呼ばれる、丸括弧で書かれるものがあります。丸括弧であるため、タプルなのかなと思いきや、実際にはジェネレータ式ものです。。
▽ジェネレーター
ジェネレーターはよく使う方にとっては便利に感じるものだと思いますが、やはり使いにくい、わかりにくいと感じる方は多いかと思います。ジェネレータはreturnの代わりにyieldキーワードを使い、順次生成したものが呼び出されたときに作られていくというものになっています。
効率よくデータを生成していくことができるため、メモリーを全部消費してしまうような大きなデータを返す時に非常にメモリー効率がいいコーディング方法です。
Pythonのコア機能でジェネレータはよく利用されているため、内部的にジェネレーターで返されるものはよくありますので、自分でも書けるようにじっくり勉強してみてほしいものになります。
▽デコレーター
デコレーターは「@」で表記されるもので、フレームワークなどを使っている方はよく使うかと思います。また、データクラスなどを定義する際、クラスデコレーターというものを使って、@から書いて、処理をラップするという書き方もあります。
関数などをデコレーションするためのデコレーター(装飾する)であるため、内部で行われる機能はそのままに、外側でラッピングしてあげるような形のものになります。
書籍ではなるべく簡潔にわかりやすく書いたつもりではありますが、デコレーターを作る必要性や、なぜそうなるのかといった部分についてはどうしてもわかりにくい部分はあるかと思いますので、この部分の学習については一度自作してみることが最も近道かと思います。
よくあるデコレーターの使い方としては、キャッシング(キャッシュ)があります。これは、内部の処理を毎回実行せず、結果をそのまま返すようにするものです。
また、ログを出力する際に内部の実装を変更せずに、たとえば @my_log のようなデコレーターを付けるだけで、自動的に処理の中でログを取得できるようにする、といった使い方もできます。
このように、デコレーターにはさまざまな使い方がありますが、まずは使い方を覚え、自作するところからスタートするのが一番かと思います。
きちんと動くデコレーターを自作できるようになれば、Pythonの理解度が一歩進んだと言えます。
デコレーターは、関数を引数として受け取る際は二重にし、さらに引き数を引き取る場合には三重にするように関数をネストする必要があります。そのため、最初は「なんだこの構文は?」と驚くような構文が出てきます。デコレーターに慣れていない人にとっては少しとっつきにくいですが、慣れてくると、Python の実際の機能を活かしてさまざまな処理を実装できるものが作れるようになります。100%理解できていないと試験に合格できないというものではないものの、ある一定のレベルで理解できるようにして頂ければ自身の実力も上がってくるのではないかと思います。
Chapter3のポイントについてはここまでにします。
次回のTipsではChapter4のクラスについてお話します。
