Python

Pythonはインタープリタ型の高水準汎用プログラミング言語である。

1. 概要
-----

Pythonは1991年にグイド・ヴァン・ロッサムにより開発されたプログラミング言語である。

最初にリリースされたPythonの設計哲学は、ホワイトスペースの顕著な使用によってコードの可読性を重視している。その言語構成とオブジェクト指向のアプローチは、プログラマが小規模なプロジェクトから大規模なプロジェクトまで、明確で論理的なコードを書くのを支援することを目的としている。

Pythonは動的に型付けされていて、ガベージコレクションされている。構造化、オブジェクト指向、関数型プログラミングを含む複数のプログラミングパラダイムをサポートしている。Pythonは、その包括的な標準ライブラリのため、しばしば「バッテリーを含む」言語と表現されている。

Pythonのインタプリタは多くのOSに対応している。プログラマーのグローバルコミュニティは、無料のオープンソース リファレンス実装であるCPythonを開発および保守している 。非営利団体であるPythonソフトウェア財団は、PythonとCPythonの開発のためのリソースを管理・指導している。

1.1. 特徴
-------

Pythonはインタプリタ上で実行することを前提に設計している。以下の特徴をもっている:

動的な型付け
ガベージコレクション
マルチパラダイム
モジュール・クラス・オブジェクト等の言語の要素が内部からアクセス可能であり、リフレクションを利用した記述が可能。

2. 言語
-----

Pythonには、読みやすく、それでいて効率もよいコードをなるべく簡単に書けるようにするという思想が浸透しており、Pythonコミュニティでも単純で簡潔なコードをよしとする傾向が強い。

2.1. 設計思想
---------

Pythonの本体は、ユーザがいつも必要とする最小限の機能のみを提供する。基本機能以外の専門機能や拡張プログラムはインターネット上にライブラリとして提供されており、別途ダウンロードして保存し、必要なツールはこのツールキットからその都度呼び出して使用する。

Pythonでは「あることをなすのに唯一の良いやり方があるはず」という哲学がある。

Pythonではプログラムの文書化が重視されており、言語の基本機能の一部となっている。

2.2. 構文
-------

インデントが意味を持つ「オフサイドルール」が特徴的である。

以下に、階乗 を題材にC言語と比較した例を示す。

Pythonのコード: def factorial: if x == 0: return 1 else: return x * factorial

わかりやすく整形されたC言語のコード: int factorial { if  { return 1; } else { return x * factorial; } }

この例では、Pythonと整形されたC言語とでは、プログラムコードの間に違いがほとんど見られない。しかし、C言語のインデントは構文規則上のルールではなく、単なる読みやすさを向上させるコーディングスタイルでしかない。そのためC言語では全く同じプログラムを以下のように書くこともできる。

わかりにくいC: int factorial { if {return 1;} else {return x * factorial; } }

Pythonではインデントは構文規則として決められているため、こうした書き方は不可能である。Pythonではこのように強制することによって、ソースコードのスタイルがその書き手にかかわらずほぼ統一したものになり、その結果読みやすくなるという考え方が取り入れられている。これについては賛否両論があり、批判的立場の人々からは、これはプログラマがスタイルを選ぶ自由を制限するものだ、という意見も出されている。

インデントによる整形は、単に「見かけ」だけではなく品質そのものにも関係する。例として次のコードを示す。

間違えたC: if  x = 10; y = 0;

このコードはC言語の構文規則上は問題無いが、インデントによる見かけのifの範囲と、言語仕様によるifの実際の範囲とが異なっているため、プログラマの意図が曖昧になる。この曖昧さは、検知しにくいバグを生む原因になる。例としてはApple goto failが挙げられる。

ソースコードを読む際、多くの人はインデントのような空白を元に整列されたコードを読み、コンパイラのように構文解析しながらソースを読むものではない。その結果、一見しただけでは原因を見つけられないバグを作成する危険がある。

Pythonではインデントをルールとすることにより、人間が目視するソースコードの理解とコンパイラの構文解析の間の差を少なくすることで、より正確に意図した通りにコーディングすることができると主張されている。

2.3. 型システム
----------

Pythonは動的型付けシステムをもつ。同時に任意の型ヒントを持っており外部ツールによる静的型チェックを可能にしている。

値自身が型を持っており、変数はすべて値への参照である。

基本的なデータ型として、論理型・整数型・浮動小数点数型・複素数型・文字列型・バイト列型・関数型がある。整数型は無制限の桁数で整数計算が可能である。浮動小数点数型を整数型にキャストすると、小数点以下が切り捨てられる。

組み込みのコンテナ型として、リスト型、タプル型、辞書型、集合型がある。リスト型および辞書型はミュータブル、タプル型はイミュータブルである。集合型には変更可能なものと変更不能なものの2種類がある。タプル型とリスト型は、多くのプログラミング言語では配列と呼ばれるものに類似している。しかし、Pythonではタプル型は辞書のキーとして使うことができるが、リスト型は内容が変わるため辞書のキーとして使うことはできないという理由から、これら2つの型を区別している。

