kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Python の基礎知識を証明できる「Python 3 エンジニア認定基礎試験」に合格した

先週末に「Python 3 エンジニア認定基礎試験」を受験し,問題なく合格した.試験問題に関係する内容は NDA を厳守するため書かず,今回は「試験紹介(普及のため!)」と「勉強方法」にフォーカスする.

Python 試験とは?

「一般社団法人 Python エンジニア育成推進協会」が提供する Python 試験は2種類ある.現在受験できるのは「認定基礎試験」で,「認定データ分析試験」は今年開始予定とアナウンスされている.

  • Python 3 エンジニア認定基礎試験
    • 概要 : 文法基礎を問う試験
    • 2017å¹´6月開始
  • Python 3 エンジニア認定データ分析試験
    • 概要 : Pythonを使ったデータ分析の基礎や方法を問う試験
    • 2019年夏開始予定 🚧

もともと「認定データ分析試験」を受験しようと考えていたけど,調べてみるとまだ開始されていないことに気付き,その前に Python の理解度確認をする意味も兼ねて,今回「認定基礎試験」を受験したという経緯がある.あと個人的に資格コレクションをしていて,今回合格した「認定基礎試験」を含めると「計38個目(期限切れも含める)」になる.

www.pythonic-exam.com

試験概要

「Python 3 エンジニア認定基礎試験」の試験概要を公式サイトを引用しながら紹介する.まず,実施は Odyssey となるため,会場ごとに受験可能日が異なり,予約が取れれば希望日に受験できる.料金は10800円となる.僕は「有楽町会場」で受験した.過去に「Rails 技術者認定試験」で利用したことがある.

  • 受験日 : 通年(予約が取れれば)
  • 会場 : Odyssey CBT テストセンター
  • 料金 : 10800円(学割だと5400円になる)

cbt.odyssey-com.co.jp

問題数は「40問」となり,合格ラインが「70%」と公開されているため,単純計算で「28問正解」がボーダーラインとなる.

  • 問題数 : 40問(選択問題)
  • 試験時間 : 60分
  • 合格ライン : 正解率 70%

www.pythonic-exam.com

試験範囲

「Python 3 エンジニア認定基礎試験」の特徴的な点は「主教材を指定していること」と「章ごとの出題数を公開していること」だと思う.主教材は「Python チュートリアル 第3版」となり,試験専用の本ではなくオライリー本が選ばれている点は個人的に素晴らしいと感じている.

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

既に「Python チュートリアル 第3版」の書評記事を書いている.

kakakakakku.hatenablog.com

「章ごとの出題数」は以下のように公開されている.勘に頼る必要もなく,主教材を全体的に学ぶ必要がある.

セクション 出題数 出題率
1章. 食欲をそそってみようか 1 2.5%
2章. Pythonインタープリタの使い方 1 2.5%
3章. 気楽な入門編 6 15.0%
4章. 制御構造ツール 9 22.5%
5章. データ構造 7 17.5%
6章. モジュール 2 5.0%
7章. 入出力 1 2.5%
8章. エラーと例外 4 10.0%
9章. クラス 2 5.0%
10章. 標準ライブラリめぐり 4 10.0%
11章. 標準ライブラリめぐり - PartII 1 2.5%
12章. 仮想環境とパッケージ 1 2.5%
13章. 次はなに? 0 0%
14章. 対話環境での入力行編集とヒストリ置換 1 2.5%

Python コードを書く & 読む

重要なのは主教材を読むだけではなく,実際に Python コードを書いたり,読んだりすることだと思う.オススメは「Jupyter Notebook」で,Markdown で Python コードとメモを合わせてドキュメント化することができる.他にも「PyCharm」をインストールしておくと,コードを書きやすくなるし,「PyCharm Python Console」は IPython に対応していて,インタラクティブに動作確認をするときにも便利に使える.

jupyter.org

模擬試験(無料)

認定スクール「DIVE INTO EXAM」から無料で提供されている模擬試験がある.まだ β であると記載されているけど,計80問あり,試験同様に計40問出題される.模擬試験の受験回数に制限はなく,何度も何度も繰り返し受験できる.少なくとも1度は受験しておくと良いと思う.

diver.diveintocode.jp

試験結果レポート 🎉

