Pythonは、オランダ人のグイド・ヴァンロッサム氏が1991年に発表したプログラミング言語の一種です。機械学習/AI、ディープラーニングの分野で一気に浸透した感もありますが、サーバーサイド開発、システム管理、IoT(Internet of Things)など、幅広い分野で活用されています。
初期バージョン0.9の発表が1991年ですから、伝統的なCOBOLが1959年、C言語が1972年に登場していることを見れば、比較的新しい言語でもあります。新しいとは言っても、すでに登場から30年近くが経過し、2019年にバージョン3.8がリリース。企業/個人を問わず、Pythonが当たり前のように採用されるようになったことで事例も蓄積され、よい意味で枯れた言語になっています。2020年には、いよいよ国家試験の基本情報技術者試験でもPythonが採用されたことで、教育分野でのPythonの活用にも弾みがつきそうです。
本章では、そんなPythonを学ぶに先立って、Pythonという言語の特徴を理解するとともに、学習のための環境を整えます。また、後半では簡単なサンプルを実行しながら、Pythonアプリの構造、基本構文を理解し、次章からの学習に備えます。
1.1 Pythonとは?
「コンピューター、ソフトウェアがなければただの箱」とは、よく聞く言葉です。コンピューターは人間が面倒に思うことを肩代わりしてくれる便利な機械ですが、自分で勝手に動くことはできません。基本的には「誰かの指示」を受けて動くものです。
この「誰か」がソフトウェア(ソフト)、またはプログラムと呼ばれる指示書です。そして、プログラムを記述するために利用する言語がプログラミング言語です。Pythonもまた、プログラミング言語の一種です。
プログラミング言語と一口に言っても、世の中にはさまざまな言語があります。その中で、Pythonはどのような特徴を持つのでしょうか。本節では、Pythonという言語の特徴を理解しながら、プログラミングを学ぶうえで知っておきたいキーワードを押さえます。
1.1.1 マシン語と高級言語
一般的には、コンピューターは0、1の世界しか理解できません。よって、コンピューターに指示を出すのも、0、1の組み合わせで表す必要があります。このような0、1で表される言語のことをマシン語(または機械語)と言います。
もっとも、人間が0、1だけで複雑なプログラムを読み書きするのは困難です。そこで現在では、人間にとってよりわかりやすいプログラミング言語を利用しています。高級言語、または高水準言語と呼ばれる言語です(図1.1)。高級言語は、一般的には英語によく似た文法を採用しており、中学程度の英語を理解していれば簡単に理解できます。
![図1.1 マシン語と高級言語 図1.1 マシン語と高級言語](http://cz-cdn.shoeisha.jp/static/images/article/12457/12457_01.jpg)
現在、我々がよく目にするプログラミング言語のほとんどは高級言語ですし、例にもれず、Pythonも高級言語です。
1.1.2 コンパイル言語とインタプリター言語
ただし、英語のような文法で書かれた高級言語を、コンピューターはそのままでは理解できません。そこで高級言語で書かれたプログラムを実行するには、コンピューターが理解できる形式に変換する必要があります。その方法の1つがコンパイル(一括翻訳)という処理です。
Java、C#、C++のような言語は、人間の書いたプログラムをいったんコンパイルして、その結果を実行することから、コンパイル言語と呼ばれます(図1.2)。
![図1.2 コンパイル言語とインタプリター言語 図1.2 コンパイル言語とインタプリター言語](http://cz-cdn.shoeisha.jp/static/images/article/12457/12457_02.jpg)
Pythonも翻訳しなければ実行できない点は同じですが、これを意識する必要がありません。プログラムを呼び出すと、その場で翻訳しながら、そのまま実行してくれるからです。このような言語のことをインタプリター言語と言います。Pythonのほか、JavaScript、PHP、Ruby、Perlなどが代表的なインタプリター言語です。
インタプリター言語は、コードを書き直してもいちいちコンパイルを繰り返さなくてよいので、トライ&エラーでの開発が容易です。
1.1.3 スクリプト言語
もう1つ、Pythonの特徴として、とにかく文法がシンプルで、初学者にも習得が簡単であるという点が挙げられます。たとえば図1.3は、「Hello, World!!」という文字列を表示するためのコードを、PythonとJavaで表したものです。
![図1.3 「Hello , World!!」と表示するコード:PythonとJava 図1.3 「Hello , World!!」と表示するコード:PythonとJava](http://cz-cdn.shoeisha.jp/static/images/article/12457/12457_03.jpg)
もちろんこれだけでは結論できませんが、Pythonのほうがシンプルに記述できることが見て取れます。
Pythonのシンプルさは、予約語(決められたキーワード)の少なさからも感じられます。たとえば、比較的簡単と言われるPHPですら、予約語は実に80近くにものぼります。対して、Pythonのそれはわずかに35。予約語が少ないということは、習得すべき文法が少ないということなので、Pythonがどれだけシンプルかがわかります。
また、Pythonは「1つのことを表すのに、書き方が1つだけ」であることを意図して設計されています。この思想もまた、Pythonを簡単にしている要因です。
そして、このようにシンプルさ、簡易さに力点を置いた言語のことを、プログラミング言語の中でもスクリプト言語と呼びます。script(台本、脚本)というその名の通り、コンピューターに対する指示を脚本のような手軽さで表現できる言語、というわけですね。
なお、スクリプト言語で書かれたプログラムのことを、スクリプトと呼ぶこともあります。
1.1.4 オブジェクト指向言語
オブジェクト指向とは、プログラムの中で扱う対象をモノ(オブジェクト)にたとえ、オブジェクトの組み合わせによってアプリを形成していく手法のことを言います。たとえば、一般的なアプリであれば、文字列を入力するためのテキストボックスがあり、操作を選択するためのメニューバーがあり、また、なにかしら動作を確定するためのボタンがあります。これらはすべてオブジェクトです(図1.4)。
また、アプリからファイル/ネットワークなどを経由して情報を取得することもあるでしょう。こうした機能を提供するのもオブジェクトですし、オブジェクトによって受け渡しされるデータもまた、オブジェクトです。
![図1.4 オブジェクト指向とは? 図1.4 オブジェクト指向とは?](http://cz-cdn.shoeisha.jp/static/images/article/12457/12457_04.jpg)
Pythonに限らず、昨今のプログラミング言語の多くは、オブジェクト指向の考え方にのっとっており、その開発手法も円熟しています。つまり、本書で学んだ知識は、そのまま他の言語の理解につながりますし、他の言語で学んだ知識がPythonの理解に援用できる点も多くあります。本書でも、第10~11章で十分な紙幅を割いて、オブジェクト指向構文について解説していきます。
補足 マルチパラダイムな言語
Pythonは純粋なオブジェクト指向言語ではありません。その他にも、さまざまな思想(パラダイム)を取り込んでいます。
たとえば、第8章で扱うラムダ式、第9章で扱うジェネレーターなどは関数型プログラミングの側面を持っています。関数型とは、関数(特定の入力に対してなんらかの結果を返す仕組み)を組み合わせていくプログラミングスタイルです。
第4章で扱う制御構文は、プログラムの基本的な構造(順次、選択、反復)を表す構造化プログラミングです。そもそも(あまり意識することはありませんが)Pythonでは処理の流れをコードとして記述していきます。これを手続き型プログラミング(命令型プログラミング)と言います。
このように複数のパラダイムを取り込んだ言語のことをマルチパラダイムな言語と呼びます。Pythonを学ぶことで、プログラムのさまざまな思想を同時に学ぶことができるのです。
1.1.5 Pythonのライブラリ
一般的に、プログラミング言語は(言語そのものだけでなく)アプリを開発するための便利な道具と共に提供されています。このような道具のことをライブラリと言います。
Pythonは「Battery Included」(電池付きで、そのまま使える)という思想のもとで設計されており、このライブラリが標準で潤沢に用意されています。Pythonをインストールするだけで、それこそファイルの読み書きからデータベース操作、ネットワーク通信、GUIアプリ開発など、さまざまな機能を即座に実現できるのです。
サードパーティ製の拡張ライブラリに至っては、標準ライブラリの比ではありません。たとえばPythonには、サードパーティによる拡張ライブラリの集積場とも言うべきサービスとして、PyPI(Python Package Index)があります(図1.5)。このPyPIへの登録プロジェクト数は、本書の執筆時点でなんと20万以上に及びます。Pythonを導入すれば、これらを無償で利用できるわけです。
![図1.5 PyPI(https://pypi.org/)のトップページ 図1.5 PyPI(https://pypi.org/)のトップページ](http://cz-cdn.shoeisha.jp/static/images/article/12457/12457_05.jpg)
![表1.1 Pythonで利用できる有名なライブラリ 表1.1 Pythonで利用できる有名なライブラリ](http://cz-cdn.shoeisha.jp/static/images/article/12457/12457_06.jpg)
さまざまな分野でライブラリが充実しているのはもちろんですが、中でも、機械学習、ディープラーニング(深層学習)などの分野のライブラリが潤沢である点はPythonの強みです。昨今のトレンドであるこれらの分野をきっかけに、Pythonを導入した(したい)という人も少なくないのではないでしょうか。
1.2 Pythonの歴史と現状
Pythonの言語としての特徴を理解できたところで、Pythonの歴史を概観しながら、Pythonを取り巻く現状を説明します。
1.2.1 Pythonの歴史
Pythonが最初にお目見えしたのは1991年、作者であるグイド=ヴァンロッサムがソースコードを公開した0.9です。その後、3年の期間を経て、1994年1月にPython 1.0がリリースされました。基本的な型の概念やオブジェクト指向など、Pythonの基礎となる構文は、このバージョンですでに実装されています。
ただし初期の段階ではそこまで盛り上がりはなく、よく名前が聞かれるようになったのは2000年10月にPython 2がリリースされてからです。Unicode(1.5.1項)、ガベージコレクション(オブジェクトを解放するための仕組み)などが導入され、Google、Yahoo!、InstagramなどのサービスがPythonを採用したのも、この時期です。
そして、2008年12月にリリースされたのが、現在のメジャーバージョンであるPython 3です。執筆時点での最新バージョンは3.8で、3.0以降、表1.2のような機能が加わっています。
![表1.2 Python 3の新機能 表1.2 Python 3の新機能](http://cz-cdn.shoeisha.jp/static/images/article/12457/12457_07.jpg)
言語としての成熟も高まったバージョンですが、問題もありました。Unicode(文字コードの一種)をネイティブに採用したなど、大幅に改善の手が入ったことで、Python 2との互換性が維持されなかったのです。加えて、周辺ライブラリのPython 3対応が進まなかった事情も重なり、Python 2からPython 3への移行は難航します。
しかし、互換性問題も10年以上の年月を経て、解決します。Python 2系の最終バージョンである2.7が2020年1月1日をもって、とうとうサポートを終了しました。以降は、致命的なバグ、セキュリティホールがあってもバグフィックスはされません。否応なく、今後はPython 3の普及が進んでいくはずです(開発/学習に際してPython 2を意識しなくてよいのは、開発者にとって大きなメリットであり、まさに学習を始めるチャンスと言えます)。
消極的な理由だけではありません。10年の中で、代表的なライブラリのPython 3対応もほぼ済んでいます。表1.2でも示したように、Python 3ではさまざまな機能が追加されました。機能性、パフォーマンスいずれをとっても、Python 2よりもPython 3が優れているのは当然で、もはやPython 2を採用する理由はありません。既存のアプリをメンテナンスせざるを得ないなどの状況を除いては、今後は原則としてPython 3を利用してください。本書でも、Python 3(3.8)を前提に、解説を進めます。
1.2.2 Python開発の状況
Pythonと言った場合、Pythonの言語仕様と、言語仕様に基づいた実装とがあります。
まず、Python実装にはPyPy、IronPython、Jythonなどがありますが、中でも有名な実装がCPythonです。非営利団体であるPythonソフトウェア財団が管理しており、オープンソースとして提供されます。
オープンソースなのでソースを確認できるのはもちろん、開発そのものにも参加できます。ライセンスがPSFL(Python Software Foundation License)として提供されている点もメリットです。PSFLはGPL(GNU General Public License)互換のライセンスですが、GPLと異なり、内容を変更した場合にも変更コードをオープンにする義務はありません。
そして、実装の前提となる言語仕様についても、好き勝手に決められているわけではありません。PEP(Python Enhancement Proposal)と呼ばれる仕様提案の仕組みが用意されています。
以下は、「PEP 1 -- PEP Purpose and Guidelines」から引用したものです。
PEP stands for Python Enhancement Proposal. A PEP is a design document providing information to the Python community, or describing a new feature for Python or its processes or environment. The PEP should provide a concise technical specification of the feature and a rationale for the feature.
訳 PEPはPythonでの機能拡張提案を意味します。PEPはPythonコミュニティに対して情報を提供したり、Pythonの新機能や周辺環境に言及したりするための仕様書です。PEPでは、新たな機能に関する技術的な仕様と根拠とを示さなければなりません。
PEPでまとめられたドキュメントに基づいて開発が進められるので、実装も統一された、また、合意された方針のもとに進められるわけです。PEPでまとめられた文書の中でも、一読しておくとよいものを表1.3にまとめておきます。
![表1.3 主なPEP文書 表1.3 主なPEP文書](http://cz-cdn.shoeisha.jp/static/images/article/12457/12457_08.jpg)
言語仕様だけでなく、コーディング規約、Pythonの根底にある思想、コメントの書き方など、幅広く文書化されていることが見て取れます。読み解くには難解な内容もありますが、Pythonで本格的な開発をしていくならば、上の文書を手始めに、徐々にPEPにも慣れていくことをお勧めします。
1.5 Pythonの基本ルール
続いて、今後学習を進めていくうえで、最低限知っておきたい基本的な文法やルールなどを説明していきます。
1.5.2 文を区切るのは改行
コード(スクリプト)は、1つ以上の処理のかたまりです。「これをこうしなさい」「あれをああしなさい」といった処理と、その手順(順序)をまとめたもの、と言ってもよいでしょう。そして、コードの中で1つ1つの処理を表す単位が文です。
たとえば、hello.pyの例であれば、「name = '山田'」「print(name)」が、それぞれ文です。言語によっては、文の末尾を「;」(セミコロン)などで終えなければならないものもありますが、Pythonの文は改行で区切るだけでかまいません(図1.41)。
![図1.41 文の区切りは改行 図1.41 文の区切りは改行](http://cz-cdn.shoeisha.jp/static/images/article/12457/12457_09.jpg)
文が長いなどの理由で行を折り返したい、という場合にも、(...)や[...]、{...}の中で、かつ、単語ごとの区切りであれば、自由に改行を加えることが可能です。よって以下は、改行する意味はあまりありませんが、正しいPythonのコードです。
print( name )
一方、以下のようなコードは(エラーにはなりませんが)正しく動作しません。
print # ここで改行すると文の終了とみなされる (name)
カッコの外で改行しているので、printまでで文が終了するとみなされるのです。このような場合には、文が続いていることを表すために「\」(バックスラッシュ)を使ってください。以下のコードは正しく動作します。
print \ # 文の継続をPythonに伝える
(name)
ただし、コードの読みやすさを考えれば、以下のようなルールに基づいて改行を加えるのが望ましいでしょう。
- 文が80桁を越えた場合に改行
- 改行位置はカンマ(,)の直後、演算子(第3章)の直前
- 文の途中で改行した場合には、次の行にインデントを加える(後述)
逆に、1行に複数の文を続けることもできます。その場合は、文の区切りを明確に、セミコロン(;)で区切るようにしてください。
name = '山田'; print(name)
ただし、このような書き方はよい習慣ではありません。というのも、一般的な開発環境(デバッガー)では、コードの実行を中断し、その時どきの状態を確認するブレークポイントと呼ばれる機能が備わっています。
しかし、ブレークポイントは行単位でしか設定できません。上記のようなコードであれば、後半の直前で止めたいと思っても、前半で止めざるをえません。
短い文であっても、「複数の文を1行にまとめない」が原則です。
補足 インデントは意味を持つ
Pythonでは、インデント(字下げ)が意味を持ちます。よって、以下のようなコードはエラーとなります。
name = '山田' print(name)
インデントの意味については4.1.1項で改めますが、まずはPythonでは無条件のインデントは認められていないと理解しておきましょう。
ただし、行継続中に限って、インデントも自由です。上述したように、文の途中で改行を加えた場合には、2行目以降にはインデントを加えて、本来は1行であることを表すようにします(shouldであってmustではありません)。
print('こんにちは、', 'あかちゃん!')
その場合、インデント位置は「開きカッコの位置にそろえる」のが可読性がよくお勧めです。