Python(パイソン)はインタープリタ型の高水準汎用プログラミング言語である。
Pythonは1991年にグイド・ヴァン・ロッサムにより開発されたプログラミング言語である。
最初にリリースされたPythonの設計哲学は、ホワイトスペース(オフサイドルール)の顕著な使用によってコードの可読性を重視している。その言語構成とオブジェクト指向のアプローチは、プログラマが小規模なプロジェクトから大規模なプロジェクトまで、明確で論理的なコードを書くのを支援することを目的としている。
Pythonは動的に型付けされていて、ガベージコレクションされている。構造化(特に手続き型)、オブジェクト指向、関数型プログラミングを含む複数のプログラミングパラダイムをサポートしている。Pythonは、その包括的な標準ライブラリのため、しばしば「バッテリーを含む」言語と表現されている[† 1]。
Pythonのインタプリタは多くのOSに対応している。プログラマーのグローバルコミュニティは、自由かつオープンソース [† 2] のリファレンス実装であるCPythonを開発および保守している 。非営利団体であるPythonソフトウェア財団は、PythonとCPythonの開発のためのリソースを管理・指導している。
Pythonはインタプリタ上で実行することを前提に設計している。以下の特徴をもっている:
Pythonには、読みやすく、それでいて効率もよいコードをなるべく簡単に書けるようにするという思想が浸透しており、Pythonコミュニティでも単純で簡潔なコードをよしとする傾向が強い[† 3]。
Pythonの本体は、ユーザがいつも必要とする最小限の機能のみを提供する。基本機能以外の専門機能や拡張プログラムはインターネット上にライブラリとして提供されており、別途ダウンロードして保存し、必要なツールはこのツールキットからその都度呼び出して使用する[† 4]。
Pythonでは「あることをなすのに唯一の良いやり方があるはず」という哲学がある[† 3](参考: Perl「やり方は一つじゃない」[4])。
Pythonではプログラムの文書化(ソフトウェアドキュメンテーション)が重視されており、言語の基本機能の一部となっている。
PythonのドキュメントはPEP(Python Enhancement Proposal、ペップ[5])と呼ばれる[6]。
インデントが意味を持つ「オフサイドルール」が特徴的である。
以下に、階乗(関数名: factorial)を題材にC言語と比較した例を示す。
Pythonのコード:
def factorial(x): if x == 0: return 1 else: return x * factorial(x - 1)
わかりやすく整形されたC言語のコード:
int factorial(int x) { if (x == 0) { return 1; } else { return x * factorial(x - 1); } }
この例では、Pythonと整形されたC言語とでは、プログラムコードの間に違いがほとんど見られない。しかし、C言語のインデントは構文規則上のルールではなく、単なる読みやすさを向上させるコーディングスタイルでしかない。そのためC言語では全く同じプログラムを以下のように書くこともできる。
わかりにくいC:
int factorial(int x) { if(x == 0) {return 1;} else {return x * factorial(x - 1); } }
Pythonではインデントは構文規則として決められているため、こうした書き方は不可能である。Pythonではこのように強制することによって、ソースコードのスタイルがその書き手にかかわらずほぼ統一したものになり、その結果読みやすくなるという考え方が取り入れられている。これについては賛否両論があり、批判的立場の人々からは、これはプログラマがスタイルを選ぶ自由を制限するものだ、という意見も出されている。
インデントによる整形は、単に「見かけ」だけではなく品質そのものにも関係する[7]。例として次のコードを示す。
間違えたC:
if (x > 10) x = 10; y = 0;
このコードはC言語の構文規則上は問題無いが、インデントによる見かけのifの範囲と、言語仕様によるifの実際の範囲とが異なっているため、プログラマの意図が曖昧になる(前者は"y = 0;"がif文に包含され、後者は"{}"がないため"y = 0;"がif文に包含されない)。この曖昧さは、検知しにくいバグを生む原因になる。例としてはApple goto failが挙げられる。
ソースコードを読む際、多くの人はインデントのような空白を元に整列されたコードを読み、コンパイラのように構文解析しながらソースを読むものではない。その結果、一見しただけでは原因を見つけられないバグを作成する危険がある。
Pythonではインデントをルールとすることにより、人間が目視するソースコードの理解とコンパイラの構文解析の間の差を少なくすることで、より正確に意図した通りにコーディングすることができると主張されている[7]。
Pythonは動的型付けシステムをもつ。同時に任意の型ヒントを持っており外部ツールによる静的型チェックを可能にしている。
値自身が型を持っており、変数はすべて値への参照である。
基本的なデータ型として、論理型・整数型・浮動小数点数型・複素数型・文字列型・バイト列型・関数型がある。整数型は(メモリの許す限り)無制限の桁数で整数計算が可能である。浮動小数点数型を整数型にキャストすると、小数点以下が切り捨てられる。
組み込みのコンテナ型として、リスト型、タプル型、辞書型、集合型がある。リスト型および辞書型はミュータブル、タプル型はイミュータブルである。集合型には変更可能なものと変更不能なものの2種類がある。タプル型とリスト型は、多くのプログラミング言語では配列と呼ばれるものに類似している。しかし、Pythonではタプル型は辞書のキーとして使うことができるが、リスト型は内容が変わるため辞書のキーとして使うことはできないという理由から、これら2つの型を区別している。
多くのオブジェクト指向プログラミング言語と同様、Pythonではユーザが新しく自分の型を定義することも可能である。この場合、組み込み型を含む既存の型を継承して新たな型(クラス)を定義する事も、ゼロから全く新しい型を作り出す事も出来る。
Pythonは基本的にメソッドや関数の引数に型を指定する必要がない。そのため、ダック・タイピングという、内部で必要とする演算子やメソッドに対応していれば、関数やオブジェクトの設計時点で意図していなかったオブジェクトを引き渡すことも可能である。
Pythonは型ヒントの構文を用意している[8]。これはプログラマ向けの注釈および外部ツールによる静的型チェックに用いられる。
例として、文字列型の値を受け取って文字列型の値を返す関数は次のようにアノテーションできる。
def greeting(name: str) -> str: return f"Hello {name}"
Pythonはガベージコレクションを内蔵しており、参照されなくなったオブジェクトは自動的にメモリから破棄される。CPythonでは、ガベージコレクションの方式として参照カウント方式とマーク・アンド・スイープ方式を併用している。マーク・アンド・スイープ方式のみに頼っている言語では、オブジェクトがいつ回収されるか保証されないので、ファイルのクローズなどをデストラクタに任せることができない。CPythonは参照カウント方式を併用することで、循環参照が発生しない限り、オブジェクトはスコープアウトした時点で必ずデストラクトされることを保証している。なおJythonおよびIronPythonではマーク・アンド・スイープ方式を採用しているため、スコープアウトした時点で必ずデストラクトされることが前提のコードだとJythonやIronPythonでは正しく動かない。
イテレータを実装するためのジェネレータが言語仕様に組み込まれており、Pythonでは多くの場面でイテレータを使うように設計されている。イテレータの使用はPython全体に普及していて、プログラミングスタイルの統一性をもたらしている。
Pythonでは扱えるデータの全てがオブジェクトである。単純な数値といった基本的なデータ型をはじめ、組み込みのコンテナ型、組み込み関数など、これらは全て統一的な継承関係をもつオブジェクトであり「型」をもっている。これらの組み込み型とユーザ定義型は区別されず、組み込み型を継承したクラスを定義できる。上の「データ型」の項で述べたように Pythonは静的な型チェックを持たないため、Javaのようなインターフェイスという言語上の仕組みは必要とされない。
クラスの継承 (inheritance) メカニズムでは、複数の基底クラスを持つことができ(多重継承)、導出されたクラスでは基底クラスの任意のメソッドをオーバライド(override; 上書き)することが可能である。
また、オブジェクトには任意のデータを入れることができる。これらのメソッドやデータは、基本的に、すべてpublicであり、virtual(仮想)である。ただし、先頭にアンダースコアをもつメンバをprivateとすることができる。これは単なるマナーであるが、アンダースコアを2つもつ場合は、クラスの外部からメンバの名前を隠された状態(mangle; 難号化)とすることでカプセル化を実現できる。また、利用者定義演算子が機能として用意されておりほとんどの組み込み演算子(算術演算子(arithmetic operator)や添字表記)はクラスインスタンスで使うために再定義することが可能となっている。
public
virtual
private
Pythonには「電池付属 ("Battery Included")」という思想があり、プログラマがすぐに使えるようなライブラリや統合環境をあらかじめディストリビューションに含めるようにしている。このため標準ライブラリは非常に充実している。
サードパーティによるライブラリも豊富に存在する(参考: Python#エコシステム)。
Pythonは様々な組み込み型(built-in types)をサポートする。
Mapping型はハッシュ可能な値を任意のオブジェクトへ対応付ける型である[9]。対応する具象クラスは dict である。抽象基底クラスに collections.abc.Mapping があり、抽象メソッドとして __getitem__, __iter__, __len__ が定義されている。__getitem__ をもったcollectionとも言える。
dict
collections.abc.Mapping
__getitem__
__iter__
__len__
最初のPythonでは1バイト単位での文字列型のみ扱い、ひらがな・(全角) カタカナおよび漢字のようなマルチバイト文字はサポートしていなかったが、その後のPython 2.0からはUnicode文字型が新たに導入された[† 5]。
Python 3.0では、Python 2.xにおける文字列型がバイト列型に、またUnicode文字列型が文字列型に変更された。これにより、文字列をPython 3.0で扱う際には後述の変換処理を必ず行う必要がある。ファイル入出力などでエンコードを明示しなければ、標準エンコードを用いて暗黙に行われる場合も多い。これにより多言語の扱いを一貫したものにしている。
Pythonでは文字のエンコードとUnicodeの内部表現を明確に区別している。Unicode文字はメモリ中に保持される抽象的なオブジェクトであり、画面表示やファイルへの入出力の際には変換ルーチン(コーデック)を介して特定のエンコーディングのバイト列表現との間で相互に変換する。また、ソースコード中の文字コードを認識する機能があり、これによって異なる文字コードで書かれたプログラムの動きが異なるリスクを解消している。
Pythonでは変換ルーチンをモジュールとして追加することで、さまざまなエンコーディングに対応できるようになっている。日本語の文字コード (EUC-JP, Shift_JIS, MS932, ISO-2022-JP) に対応したコーデックも作成されている。Python 2.4からは、日中韓国語用のコーデックが標準でディストリビューションに含まれるようになったため[† 6]、現在では日本語の処理に関する問題はほとんどなくなった。ただしGUIライブラリであるTkinterや統合開発環境のIDLEは、プラットフォームにもよるが、まだきちんと日本語に対応していないものもある。
ソースコードの文字コードには、ASCIIと互換性があり、Pythonが対応しているものを使用する。ソースコードのデフォルトエンコーディングは、Python 3.xではUTF-8[† 7](ソースコード以外のPython 3のデフォルトエンコーディングは複雑になっている[† 8][† 9])、Python 2.xではASCIIであるが、デフォルトエンコーディング以外の文字コードを使う場合は、ソースファイルの1行目か2行目に一定の書式でコメントとして記述することになっており[† 10]、しばしば以下のようにEmacsやVimなどのテキストエディタにも認識可能な書式で記述される(次の例は Emacs が認識できる書式)。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- s = '日本語の文字列'
Pythonはインタプリタ型言語であり(ほとんどの場合)プログラムの実行に際して実行環境(ランタイム)を必要とする。以下はランタイム(実装)およびそれらが実装されているプラットフォームの一覧である。
Pythonの最初のバージョンはAmoeba上で開発された。のちに多くの計算機環境上で動作するようになった。
Pythonには複数の実装(ランタイム又はコンパイラ)が存在する。
Pythonはパッケージ管理ソフト・ライブラリ・レポジトリなどからなるエコシステムを形成している。
Pythonのパッケージ管理はpip・pipenv・poetry・rye・uv・EasyInstallなどのパッケージ管理システムによっておこなわれる。バイナリパッケージのフォーマットにはwheelがあり、これをインタフェースとしてビルドシステムとパッケージ管理システムの分離が可能になっている[† 11]。
pip
pipenv
poetry
rye
uv
Python Package Index (PyPI) と呼ぶ公式のパッケージリポジトリが存在する。
パッケージ管理および実行環境管理を含めた統合開発環境としてはAnaconda (Pythonディストリビューション)が存在する。
Pythonは多様なコミュニティライブラリによって支えられている。
Pythonは全世界で使われているが、欧米の企業でもよく使われている。大企業ではマイクロソフトやAppleなどのパッケージソフトウェア企業をはじめ、Google, Yahoo!, YouTube などの企業も利用している[† 12]。また携帯電話メーカーのノキアでは、S60シリーズでPythonアプリケーションが動く[15]。研究機関では、NASA[† 12]や日本の高エネルギー加速器研究機構[16]でPythonが使われている。
適応範囲はデータサイエンス、Webプログラミング、GUIベースのアプリケーション、CAD、3Dモデリング、数式処理など幅広い分野に及ぶ。
日本における人気も高く、2023年のアンケート調査『学んでみたいプログラミング言語ランキング』ではPythonが第1位に選ばれている(第2位はJavaScript、第3位C言語)[17]。これは人工知能やデータ分析への関心の高まりや、文法の平易さから初心者にも学びやすい点が支持された結果と分析されている。
NumPy, SciPyなどの高速な数値計算ライブラリの存在により、データサイエンスや科学技術コンピューティングにもよく用いられる。NumPy, SciPyの内部はC言語で書かれているので、動的スクリプト言語の欠点の一つである動作速度の遅さを補っている[18]。NumbaやJAXを使うと、Python のコードが LLVM に JITコンパイルして利用可能であり、非常に高速な計算ができる。TensorFlow などのライブラリにより GPU 上で高速に計算するライブラリも充実している。
JetBrains とPythonソフトウェア財団による共同調査によると、2017年10月現在、Pythonの最も主要な用途は何かというアンケートの結果によると、27%がデータサイエンス(そのうち18%がデータ解析、9%が機械学習)である[19]。
Django や Flask といったWebアプリケーションフレームワークが充実しているため、Webアプリケーション開発用途にも多く使われている。JetBrains とPythonソフトウェア財団による共同調査によると、2017年10月現在、26%の人が最も主要な用途としてWeb開発を選んだ[19]。
スクリプト言語としての特性から、従来Perlやシェルスクリプトが用いられることの多かったシステム管理用のスクリプトとして複数のOSで採用されている。また、異なる言語で書かれた多数のモジュールの機能を貼り合わせるグルー言語(糊の言語)として利用する例も多い。実際、多くの商用アプリケーションで Python は組み込みのスクリプト言語として採用されている。
JetBrains とPythonソフトウェア財団による共同調査によると、2017年10月現在、9%の人が最も主要な用途としてDevOps, システム管理, 自動化スクリプトを上げた[19]。
Pythonは本来は教育用を目的として設計されたわけではないが[20]、その単純さから子供が最初に学ぶプログラミングにおける教育用の言語としての利用が増えている。グイド・ヴァンロッサムはPython設計以前に教育用言語であるABCの開発にかかわり、教育用としての利用について期待感を示したこともあり、方針として非技術者向けといった利用を視野に入れているとされることもある[21]。
私の大好きなPython利用法は、騒ぎ立てずに、言語教育でプログラミングの原理を教えること。それを考えてくれ――次の世代の話だね。-- スラド『 Guido van Rossum へのインタビュー』
情報処理推進機構 (IPA) は国家試験の基本情報技術者試験では2020年の春期試験から COBOL を廃止して Python を追加した[22]。
日本の高等学校情報科「情報Ⅰ」の教員向け研修教材の中で、プログラミング用言語としてPythonが使われている[23]。
ただし、Pythonの言語は,言語自身に組み込まれている型とそれに付随するメソッドの多いことなどから,C言語に較べると遙かに多くの憶えなければならない事柄があることになる。持つ機能の一部だけに限定して教育に用いるならば,憶えなければならない事柄を減らすことができるが,しかし言語の機能をすべて知っていないと他人の書いたプログラムを正しく理解することが出来ない可能性が生じる。Python言語の変数自身には型が無いことから,プログラム上で扱われているデータ・オブジェクトの型が何であるかは実行時に動的に決まるので,それを読み解いて把握しなければプログラムが行っている処理の内容を正しく把握することが難しいことがしばしばある(正しい注釈を付けてプログラムを書くことが重要である)。
また、Pythonの文法は僅か1行でも処理を記述できるほどに簡潔なので、まだプログラミングについてよく知らない子供でも取り組みやすい言語であると言える。[24]
# Pythonで記述した「Hello,World!」の例 # Pythonはたった一行のコードで文字を表示することができる。 print("Hello, World!")
// Javaで記述した「Hello, World!」の例 // Javaでは文字の表示に最低5行コードを記述する必要がある class Main { public static void main(String...args) { System.out.println("Hello, World!"); } }
Pythonはその文法の簡潔さにより、 誰が書いても似たようなコードになりやすい性質があるので、学習が進むにつれて大人が作成したコードを理解できるようになる。[24]
また、文法が簡潔なのでコードを記述している最中に混乱することが少なくなり、子供が途中で諦めてしまう傾向が少ない点も教育用として利用される理由でもある。[24]
Pythonはプロスポーツの分析によく使われている。メジャーリーグベースボール(野球)、イングリッシュプレミアリーグ(サッカー)、ナショナルバスケットボールアソシエーション(バスケットボール)、ナショナルホッケーリーグ(アイスホッケー)、インディアンプレミアリーグ(クリケット)の実際のデータセットからのスポーツ分析は、ベストセラーの本と映画であるマネーボールによって示される現実世界の成功によって部分的に推進され、人気が高まっている研究分野として浮上している(セイバーメトリクス)。チームとプレーヤーのパフォーマンスデータの分析は、フィールド、コート、氷上だけでなく、ファンタジースポーツプレーヤーやオンラインスポーツギャンブルのリビングルームでもスポーツ業界に革命をもたらし続けている。実際のスポーツデータを使用した予測スポーツ分析の原則を使用して、プレーヤーとチームのパフォーマンスを予測する[25]。
Pythonを使ってデータをプログラミングする方法を示したり、マネーボールのストーリーの背景にある主張を検証したり、マネーボールの統計の進化を調べたりすることが可能である。公開されているデータセットから野球のパフォーマンス統計を計算するプロセスを案内される。実行期待値マトリックスを使用して導出された、より高度な測定値(Wins Above Replacement(WAR)など)に進む。これらの統計を使用して、独自のチームおよびプレーヤーの分析を行うことができるようになる[26][27]。
Pythonを使用してプロスポーツの試合結果の予測を生成する方法の主な重点は、チームの支出に関するデータを使用して、ゲームの結果をモデル化する方法としてロジスティック回帰の方法を教えることである。過去の結果をモデル化し、そのモデルを使用して、まだプレイされていない結果のゲームを予測するプロセスを実行する。ベッティングオッズのデータを使用してモデルの信頼性を評価する方法をオーナーに示す。分析は最初に英国プレミアリーグに適用され、次にNBAとNHLに適用される。データ分析とギャンブルの関係、その歴史、および個人的なリスクを含むスポーツベッティングに関連して発生する社会的問題の概要も説明する。マネーボールは、データ分析を使用してチームの勝率を高めることができることを示すことにより、プロスポーツのパフォーマンス統計の分析に革命を引き起こした[独自研究?][26][27]。
Pythonを使用してデータをプログラムし、マネーボールのストーリーの背後にある主張をテストし、マネーボール統計の進化を調べる方法を示し、公開されているデータセットから野球のパフォーマンス統計を計算するプロセスができる[26][27]。スポーツ分析には、トレーニングと競技の両方の取り組みを定量化するアスリートとチームからの大量のPythonデータセットが含まれるようになった。ウェアラブルテクノロジーデバイスは、アスリートが毎日着用しており、シーズン全体にわたるアスリートのストレスと回復を詳細に調べるためのかなりの機会を提供する。これらの大規模なデータセットのキャプチャは、怪我の予防に関する新しい仮説と戦略、およびトレーニングと回復を最適化するためのアスリートへの詳細なフィードバックにつながった。Pythonでのプログラミングを使用して、トレーニング、回復、パフォーマンスに関連する概念を調査することもできる[28]。
Python Scikit-learn(sklearn)ツールキットと実際の運動データを使用して教師あり機械学習手法を探索し、機械学習アルゴリズムと運動結果の予測方法の両方を理解する。サポートベクターマシン(SVM)、決定木、ランダムフォレスト、線形回帰およびロジスティック回帰、アンサンブルなどの方法を適用して、NHLやMLBなどのプロスポーツリーグからのデータを調べる。また、Apple Watchや慣性測定ユニット(IMU)などのウェアラブルデバイスも含まれる。分類と回帰の手法を使用して、運動活動やイベント全体であるスポーツ分析を可能にする方法を幅広く理解できるようになる。スポーツコンテストのカテゴリ別結果変数(つまり、勝ち、引き分け、負け)を処理する際の回帰モデル、線形確率モデル(LPM)を、その理論的基礎、計算アプリケーション、および経験的制限の観点からモジュールは、カテゴリ従属変数のLPMのより良い代替として、ロジスティック回帰をし、デモンストレーションする。順序付けられたロジットモデルと公開されている情報を使用してEPLサッカーゲームの結果を予測する方法を示す。ベッティングオッズに対してこれらの予測の正確さを評価し、それらが非常に正確であることを示す。北米の3つのチームスポーツリーグ(NHL、NBA、MLB)のコンテキストでモデルを複製することにより、前週に取り上げたEPL予測モデルの有効性を評価する。具体的には、順序付けられたロジットモデルと公開されている情報を使用して、NHL、NBA、MLBのレギュラーシーズンゲームの結果を予測する[29]。
元々はAmoebaの使用言語であるABC言語に例外処理やオブジェクト指向を対応させるために作られた言語である[30]。
1991年にヴァンロッサムがPython 0.90のソースコードを公開した。この時点ですでにオブジェクト指向言語の特徴である継承、クラス、例外処理、メソッドやさらに抽象データ型である文字列、リストの概念を利用している。これはModula-3のモジュールを参考にしていた。
1994年1月、Python 1.0を公開した。主な特徴として関数型言語の基本であるラムダ計算を実装、map関数・reduce関数などを組み込んだ。
バージョン1.4からはCommon Lispにある機能とよく似たキーワード引数を導入した。また簡易ながら名前修飾を用いたカプセル化も実装した。
2000年に公開。ガベージコレクションやUnicode、リストを導入した。一躍メジャーな言語となった。多くの機能はHaskellを参考にして導入している。
バージョン2.4には、子プロセスの起動やコマンドを実行できるsubprocessモジュールが実装された。[31]
2.6以降のバージョンには、2.xから3.xへの移植を助ける「2to3 ツール」と「lib2to3 モジュール」を含んでいる[† 13]。2.7が2.xの最後のバージョンで、2.7のサポートは2020年1月1日までである[† 14]。ただし、サポート終了後に 2.7.18 を2020年4月にリリースし、これが最後の 2.7.x になる[32][33]。これ以上のセキュリティパッチやその他の改善はリリースされない[† 15]。
2008年、長い試験期間を経てPython 3.0が公開された。 開発初期には、西暦3000年に公開予定の理想のPythonとして、Python 3000と呼んでいた。Py3Kと略すこともある。
しかし2.xとの後方互換性が損なわれている。当初は2.xに比べて3.xが利用できるライブラリ等が著しく少ないという問題点があったが、Djangoなど徐々に3.xに対応したフレームワークやライブラリなどが増えていったこともあり、2016年時点においては新規のプロジェクトについて3.xで開発することが多くなっている[36][信頼性要検証]。JetBrains とPythonソフトウェア財団による共同調査では、Python の 2 と 3 がどっちがメインであるかというアンケートで、Python 3 がメインであると答えた人が、2016年1月は40%だったが、2017年10月は75%になった[19][37]。
2015年11月にリリースされたFedora 23[38]や2016年4月にリリースされたUbuntu 16.04 LTS[39]では、デフォルトでインストールされるPythonのバージョンが2.xから3.xに変更されている。Red Hat Enterprise Linuxでは8をもってPython 2が廃止となった[40][41]。
3.0[42]
3.1[43][44]
3.2[45]
: TypeAlias
Pythonは PSF (Python Software Foundationライセンス) の下、オープンソースで配布されている。このライセンスの内容はGPLに類似したものであるが、変更したバージョンを配布する際に変更をオープンソースにしなくてもよい、という点がGPLとは異なっている。