試験を終えると,すぐに試験結果レポートが出る.満点合格できたら良いなぁーと考えていたけど,今回は「925点」となり,計3問間違えてしまった!残念すぎる.セクションごとに正解率も出るし,個人的に間違えた箇所も全部把握できている.むむ!

セクション 正解率
1. 食欲をそそってみようか 100%
2. Pythonインタープリタの使い方 100%
3. 気楽な入門編 100%
4. 制御構造ツール 89%
5. データ構造 86%
6. モジュール 100%
7. 入出力 100%
8. エラーと例外 100%
9. クラス 100%
10. 標準ライブラリめぐり 75%
11. 標準ライブラリめぐり - PartII 100%
12. 仮想環境とパッケージ 100%
13. 対話環境での入力行編集とヒストリ置換 100%

まとめ

  • 「Python 3 エンジニア認定基礎試験」に合格した
    • 取得済資格 : 計38個目(期限切れも含めると)
  • 主教材を読むだけではなく,実際に Python コードを書いたり,読んだりする勉強方法が1番効果的だと思う
  • 無料で受験できる模擬試験も,少なくとも1度は受験しておくと良いと思う
  • 今年の夏に「Python 3 エンジニア認定データ分析試験」が開始される予定なので,公式 Twitter は要チェック!

twitter.com

Python の理解度確認をするために「Python チュートリアル 第3版」を読んだ

オライリーから出版されている「Python チュートリアル 第3版」を読んだ.読者対象として「Python 入門者のための」と書いてあるけど,そこそこ難しい内容もあり,中級者でも楽しめる内容になっている.本書の最初に載っている「訳者まえがき」にも,理解度によって読む方法を変えて良いと書いてあった.今回本書を読んでみて,勉強になった部分を整理しておこうと思う.なお,本書は「Python 3.5.1」をサポートしている.さらに付録もあり,特に「付録E」と「付録F」は面白かった.

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

目次

  • 1ç«  : 食欲をそそってみようか
  • 2ç«  : Pythonインタープリタの使い方
  • 3ç«  : 気楽な入門編
  • 4ç«  : 制御構造ツール
  • 5ç«  : データ構造
  • 6ç«  : モジュール
  • 7ç«  : 入出力
  • 8ç«  : エラーと例外
  • 9ç«  : クラス
  • 10ç«  : 標準ライブラリめぐり
  • 11ç«  : 標準ライブラリめぐり - PartII
  • 12ç«  : 仮想環境とパッケージ
  • 13ç«  : 次はなに?
  • 14ç«  : 対話環境での入力行編集とヒストリ置換
  • 15ç«  : 浮動小数点(float)の演算:その問題と限界
  • 16ç«  : 補遺
  • 付録A : 用語
  • 付録B : Python のドキュメント群について
  • 付録C : 歴史とライセンス
  • 付録D : コピーライト
  • 付録E : Python初心者だった頃─みんながひっかかるPythonのヘンなとこ
  • 付録F : Python 2を読んだり書いたりせざるを得ない人へ

python -i オプション

2章「Pythonインタープリタの使い方」の中で,コマンドラインから python -i で実行すると,実行後にインタラクティブモードに入るという内容があり,今まで使ったことがなかった.サクッとデバッグをするときなどに使えそう.例えば,以下のように変数を宣言するコード name.py を用意する.

name = 'kakakakakku'

次に python -i で実行すると,そのままインタラクティブモードになり,変数を確認することができる.

$ python -i name.py
>>> name
'kakakakakku'
>>> quit()

docs.python.jp

ビルトイン変数 _(アンダースコア)

3章「気楽な入門編」では,データ型の紹介がメインだけど,インタラクティブモードの紹介もある.最後に表示した式はビルトイン変数 _(アンダースコア)に代入される.覚えておくと,使える場面もありそう.

$ ipython
In [1]: 100 * 5
Out[1]: 500

In [2]: _
Out[2]: 500

ただし,ローカル変数としても設定できてしまうため,結果としてビルトイン変数を隠蔽することに繋がってしまう.気を付けよう.

$ ipython
In [1]: _ = 1000

In [2]: 100 * 5
Out[2]: 500

In [3]: _
Out[3]: 1000

PEP 8 : Style Guide for Python Code

4章「制御構造ツール」の最後にコーディングスタイルとして「PEP 8 : Style Guide for Python Code」の紹介も載っていた.「PEP 8」だと,インデントはタブではなく,4スペースが推奨されている.

