Pythonで最初に知っておきたかったことのまとめ【初心者向け】

f:id:karaage:20171225113630p:plain:w480

Pythonで最初に知っておきたかったこと

 最近、PC(Mac/Linux)やRaspberry PiでPythonを使ってプログラムを組むことが多くなってきました。長く使っていると、多少はPythonのことが分かってきて、色々便利な機能なども知ることができます。その中でも「これ、もっと早くに知りたかった…」というものが結構あったりするので、一度そういったものをまとめて紹介しようと思います。

 Pythonをこれから始める初心者の方の参考になればよいなと思います。環境はMac/Linux(Raspberry Pi)を想定していますが、それ以外の環境の方でも参考になるかとは思います。

環境セットアップ

 最初は環境構築です。PC(Mac/Linux)だと、仮想環境を使うのを個人的にはオススメします。以下記事参照下さい。

 「俺はPythonで機械学習をやりたいんだー!」という人は、下記の記事の通りコピペしていけば、比較的簡単に機械学習に必要な環境を揃えられると思います。

 Windowsに関しては、手元に環境がないので詳しく分からないです(申し訳ありません)。以下のサイトの記事とかが分かりやすくて参考になるかもしれません。

機械学習のためのPython入門 | キカガク技術ブログ「一日一遊」 | キカガク技術ブログ「一日一遊」

 仮想環境に関しては、後から導入しても問題ないので、最初よく分からなければ、デフォルトの環境でやってみて、慣れてから仮想環境を導入という形でもよいとは思います。

 Raspberry Piの場合は、仮想環境は使わずSDカード毎に個々の環境を作ることにしています。基本、デフォルトのPython2を使っています。本当はPython3の方が良いとは思うのですが、Open CVをビルドするのが面倒くさいという怠慢な理由です(Python2ならapt-getで入る)。

インデントのルール

 Pythonで最初にとまどうのが、インデントでブロックを区切るということ。ここらへんは、他のプログラミング言語の経験ある人は、一番戸惑うところかもしれませんね。特に、ルールも以下のように中々いい加減です。

1.インデント幅は1でも2でも7でもいい 何でもいい 2.コード全体で一つのインデント幅に固定されてるわけじゃなく、ブロックごとに統一されてればいい

 ただ、基本はスペース4文字分と鉄の掟(PEP 8 後述します)で決まっているので、エディタで設定してやるのが良いと思います。例えば vimエディタだと私は.vimrcに以下のように書いています。  

autocmd FileType python setl autoindent
autocmd FileType python setl smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class
autocmd FileType python setl tabstop=8 expandtab shiftwidth=4 softtabstop=4

 ただ、最近流行りのTensorFlowとかだと、見やすくするためにインデントはスペース2つ分とか推奨されていたりします…いずれにしても、初心者は、スペース4つが基本と覚えておきましょう。

 VimエディタやVimエディタの設定に関して、詳しくは下記記事を参照下さい。

ライブラリのバージョン情報の管理

 Pythonを使うとき、色々なライブラリを使うことが多いと思います(むしろ、とあるライブラリを使いたいがためにPythonを使う人も多いと思います)。その際に重要になっているのが、自分の環境にどのようなバージョンのライブラリがインストールされているかです。

 実は、pipがインストールされていれば、以下コマンドで簡単に表示することができます。

$ pip freeze 

 実行すると、以下のようにずらずらとインストールされているライブラリとバージョンが表示されます。

alabaster==0.7.10
anaconda-client==1.6.3
anaconda-navigator==1.6.2
anaconda-project==0.6.0
appnope==0.1.0
...

 以下のようにリダイレクトすると、ファイルに書き出すことができます。

$ pip freeze > requirements.txt 

 逆に、以下コマンドでファイルを読み込むことで、ファイルに書かれたライブラリとバージョン指定して一気にインストールすることが可能です。

$ pip install -r requirements.txt

 Pythonのプログラムや、対話モード、Jupyter Notebook内でバージョン確認したい場合は、以下コマンドでパッケージのリストを取得できます。

import pkg_resources
for dist in pkg_resources.working_set:
    print(dist.project_name, dist.version)

 例えば、Jupyter Notebook内で、特定のパッケージのバージョンを表示させたい。というような場合は、以下のように書くことができます。

import pkg_resources
pkglist = ['numpy', 'scikit-learn', 'pandas']
for dist in pkg_resources.working_set:
    if dist.project_name in pkglist:
        print(dist.project_name, dist.version)

 例えば、上記コードを実行すると、以下のように表示されます。

numpy 1.12.1
pandas 0.20.1
scikit-learn 0.18.1

 ちなみにPython自身のバージョンを取得したい場合は以下です。

import platform
print("python " + platform.python_version())

ファイル名には先頭に数字を使ったりハイフン(-)を使用してはならない

 これはハイフン使ったファイル(ex:sample-library.py)をインポートしようとしてはまりました。sample_library.pyといったようにアンダーバーを使うようにしましょう。後からファイル名を変えるのは面倒なので、最初に知っておきたかったなと思いました。