多くのオブジェクト指向プログラミング言語と同様、Pythonではユーザが新しく自分の型を定義することも可能である。この場合、組み込み型を含む既存の型を継承して新たな型を定義する事も、ゼロから全く新しい型を作り出す事も出来る。

Pythonは基本的にメソッドや関数の引数に型を指定する必要がない。そのため、ダック・タイピングという、内部で必要とする演算子やメソッドに対応していれば、関数やオブジェクトの設計時点で意図していなかったオブジェクトを引き渡すことも可能である。

2.3.1. 型ヒント
-----------

Pythonは型ヒントの構文を用意している。これはプログラマ向けの注釈および外部ツールによる静的型チェックに用いられる。

例として、文字列型の値を受け取って文字列型の値を返す関数は次のようにアノテーションできる。 def greeting -> str: return 'Hello ' + name

2.4. メモリ管理
----------

Pythonはガベージコレクションを内蔵しており、参照されなくなったオブジェクトは自動的にメモリから破棄される。CPythonでは、ガベージコレクションの方式として参照カウント方式とマーク・アンド・スイープ方式を併用している。マーク・アンド・スイープ方式のみに頼っている言語では、オブジェクトがいつ回収されるか保証されないので、ファイルのクローズなどをデストラクタに任せることができない。CPythonは参照カウント方式を併用することで、循環参照が発生しない限り、オブジェクトはスコープアウトした時点で必ずデストラクトされることを保証している。なおJythonおよびIronPythonではマーク・アンド・スイープ方式を採用しているため、スコープアウトした時点で必ずデストラクトされることが前提のコードだとJythonやIronPythonでは正しく動かない。

2.5. イテレータ
----------

イテレータを実装するためのジェネレータが言語仕様に組み込まれており、Pythonでは多くの場面でイテレータを使うように設計されている。イテレータの使用はPython全体に普及していて、プログラミングスタイルの統一性をもたらしている。

2.6. オブジェクト指向プログラミング
--------------------

Pythonでは扱えるデータの全てがオブジェクトである。単純な数値といった基本的なデータ型をはじめ、組み込みのコンテナ型、組み込み関数など、これらは全て統一的な継承関係をもつオブジェクトであり「型」をもっている。これらの組み込み型とユーザ定義型は区別されず、組み込み型を継承したクラスを定義できる。上の「データ型」の項で述べたように Pythonは静的な型チェックを持たないため、Javaのようなインターフェイスという言語上の仕組みは必要とされない。

クラスの継承  メカニズムでは、複数の基底クラスを持つことができ、導出されたクラスでは基底クラスの任意のメソッドをオーバライドすることが可能である。

また、オブジェクトには任意のデータを入れることができる。これらのメソッドやデータは、基本的に、すべてpublicであり、virtualである。ただし、先頭にアンダースコアをもつメンバをprivateとすることができる。これは単なるマナーであるが、アンダースコアを2つもつ場合は、クラスの外部からメンバの名前を隠された状態とすることでカプセル化を実現できる。また、利用者定義演算子が機能として用意されておりほとんどの組み込み演算子はクラスインスタンスで使うために再定義することが可能となっている。

2.7. 標準ライブラリ
------------

Pythonには「電池付属 」という思想があり、プログラマがすぐに使えるようなライブラリや統合環境をあらかじめディストリビューションに含めるようにしている。このため標準ライブラリは非常に充実している。

正規表現
OSのシステムコール
XML処理系
シリアライゼーション
HTTP, FTP等の各種通信プロトコル
電子メールやCSVファイルの処理
データベース接続 
GUIフレームワーク 
HTMLのパーサー
Python自身のコードの構文解析ツールサードパーティによるライブラリも豊富に存在する。

2.7.1. 組み込み型
------------

Pythonは様々な組み込み型をサポートする。

2.7.1.1. Mapping型
-----------------

Mapping型はハッシュ可能な値を任意のオブジェクトへ対応付ける型である。対応する具象クラスは dict である。抽象基底クラスに collections.abc.Mapping があり、抽象メソッドとして __getitem__, __iter__, __len__ が定義されている。__getitem__ をもったcollectionとも言える。

2.8. 多言語の扱い
-----------

最初のPythonでは1バイト単位での文字列型のみ扱い、ひらがな・ カタカナおよび漢字のようなマルチバイト文字はサポートしていなかったが、その後のPython 2.0からはUnicode文字型が新たに導入された。

Python 3.0では、Python 2.xにおける文字列型がバイト列型に、またUnicode文字列型が文字列型に変更された。これにより、文字列をPython 3.0で扱う際には後述の変換処理を必ず行う必要がある。ファイル入出力などでエンコードを明示しなければ、標準エンコードを用いて暗黙に行われる場合も多い。これにより多言語の扱いを一貫したものにしている。

Pythonでは文字のエンコードとUnicodeの内部表現を明確に区別している。Unicode文字はメモリ中に保持される抽象的なオブジェクトであり、画面表示やファイルへの入出力の際には変換ルーチンを介して特定のエンコーディングのバイト列表現との間で相互に変換する。また、ソースコード中の文字コードを認識する機能があり、これによって異なる文字コードで書かれたプログラムの動きが異なるリスクを解消している。