www.python.org

リスト内包

5章「データ構造」は基本的なデータ構造の解説だった.リストを生成するときに「リスト内包」が使えることは覚えておくと良さそう.単純に for を複数書けるだけではなく,if で条件を設定することもできる.とは言え,可読性とトレードオフになる可能性があるので,メリットがある場合に使う.

$ ipython
In [4]: [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
Out[4]: [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

docs.python.jp

標準ライブラリ

11章「標準ライブラリめぐり - PartII」では,以下のライブラリなどが紹介されていた.

  • reprlib.repr()
  • textwrap.fill()
  • locale.format()
  • struct.unpack()
  • threading.Thread
  • logging
  • weakref.WeakValueDictionary()
  • collections.deque
  • bisect.insort()

weakref など,今まで使ったことがない標準ライブラリもあり勉強になった.collections.deque に関しては既にまとめてある.

kakakakakku.hatenablog.com

pyvenv → venv

12章「仮想環境とパッケージ」では,pyvenv と pip の紹介がある.本書は「Python 3.5.1」をサポートしているが,「Python 3.6」で pyvenv は非推奨になり,現在は venv が推奨になっているので,注意が必要かも.

The pyvenv script has been deprecated as of Python 3.6 in favor of using python3 -m venv to help prevent any potential confusion as to which Python interpreter a virtual environment will be based on.

docs.python.org

実は本書はウェブでも公開されていて,既に「Python 3.6.5」をサポートしている.最新版を読むと venv 前提で書かれている.量が多いため,個人的にはウェブよりも本の方が読みやすかった.

docs.python.jp

リンク集

13章「次はなに?」はリンク集になっている.Python を勉強するときに参考にすると良さそう.

正誤表

非常に多くの誤植があるので,読むときは正誤表も合わせて確認する.実は正誤表に載っていない誤植を1箇所発見していて,xiv にある 5.1.4 は「れ子」ではなく「入れ子」になるべき.

www.oreilly.co.jp

まとめ

  • 「Python チュートリアル 第3版」を読んだ
  • 「Python 入門者のための」と書いてあるけど,そこそこ難しい内容もあり,中級者でも楽しめる
  • 気になるライブラリなどは IPython や Jupyter Notebook を使って試そう!

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

キャリアを選ぶときの価値観を発見しよう /「キャリア・アンカー」を今年も読んだ

今回は「キャリア」をテーマにしたオススメ本「キャリア・アンカー(自分のほんとうの価値を発見しよう)」を紹介する.過去の記事で本書のことを少し紹介したことはあったけど,実は今まで書評記事を書いていなかった.2019年になり,目標設定をしている人も多いと思う.自分のキャリアを見直したり,自分の価値観を確認したりするときにオススメの1冊と言える.僕自身も年末年始に「キャリア・アンカー(自分のほんとうの価値を発見しよう)」を読み直し,再診断をした.

キャリア・アンカー―自分のほんとうの価値を発見しよう (Career Anchors and Career Survival)

キャリア・アンカー―自分のほんとうの価値を発見しよう (Career Anchors and Career Survival)

「キャリア・アンカー」とは?

「キャリア・アンカー(自分のほんとうの価値を発見しよう)」は2003年に日本語版が出版された.原著は1993年に出版されていて,非常に歴史があるものの,今読んでも時代のズレなどはそこまで感じない.僕自身は Amazon の購入履歴を見ると「2016年10月」に本書を購入している.そして,2017年の目標設定をするために読んだことがキッカケとなり,年末年始に読む習慣がある.今年は計3回目の読み直しとなった.

そもそも「キャリア・アンカー」とは,一言で表現すると「自分のキャリアを選ぶときの価値観」となる.本書の P.1 に載っている紹介文を引用すると以下となる.自分はどんなキャリアを選ぶべきなのか?現在のキャリアは「自分らしい」のか?という点を知ることができる.また本書にも書いてある通り,キャリアを分類すると2種類あり,「内面的なキャリア」と「外見上のキャリア」となる.「キャリア・アンカー」では,この「内面的なキャリア」を知るためにある.

あなたのキャリア・アンカーとは,あなたがどうしても犠牲にしたくない,またあなたのほんとうの自己を象徴する,コンピタンスや動機,価値観について,自分が認識していることが複合的に組み合わさったものです。

「キャリア・アンカー」を発見する方法

「キャリア・アンカー」は大きく2種類の方法で発見していく.「キャリア指向質問票」は1人で実施することができ,「キャリア・アンカー・インタビュー」はパートナーと2人で実施することができる.

  • キャリア指向質問票
    • 1人
    • 自己診断ツール
  • キャリア・アンカー・インタビュー
    • 2人
    • パートナーと話す

キャリア指向質問票

まず「キャリア指向質問票」は,自分自身の価値観で計40個ある質問に6段階評価を付けて,集計をする.1人で実施することができるので,最もお手軽な方法と言える.計40個ある質問は本書を見てもらえればと!集計をすると,以下の「8アンカー」ごとにスコアが出るため,1番スコアが高いアンカーが「キャリア指向質問票」から発見できた「キャリア・アンカー」となる.本書にはアンカーごとに「仕事のタイプ」や「承認のしかた」がまとまっている.

  • 専門・職能別コンピタンス (TF : Technical / Functional Competence)
  • 全般管理コンピタンス (GM : General Managerial Competence)
  • 自立・独立 (AU : Autonomy / Independence)
  • 保障・安定 (SE : Security / Stability)
  • 起業家的創造性 (EC : Entrepreneurial Creativity)
  • 奉仕・社会貢献 (SV : Service / Dedication to a Cause)
  • 純粋な挑戦 (CH : Pure Challenge)
  • 生活様式 (LS : Lifestyle)

なお,本書の中盤には「2個以上のアンカーを持つことができるか」という解説がある.原則として「1個」であると書かれていて,理由は「1番目と2番目にスコアが高いアンカーに適する仕事が異なる場合にどちらを選択するか?」という意思決定が必要なときに1番目のアンカーから選ぶためとある.個人的には今だともっと柔軟に考えても良いと思っていて,2番目にスコアが高いアンカーに適する仕事を副業として選ぶことができる.実際に僕自身,2017年に「キャリア・アンカー」の診断結果からプログラミング講師という副業を選んだ.

キャリア・アンカー・インタビュー

次に「キャリア・アンカー・インタビュー」で,これは本書にある質問を使って,パートナーと話すことにより,「自分のキャリアを選ぶときの価値観」をより具体的に言語化をしていく.インタビューと呼ばれている通り,採用面接にも似ている.なぜ「キャリア・アンカー・インタビュー」が必要なのかと言うと「キャリア指向質問票のスコアは自分自身の欲求によってバイアスがかかっているから」と書かれている.大項目で計18個ある質問も本書を見てもらうとして,一部を載せておく.

  • 3 : キャリアを歩み始めたとき,どのような大きな望み(アンビション)あるいは長期的な目的をもっていましたか
    • あなたはその目的と照らし合わせてみて,最初についた仕事はどんな具合でしたか
  • 15 : あなたのこれからのキャリアを展望してみて,特に楽しみとして期待しているのはどんなことですか
    • そのようなことを楽しみとして期待しているのはなぜですか
    • あなたの次の仕事はどんなものになると思いますか
    • さらにその後,あなたの次の仕事はどんなものになるとお考えですか

正直言って,「キャリア・アンカー・インタビュー」で難しいのは「パートナーを選ぶこと」だと思う.本書には「パートナーの選び方」がまとまっていて,要約すると「心置きなく話し合える人(配偶者や親友)が良い」と書かれていた.僕の場合は,パートナーを複数人を選び,インタビューの背景を伝えた上で,あえてインタビュー形式にはせず,質問をトークテーマにして雑談をするスタイルを選んだ.理由は「雰囲気」と「お手軽さ(ある意味での雑さ)」を重要視したく,カスタマイズをしている.

「アンカー」推移(上位)

僕自身の「アンカー」推移(一部)を載せておくと,上位3アンカーは3年間同じだった.しかし,直近の診断で「奉仕・社会貢献」が1位となり,「専門・職能別コンピタンス」が2位となった.本書には「専門性を活かして人を育てる先生もしくはメンターが良い」と書かれていて,現在のキャリアと合っている.そして趣味で活動しているブログメンタリングも合っていると思う.なお,2017年の目標に「技術支援を仕事にする」と掲げたのは,実は2016年12月の診断結果が関係している.今のところ,大満足のキャリアを選択することができている.

  • 2016å¹´12月
    • No.1 : 純粋な挑戦
    • No.2 : 奉仕・社会貢献
    • No.3 : 専門・職能別コンピタンス
  • 2017å¹´12月
    • No.1 : 純粋な挑戦
    • No.2 : 奉仕・社会貢献
    • No.3 : 専門・職能別コンピタンス
  • 2018å¹´12月
    • No.1 : 奉仕・社会貢献
    • No.2 : 専門・職能別コンピタンス
    • No.3 : 純粋な挑戦

kakakakakku.hatenablog.com

「アンカー」推移(下位)

下位2アンカーも3年間同じだった.今まで起業や安定した生活に興味を持ったことがなく,これはこれで「自分らしい」診断結果だった.

  • 2016å¹´12月
    • No.7 : 起業家的創造性
    • No.8 : 保障・安定
  • 2017å¹´12月
    • No.7 : 起業家的創造性
    • No.8 : 保障・安定
  • 2018å¹´12月
    • No.7 : 起業家的創造性
    • No.8 : 保障・安定

まとめ

  • 「自分のキャリアを選ぶときの価値観」を発見するときに「キャリア・アンカー(自分のほんとうの価値を発見しよう)」はオススメ
  • 発見する方法は2種類ある
    • キャリア指向質問票(自己診断ツール)
    • キャリア・アンカー・インタビュー(パートナーと話す)
  • 直近3年間は年末年始に本書を読む習慣がある

キャリア・アンカー―自分のほんとうの価値を発見しよう (Career Anchors and Career Survival)

キャリア・アンカー―自分のほんとうの価値を発見しよう (Career Anchors and Career Survival)

ブラウザ経由で Windows Server にリモート接続ができる「Apache Guacamole」を Docker Compose で起動する

最近 Windows Server にリモート接続 (RDP) をする機会があり,ブラウザ経由で使えるツール「Apache Guacamole」を試すことにした.今までは「Microsoft Remote Desktop」を使っていて,違う選択肢を学んでおくという意図もあった.「Apache Guacamole」の公式ドキュメントを読むと「clientless remote desktop gateway」と書かれている.「クライアントレス」な「リモートデスクトップゲートウェイ」で,RDP 以外に SSH もサポートしているツールと言える.

Apache Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH.

guacamole.apache.org

Wikipedia を見ると「Guacamole」は「ワカモレ(グワカモーレ)」と読むらしく,メキシコ料理のことだった!確かに「Apache Guacamole」のロゴもアボカド色になっている!

ja.wikipedia.org

Guacamole with Docker

以下の公式ドキュメントに載っている通り,「Apache Guacamole」を構成するサービスである guacamole-server と guacenc は比較的多くのライブラリに依存している.

guacamole.apache.org

今回は「Apache Guacamole」をお手軽に試すため,Docker を使うことにした.

guacamole.apache.org

ただし,公式ドキュメントに載っている手順を読むと,計3種類のコンテナイメージを起動し,さらに --link で参照する必要があった.

  • guacamole/guacamole
  • guacamole/guacd
  • mysql

個別に起動するぐらいなら Docker Compose を使えば良さそう!と考えて,今回は雑に docker-compose.yml を実装した.

version: '3'
services:
  guacd:
    image: guacamole/guacd:latest
    expose:
      - '4822'
  guacamole:
    image: guacamole/guacamole:latest
    ports:
      - '8080:8080'
    environment:
      MYSQL_HOSTNAME: 'mysql'
      GUACD_HOSTNAME: 'guacd'
      MYSQL_DATABASE: 'guachamole'
      MYSQL_USER: 'guachamole'
      MYSQL_PASSWORD: 'guachamole'
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      MYSQL_DATABASE: 'guachamole'
      MYSQL_USER: 'guachamole'
      MYSQL_PASSWORD: 'guachamole'
    volumes:
      - './initdb.sql:/docker-entrypoint-initdb.d/initdb.sql'

公式ドキュメントの手順通り,MySQL の初期化(マイグレーション)もする.

$ docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > initdb.sql
$ docker-compose up -d

起動すると http://localhost:8080/guacamole にアクセスできる.初期パスワードは guacadmin / guacadmin になっている.

f:id:kakku22:20190108233822p:plain

Windows Server に接続する

Settings → Connections → New Connection と画面遷移をし,以下を設定する.

  • Name
  • Protocol
  • Network (Hostname, Port)
  • Authentication (Username, Password)

f:id:kakku22:20190108233835p:plain

すると Windows Server にリモート接続ができる.インスタンス側の設定は今回は割愛する.

f:id:kakku22:20190108233859p:plain

クリップボード共有

guacamole.apache.org

ホスト側とリモート側でクリップボードを共有する機能もある.ホスト側で以下のショートカットを押すと,画面左側に「Guacamole メニュー」が表示される.この Clipboard(テキストエリア)を使うと,クリップボードを共有することができる.

  • Windows : Ctrl + Alt + Shift
  • Mac : Ctrl + Command + Shift

f:id:kakku22:20190108233947p:plain

(画面左に「Guacamole メニュー」が表示されている)

ショートカットが効かない

環境依存かもしれないけど,今回試した Mac + Guacamole (v0.9.14) 環境だと,Command キーを使うことができず,Command + A / Command + C / Command + V など,よく使うショートカットをマウス操作で代替する必要があった.ちなみに「Guacamole メニュー」に Input method という設定があり,ここで Text input を選ぶと,画面右下に「Ctrl / Alt / Esc / Tab」の仮想ボタンが表示されるため,Ctrl を有効にしながら C を押すとコピーすることはできた.とは言え,操作感は良くなく,根本解決ではない.ショートカットを使う方法があったら是非教えて欲しい!

f:id:kakku22:20190108234017p:plain

(右下に仮想ボタンが表示されている)

まとめ

  • ブラウザ経由で Windows Server にリモート接続 (RDP) ができる「Apache Guacamole」を試した
    • RDP 以外に SSH もサポートしている
  • Docker を使うとお手軽にインストールできる
    • さらに Docker Compose を使うと便利だった(今回 docker-compose.yml を実装した)
  • ホスト側とリモート側でクリップボードを共有する機能もあった

Python で「両端キュー」として使えるデータ型 collections.deque

最近「Python チュートリアル 第3版」を読んでいて,11章で紹介されている collections.deque を実際に使ったことがなく,ドキュメントを読みながら動作確認をした.Python 3.2 と Python 3.5 で追加されたメソッドもあり,メモ程度にまとめておこうと思う.

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

deque (double-ended queue) とは?

ドキュメントを読むと collections.deque の説明は以下のように書かれている.特に「どちらの側からも append と pop が可能」という点がポイントで「スタックとしてもキューとしても」使うことができる.正直言って,最初に deque を見たときに「デキュー」と読むのかな?と思ったけど,正しくは「デック」だった.「デキュー」は dequeue だから間違える人もいそう.日本語だと「両端キュー」とも言う.

Deque とは、スタックとキューを一般化したものです (この名前は「デック」と発音され、これは「double-ended queue」の省略形です)。Deque はどちらの側からも append と pop が可能で、スレッドセーフでメモリ効率がよく、どちらの方向からもおよそ O(1) のパフォーマンスで実行できます。

前提

今回は Python 3.7.1 で動作確認をした.

$ python --version
Python 3.7.1

基本操作

まず,以下の基本操作を試した.

  • append()
  • appendleft()
  • pop()
  • popleft()

append() と pop() は deque オブジェクトの右側を操作し,appendleft() と popleft() は名前の通り,deque オブジェクトの左側を操作する.

from collections import deque

d = deque(['B', 'C', 'D'])

# deque(['B', 'C', 'D'])
print(d)

# deque(['B', 'C', 'D', 'E'])
d.append('E')
print(d)

# deque(['A', 'B', 'C', 'D', 'E'])
d.appendleft('A')
print(d)

# E
print(d.pop())

# A
print(d.popleft())

# deque(['B', 'C', 'D'])
print(d)

最大長

deque オブジェクトを作成するときに,第2引数に maxlen を指定することができる(オプション).maxlen を指定すると deque オブジェクトの最大長となる.

class collections.deque([iterable[, maxlen]])

さらに maxlen() を使うと,deque オブジェクトの最大長を確認できる.そして,気になるのは指定した maxlen を超えたときの挙動で,ドキュメントには「追加したのと反対側から要素が捨てられる」と書いてあった.

長さが制限された deque がいっぱいになると、新しい要素を追加するときに追加した要素数分だけ追加したのと反対側から要素が捨てられます。

実際に 6 を append() すると,左側にある 1 が捨てられて,もう1度 1 を appendleft() すると,右側にある 6 が捨てられた.ドキュメントの通りに「反対側」から捨てられた.

from collections import deque

# deque([1, 2, 3, 4, 5], maxlen=5)
# 5
d = deque([1, 2, 3, 4, 5], 5)
print(d)
print(d.maxlen)

# deque([2, 3, 4, 5, 6], maxlen=5)
d.append(6)
print(d)

# deque([1, 2, 3, 4, 5], maxlen=5)
d.appendleft(1)
print(d)

さらに deque オブジェクトを作成するときに,既に maxlen を超えている状態にしたところ,左側から捨てられた.

from collections import deque

# deque([4, 5, 6], maxlen=3)
# 3
d = deque([1, 2, 3, 4, 5, 6], 3)
print(d)
print(d.maxlen)

反転

次に Python 3.2 で追加された reverse() を確認した.reverse() は deque オブジェクトを反転し None を返すため,破壊的にオブジェクトを更新する.

from collections import deque

d = deque([1, 2, 3, 4, 5])

# deque([5, 4, 3, 2, 1])
d.reverse()
print(d)

浅いコピー

次に Python 3.5 で追加された copy() を確認した.copy() は deque オブジェクトの「浅いコピー」を作成できる.

from collections import deque

d1 = deque([1, 2, 3, 4, 5])
d2 = d1.copy()

# deque([1, 2, 3, 4, 5])
# deque([1, 2, 3, 4, 5])
print(d1)
print(d2)

d1.append(6)

# deque([1, 2, 3, 4, 5, 6])
# deque([1, 2, 3, 4, 5])
print(d1)
print(d2)

Python の「浅いコピー」に関しては以下に書いてある.

インデックス検索

次に Python 3.5 で追加された index() を確認した.index() は deque オブジェクトの中から指定した値の位置を返す.複数該当する場合は,最初の位置を返す.該当しない場合は ValueError 例外を返す.

from collections import deque

# 1
d = deque([1, 2, 3, 4, 5])
print(d.index(2))

挿入

次に Python 3.5 で追加された insert() を確認した.insert() は deque オブジェクトの任意の場所に値を挿入する.左右以外にも挿入できるため,スタックとキューでは行えない操作もできる.当然ながら,中央部分に挿入する場合は O(n) の計算量になる.

from collections import deque

d = deque([1.0, 2.0, 3.0, 4.0, 5.0])

# deque([1.0, 2.0, 3.0, 4.0, 5.0])
print(d)

d.insert(3, 3.5)

# deque([1.0, 2.0, 3.0, 3.5, 4.0, 5.0])
print(d)

動作確認 : PyCharm Python Console

インタラクティブに動作確認をする場合に「PyCharm Python Console」を使っている.Python インタプリタではなく IPython を使うとして,「PyCharm Python Console」を使うと,同時に変数なども確認できて便利.

f:id:kakku22:20190104194532p:plain

ドキュメント化 : Jupyter Notebook

動作確認をしながらメモを残す場合に,インラインコメントを付ける以外に「Jupyter Notebook」を使って,Markdown でドキュメント化してしまう方法もある.特に仮想サーバを構築する必要もなく,ローカル環境で jupyter notebook と実行すれば良くて,お手軽に使うことができる.

jupyter.org

以下は collections.deque のドキュメントにあるサンプルコードを「Jupyter Notebook」でドキュメント化して,さらに GitHub に push している.「コメント」と「コード」と「実行結果」を確認できるので,今後見直す場合にも効率的に思い出せる.

f:id:kakku22:20190104194553p:plain

GitHub は2015年に対応していて,そのまま .ipynb を push すると,GitHub で「Jupyter Notebook」を閲覧することができる.

blog.github.com

まとめ

  • Python で使ったことがなかった collections.deque の動作確認をした
    • deque は「デキュー」ではなく「デック」と読む
  • collections.deque には Python 3.2 と Python 3.5 で追加されたメソッドもあった
    • insert() を使うと任意の場所に値を挿入できる(もはや「両端キュー」ではない)
  • 動作確認には「PyCharm Python Console」を使って,ドキュメント化には「Jupyter Notebook」を使うと便利