モジュールのインポートを理解する

 モジュールのインポートと聞くと、最初は難しく、インポート関係でエラーが起こるとパニックになってしまいがち(自分だけ?)ですが、実はpythonのインポートの仕組みは非常に簡単です。

 例えばmodule.pyという、以下のような簡単なファイルを作成したとします。

value = 100

def hello_world():
    print("hello world")

 あとは、Pythonの対話モードで、以下のように上記のファイルの変数や、関数を以下のように呼び出せるのです。

>>> import module
>>> module.value
100
>>> module.hello_world()
hello world

 fromとかimportとかも、最初はややこしく思えますが、一度解説読めばすんなり理解できると思います。以下サイトの記事などが分かりやすいと思います。

【Python入門】import・fromでモジュールを読み込む方法 | プロスタ

 より詳しく知りたい場合は、以下記事が参考になりました。

Pythonのimportについてまとめる - Qiita

Pythonでファイル操作

 Pythonでファイル操作できる方法も、標準機能で色々あるので知っておくと何かと役にたつでしょう。以下が良くまとまっていました。

ファイル操作でよく使うモジュール - Qiita

他のプログラムを呼び出す方法

 subprocessを使うことで、他のプログラムを呼び出せます。標準機能では難しいようなファイル操作をする場合や、シェルスクリプトを使わないで済ませたいときなどに活用できます。os.systemを使う方法もあるのですが、こちらの方がナウい(死語)らしいです。

 例えば、以下のように使います。

import subprocess
cmd = "pwd"
subprocess.call(cmd, shell=True)

 ただ、互換性は失われる(Winowsだと動かないとか)ので注意下さい。

Pythonのコードを対話モードで読み込む

 以下で対話モードでファイルを読み込めます。

$ python -i <filename>

 例えば、上記のmodule.pyを使う場合

$ python -i module.py

 で対話モードに入り、以下のように関数を呼出せたりします。

>>> hello_world()
hello world

 たまーにこれに助けられます。

Jupyter Notebookを活用する

 Jupyter Notebookは、技術ノート・技術メモが作れるPythonのツールです。簡単に言うと、丁寧なコメントや、実行結果をノートとして保存できるツールなのですが、それ以上のパワーを秘めています。Jupyter Notebookの概略は以下サイトの記事を参照ください。

Jupyter (iPython) Notebookを使って技術ノート環境を構築する方法 - MyEnigma

 Jupyter Notebookの活用方法やテクニックは、以下サイトの記事がとても分かりやすく参考になります。

【Day-6】ゼロからJupyterの達人に!使い方の総まとめ。 - プロクラシスト

Jupyter notebook (iPython Notebook)を使う時に気をつけるべき10個のこと - MyEnigma

PEPを読む

 Pythonにある程度慣れてきたら、PEP(Python Enhancement Proposal)と呼ばれるPythonのガイド集的なものに一度目を通しておくと良いと思います。特に重要なのはスタイルガイド(ソースコードの買い方の決まり)を定義しているPEP 8でしょうか。自動でPEP 8の規約をチェックしてくれるツールもありますが、読むことで命名規則やルールの考え方等、ツールチェックだけでは得られない学びもあります。以下に日本語訳があります。

はじめに — pep8-ja 1.0 ドキュメント

 あとは、Pythonの哲学(?)を示してるPEP 20(ZEN of Python)も有名ですね。1分で読める上に結構有名ですので、一度は読んでおくと良いでしょう。以下でPEP 20が表示されるというイースター・エッグも知ることができます(笑)

>>> import this

 PEPの原文は以下です。

PEP 0 -- Index of Python Enhancement Proposals (PEPs) | Python.org

 PEP 8の日本語訳は以下となります。

はじめに — pep8-ja 1.0 ドキュメント

その他参考になる情報

 以下記事は、色々なTipsに満ち満ちています。特にargparseのところは参考になりました。

pythonで小さなツールを作る時のtips - Qiita

 ほけきよ(id:imslotter)さんのガチひとりアドベントカレンダーです。Python、機械学習(ディープラーニング)に興味ある方は全記事必見の内容です。

ひとりでデータ分析ガチ勉 Advent Calendar 2017 - Adventar

Pythonの便利なライブラリを使ってツールを自作してみる

 プログラム上達の近道は、まずは作ってみることですね。といっても、実際自分が使えるようなものじゃないとなかなかテンションあがりませんよね。てっとり早くPythonで便利なツールを作りたいと思ったら、色々なライブラリを活用するのが近道です。ライブラリがあるのに、同じものを時間かけて作ってしまったらもったい無いですよね(勉強目的なら良いですが)。というわけで、私がよく使うライブラリや、実際に作ったツールなどをいくつか紹介します。

ツイッター投稿(twython)

 twitterに投稿するライブラリ何種類かあるのですが、私はこれを使うことが多いです。使用例は以下記事参照下さい。

Raspberry Piで温度・湿度・気圧を定期的にツイートするbotを作った - karaage. [からあげ]

データ分析・可視化(pandas/matplotlib)

 例えばcsvファイルを読み込んで、グラフを書きたいといったときは、pandasとmatplotlibの出番です。具体例は以下記事参照下さい。