Pythonでは変換ルーチンをモジュールとして追加することで、さまざまなエンコーディングに対応できるようになっている。日本語の文字コード  に対応したコーデックも作成されている。Python 2.4からは、日中韓国語用のコーデックが標準でディストリビューションに含まれるようになったため、現在では日本語の処理に関する問題はほとんどなくなった。ただしGUIライブラリであるTkinterや統合開発環境のIDLEは、プラットフォームにもよるが、まだきちんと日本語に対応していないものもある。

ソースコードの文字コードには、ASCIIと互換性があり、Pythonが対応しているものを使用する。ソースコードのデフォルトエンコーディングは、Python 3.xではUTF-8、Python 2.xではASCIIであるが、デフォルトエンコーディング以外の文字コードを使う場合は、ソースファイルの1行目か2行目に一定の書式でコメントとして記述することになっており、しばしば以下のようにEmacsやVimなどのテキストエディタにも認識可能な書式で記述される。

! /usr/bin/python2
-*- coding: utf-8 -*-s = '日本語の文字列'<WtXmlEndTag />

3. 実行環境
-------

Pythonはインタプリタ型言語でありプログラムの実行に際して実行環境を必要とする。以下はランタイムおよびそれらが実装されているプラットフォームの一覧である。

3.1. 動作環境
---------

Pythonの最初のバージョンはAmoeba上で開発された。のちに多くの計算機環境上で動作するようになった。

Windows, Windows CE
Macintosh 
iOS Pythonista for iOS 
Android Pydroid3 for Android 
各種UNIX
Linux 
Plan 9 
PalmOS
S60
Javaプラットフォーム 
.NET Frameworkプラットフォーム 

3.2. ランタイム・コンパイラ
----------------

Pythonには複数の実装が存在する。

CPython - 作者によってC言語で書かれたバージョン。通常「Python」といえばこのCPythonを指す。
Stackless Python - Cスタックを使わずに独自のスタックで実装したもの。
Unladen Swallow - GoogleのチームによるPythonの実装。
Jython - Java仮想マシン上に移植したもの。PythonからJavaのライブラリを使うことができる。
IronPython - .NET Framework/Monoで動作するPython。C#で実装されている。.NET Frameworkのライブラリを使うことができる。動的言語ランタイム上に構築されているため、既存の.NETアプリケーションへマクロ言語として搭載することも可能となっている。
PyPy - Python  によるPythonの実装。
Psyco - CPython向けのJITコンパイラ
Cython - PythonをC言語化へトランスコードするソフトウェア。静的型付けが可能で速度の向上をはかれる。
PyMite - 組み込み向けの実装、AVRなどに対応。
tinypy - 同じく組み込み向けの実装。ソースコードが 64 kB未満と非常に軽量なことが謳われている。
MicroPython - 組み込み向けの実装。256 kB以上のフラッシュを推奨。
Pyodide - WebAssembly向けの実装。
IPython - 対話計算に向けたPythonへのシェル
Codon - Python言語ソースから機械語へのコンパイラ処理系。
PyOMP - PythonをOpenMPで並列化するシステム。

4. エコシステム
---------

Pythonはパッケージ管理ソフト・ライブラリ・レポジトリなどからなるエコシステムを形成している。

4.1. パッケージ管理
------------

Pythonのパッケージ管理はpip・pipenv・poetry・EasyInstallなどのパッケージ管理システムによっておこなわれる。バイナリパッケージのフォーマットにはwheelがあり、これをインタフェースとしてビルドシステムとパッケージ管理システムの分離が可能になっている。

Python Package Index  と呼ぶ公式のパッケージリポジトリが存在する。

パッケージ管理および実行環境管理を含めた統合開発環境としてはAnaconda が存在する。

4.2. ライブラリ
----------

Pythonは多様なコミュニティライブラリによって支えられている。

数値計算
行列演算パッケージの NumPy
プログラミング数学、科学、工学のための数値計算 SciPy
データ解析ソフト pandas
データ処理インタフェース IPython
グラフ表示ソフト Matplotlib
描画ソフト Seaborn
数式処理機能 SymPy
データ処理の高速化 PyPy
Pythonアプリのコンパイルによる高速化 Numba
機械学習
scikit-learn
TensorFlow
PyTorch
画像処理のための Python Imaging Library
SDLのラッパである Pygame
スクレイピングライブラリ Beautiful Soup
クローリング、スクレイピング用のpythonフレームワーク Scrapy
離散事象シミュレーション SimPy
OpenCLへのインタフェース pyOpenCL
OpenGLへのインタフェース pyOpenGL
OpenCVへのインタフェース pyOpenCV
CUDAへのインタフェース pyCUDA
3Dグラフィックスやアニメーション VPython
PyODE
Python
Webアプリケーションフレームワーク
Bottle - https://bottlepy.org/docs/dev/
CherryPy - https://cherrypy.org/
Django - https://www.djangoproject.com/
Flask - http://flask.pocoo.org/
Pyramid - https://pylonsproject.org/projects/pyramid/
Plone - https://plone.org/
Tornado  - https://sites.google.com/site/tornadowebja/
[[Cyclone