python/pandas/matplotlibを使ってcsvファイルを読み込んで素敵なグラフを描く方法(Mac/Raspberry Pi) - karaage. [からあげ]

画像処理関係(OpenCV/PIL)

 画像処理といえばOpenCVですね。Pythonからも簡単に使うことができます。以下記事参照下さい。

pythonで画像処理の環境設定(OpenCV/PIL)@Mac/Raspberry Pi - karaage. [からあげ]

機械学習関係(scikit-learn/TensorFlow/Chainer)

 scikit-learnやディープラーニング関係(TensorFlow/Chainer等)に関しては、環境セットアップのところでも紹介した以下記事を参照下さい。

Pythonで機械学習をするための環境を雑にセットアップする方法(Jupyter notebook環境、ディープラーニング環境含む)on Mac/Linux - karaage. [からあげ]

 Pythonでの機械学習だと、ほけきよ(id:imslotter)さんの以下記事もめちゃめちゃ参考になります。

Pythonでゼロから機械学習/データ分析を学ぶためのサイトマップ - プロクラシスト

スクレイピング(beautiful soup)

 スクレイピングにも、多数のライブラリがあります。以下はbeautiful soupというライブラリで画像を収集する例です。

スクレイピング初心者がpythonでかわいい猫ちゃん画像をコマンド一発でネットから収集してみた - karaage. [からあげ]

天気予報・Googleカレンダー取得(google-api-python-client)

 天気予報や、Googleカレンダー情報の取得も可能です。

天気予報情報・Googleカレンダーの予定をpythonで取得する方法 on Raspberry Pi/Mac - karaage. [からあげ]

その他のライブラリ

 他にも以下のサイトに多くの有名なPythonのライブラリがありますので、自分で作る前にざっと見てみると車輪の発明をしなくて済むかもしれません。

GitHub - vinta/awesome-python: A curated list of awesome Python frameworks, libraries, software and resources

無料のPython学習教材

 Pythonは教育用に使われることが多いこともあり、ネット上に多くの無料教材が公開されています。実際私も、Pythonに関しては書籍よりネットでの公開情報に助けられることが多いです。私の知っている無料の学習情報をいくつかご紹介します。

Pythonのテキスト

 大学の先生が無料で公開されているテキスト。素晴らしいです。

Pythonのテキスト作りました - Qiita

Python ヒッチハイク・ガイド

 PythonヒッチハイクガイドというWeb公開資料です。

Python ヒッチハイク・ガイド — The Hitchhiker's Guide to Python

 中身に関しては、以下の要約記事がまとまっていて参考になります。

Pythonヒッチハイクガイドを読んで学んだこと - MyEnigma

ThinkPython:How to Think Like a Computer Scientist

 こちらも無料のWeb公開資料です。感謝。

ThinkPython(日本語)

ThinkPython(英語)

Aidemy(アイデミー)

 無料でPythonの基礎から、機械学習(ディープラーニング)まで学習できるWebサービスです。サーバに環境が用意されているので、Python環境の無いPCでもブラウザさえあれば学習できてしまいます。少し試してみましたが、これが無料なのは驚きです。プレミアムプランは有料なのですが、これで採算がとれるのでしょうか…

10秒で始めるAIプログラミング学習サービスAidemy    ブログもなかなか面白いです。ちなみにブログのプラットフォームは「はてなブログ」です(笑)

Aidemy Tech Blog

市販の書籍

 最後にお金を出しても良い人向けだと、自分に合った本を探すのは、以下の記事が参考になりそうです。

Pythonの学び方と,読むべき本を体系化しました2018〜初心者から上級者まで - Lean Baseball

 私が買って良かったかなと思うのは、以下でしょうか。独学しづらい、ツールやテストに関して書かれているので参考になります(実践はできていませんが)。環境構築は、少し古いのでネットの情報を参考にした方がよいかなと思います。Kindleで直ぐ買って読めます。

まとめ

 Pythonの初心者向けに、早く知っておくと良さそうなことをまとめてみました。きっと、他にもまだまだ知っておくと便利なことがたくさんあるのだろうなと思っています。

 個人的には、いい加減デバッガの使い方を覚えたほうが良いのかなと思っています。結局未だにprintデバッグで済ませちゃうんですよね。デバッグはIDEの方がよいかなと思い、Visual Studio Codeを試したりしていますが、デバッグは全然です。

 また、プログラムの書き方に関しては、Python向けの本というわけではないのですが、最近以下のような本も読んでいます。良いコードを書くための考え方と合わせて、筆者の過去の体験を基にした生々しい(?)具体例もあり、自分のようなプロとしてソフトを書いてない人間にも、とても分かりやすく良かったです。何か1つの言語でプログラムをかけるようになったら読んでみると良い本ではないかと思います。 

f:id:karaage:20171225151948j:plain:w640

ベタープログラマ ―優れたプログラマになるための38の考え方とテクニック

ベタープログラマ ―優れたプログラマになるための38の考え方とテクニック

参考リンク

pythonのインデント - studylog/北の雲

Pythonスクリプト実行後に対話的に操作したい - 唯物是真 @Scaled_Wurm