Python(パイソン)は、主としてインタープリタ的に実行される高水準汎用プログラミング言語であり、スクリプト言語としても使われる場合もある。

概要 Pythonは1990年代初頭にグイド・ヴァン・ロッサムが開発し、1991年2月に0.9.0として公開された。

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

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

Pythonのインタプリタは多くのOSに対応している。プログラマーのグローバルコミュニティは、自由かつオープンソース "All Python releases are Open Source" のリファレンス実装であるCPythonを開発および保守している 。非営利団体であるPythonソフトウェア財団は、PythonとCPythonの開発のためのリソースを管理・指導している。 特徴 Pythonはインタプリタ上で実行することを前提に設計している。以下の特徴をもっている: 動的な型付け ガベージコレクション マルチパラダイム モジュール・クラス・オブジェクト等の言語の要素が内部からアクセス可能であり、リフレクションを利用した記述が可能。

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

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

Pythonでは「あることをなすのに唯一の良いやり方があるはず」という哲学がある(参考: Perl「やり方は一つじゃない」TIMTOWTDI。)。

Pythonではプログラムの文書化(ソフトウェアドキュメンテーション)が重視されており、言語の基本機能の一部となっている。

PythonのドキュメントはPEP(Python Enhancement Proposal、ペップ)と呼ばれる。

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

以下に、階乗(関数名: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ではこのように強制することによって、ソースコードのスタイルがその書き手にかかわらずほぼ統一したものになり、その結果読みやすくなるという考え方が取り入れられている。これについては賛否両論があり、批判的立場の人々からは、これはプログラマがスタイルを選ぶ自由を制限するものだ、という意見も出されている。

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

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

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

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

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

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

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

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

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

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

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

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

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

TypedDict 型 TypedDict 型は特定のキーとバリュー型をもった辞書オブジェクトを表現する型である。

TypedDict 型の定義にはクラス継承構文が用いられるが、この型を持つオブジェクトはランタイムにおいて純粋な dict インスタンスになる。つまり型ヒント専用の型であり、ランタイム型とは区別される。

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

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

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

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

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

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

正規表現 OSのシステムコール XML処理系 シリアライゼーション HTTP, FTP等の各種通信プロトコル 電子メールやCSVファイルの処理 データベース接続(SQLiteを標準で扱える) GUIフレームワーク (Tkinter) HTMLのパーサー Python自身のコードの構文解析ツール

サードパーティによるライブラリも豊富に存在する(参考: Python#エコシステム)。

組み込み型 Pythonは様々な組み込み型(built-in types)をサポートする。

Mapping型 Mapping型はハッシュ可能な値を任意のオブジェクトへ対応付ける型である"A mapping object maps hashable values to arbitrary objects." The Python Standard Library - Python ver3.11.2. 2023-03-01閲覧.。対応する具象クラスは dict である。抽象基底クラスに collections.abc.Mapping があり、抽象メソッドとして __getitem__, __iter__, __len__ が定義されている。__getitem__ をもったcollectionとも言える。

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

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からは、日中韓国語用のコーデックが標準でディストリビューションに含まれるようになったため、現在では日本語の処理に関する問題はほとんどなくなった。ただしGUIライブラリであるTkinterや統合開発環境のIDLEは、プラットフォームにもよるが、まだきちんと日本語に対応していないものもある。

ソースコードの文字コードには、ASCIIと互換性があり、Pythonが対応しているものを使用する。ソースコードのデフォルトエンコーディングは、Python 3.xではUTF-8PEP 3120 -- Using UTF-8 as the default source encoding | Python.org(ソースコード以外のPython 3のデフォルトエンコーディングは複雑になっているPEP 538 -- Coercing the legacy C locale to a UTF-8 based locale | Python.orgPEP 540 -- Add a new UTF-8 Mode | Python.org)、Python 2.xではASCIIであるが、デフォルトエンコーディング以外の文字コードを使う場合は、ソースファイルの1行目か2行目に一定の書式でコメントとして記述することになっており、しばしば以下のようにEmacsやVimなどのテキストエディタにも認識可能な書式で記述される(次の例は Emacs が認識できる書式)。

#!/usr/bin/env python3 # -*- coding: utf-8 -*- s = '日本語の文字列'

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

動作環境 Pythonの最初のバージョンはAmoeba上で開発された。のちに多くの計算機環境上で動作するようになった。 Windows, Windows CE(9x系およびNT系は最新版、Windows 3.1およびDOSは旧版のみ) Macintosh(Classic Mac OSおよびmacOSともに) iOS Pythonista for iOS(omz:software) Android Pydroid3 for Android(IIEC) 各種UNIX Linux(Linux Standard Base3.2で標準仕様となった) Plan 9(Python 3.xは未移植) PalmOS S60 Javaプラットフォーム(Jython) .NET Frameworkプラットフォーム(IronPython)

ランタイム・コンパイラ Pythonには複数の実装(ランタイム又はコンパイラ)が存在する。 CPython - 作者によってC言語で書かれたバージョン。通常「Python」といえばこのCPythonを指す。 PyPy - Python(RPython)によるPythonの実装。 Cython - PythonをC言語化へトランスコードするソフトウェア。静的型付けが可能で速度の向上をはかれる。 IronPython - .NET Framework/Monoで動作するPython。C#で実装されている。.NET Frameworkのライブラリを使うことができる。動的言語ランタイム上に構築されているため、既存の.NETアプリケーションへマクロ言語として搭載することも可能となっている。 MicroPython - 組み込み向けの実装。256 kB以上のフラッシュを推奨。 Pyodide - WebAssembly向けの実装GitHub - pyodide/pyodide: Python with the scientific stack, compiled to WebAssembly.。 IPython - 対話計算に向けたPythonへのシェル Codon - Python言語ソースから機械語へのコンパイラ処理系exaloop/Codon"Python-based compiler achieves orders-of-magnitude speedups", MIT News, (March 14, 2023)."MIT Turbocharges Python’s Notoriously Slow Compiler > Codon lets users run Python code as efficiently as C or C++", IEEE Spectrum (2023年3月30日掲載記事)。 PyOMP - PythonをOpenMPで並列化するシステムT. G. Mattson, T. A. Anderson and G. Georgakoudis, "PyOMP: Multithreaded Parallel Programming in Python," in Computing in Science & Engineering, vol. 23, no. 6, pp. 77-80, 1 Nov.-Dec. 2021, doi: 10.1109/MCSE.2021.3128806.PyOMP: Parallel multithreading that is fast AND Pythonic. Presented by Tim Mattson (Intel)。 最新の Python 仕様には追従していないが開発が続けられているランタイム・コンパイラとしては以下が挙げられる。

Jython - Java仮想マシン上に移植したもの。PythonからJavaのライブラリを使うことができる。Python 2 系 (2025-06現在)。

開発が停止・終了したランタイム・コンパイラ

Stackless Python - Cスタックを使わずに独自のスタック(Pythonスタック)で実装。2021年で開発停止、2025年に終了宣言。 Unladen Swallow - GoogleのチームによるPythonの実装。 Psyco - CPython向けのJITコンパイラ。2012年に開発終了。 PyMite - 組み込み向けの実装、AVRなどに対応。 tinypy - 同じく組み込み向けの実装。ソースコードが 64 kB未満と非常に軽量なことが謳われている。

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

パッケージ管理 サムネイル|ビルドシステム/wheel/インストーラ Pythonのパッケージ管理はpip・pipenv・poetry・rye・uv・EasyInstallなどのパッケージ管理システムによっておこなわれる。バイナリパッケージのフォーマットにはwheelがあり、これをインタフェースとしてビルドシステムとパッケージ管理システムの分離が可能になっている"Wheel attempts to remedy these problems by providing a simpler interface between the build system and the installer." PEP 427 -- The Wheel Binary Package Format 1.0。

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

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

ライブラリ Pythonは多様なコミュニティライブラリによって支えられている。 数値計算 行列演算パッケージの NumPy プログラミング数学、科学、工学のための数値計算 SciPy 機械学習・データサイエンス・AI scikit-learn TensorFlow PyTorch Keras データ解析ソフト pandas グラフ表示ソフト Matplotlib 描画ソフト Seaborn 3Dグラフィックスやアニメーション VPython - https://vpython.org/ データ処理インタフェース IPython 数式処理機能 SymPy データ処理の高速化 PyPy Pythonアプリのコンパイルによる高速化 Numba, JAX 画像処理のための Python Imaging Library ゲーム開発モジュール Pygame レトロゲームエンジン Pyxel スクレイピングライブラリ Beautiful Soup クローリング、スクレイピング用のpythonフレームワーク Scrapy 離散事象シミュレーション SimPy OpenCLへのインタフェース pyOpenCL OpenGLへのインタフェース pyOpenGL OpenCVへのインタフェース pyOpenCV CUDAへのインタフェース pyCUDA PyODE Python(x,y) Webアプリケーションフレームワーク Bottle(ボトル) - https://bottlepy.org/docs/dev/ CherryPy(チェリーパイ) - https://cherrypy.org/ Django(ジャンゴ) - https://www.djangoproject.com/ Flask(フラスク) - http://flask.pocoo.org/ FastAPI(ファストエーピーアイ) - https://fastapi.tiangolo.com/ja/ Pyramid(ピラミッド) - https://pylonsproject.org/projects/pyramid/ Plone(プローン) - https://plone.org/ Tornado (Webサーバ)(トルネード) - https://sites.google.com/site/tornadowebja/ Cyclone(C10K問題対応)(サイクロン) - http://cyclone.io/

利用

Pythonは全世界で使われているが、欧米の企業でもよく使われている。大企業ではマイクロソフトやAppleなどのパッケージソフトウェア企業をはじめ、Google、 Yahoo!、 YouTube などの企業も利用している。また携帯電話メーカーのノキアでは、S60シリーズでPythonアプリケーションが動く。研究機関では、NASAや日本の高エネルギー加速器研究機構でPythonが使われている。

適応範囲はデータサイエンス、Webプログラミング、GUIベースのアプリケーション、CAD、3Dモデリング、数式処理など幅広い分野に及ぶ。

データサイエンスおよび数値計算用 NumPy、SciPyなどの高速な数値計算ライブラリの存在により、データサイエンスや科学技術コンピューティングにもよく用いられる。NumPy、SciPyの内部はC言語で書かれているので、動的スクリプト言語の欠点の一つである動作速度の遅さを補っている。NumbaやJAXを使うと、Python のコードがLLVMにJITコンパイルして利用可能であり、非常に高速な計算ができる。TensorFlow などのライブラリにより GPU 上で高速に計算するライブラリも充実している。

JetBrainsとPythonソフトウェア財団による共同調査によると、2017年10月現在、Pythonの最も主要な用途は何かというアンケートの結果によると、27%がデータサイエンス(そのうち18%がデータ解析、9%が機械学習)である。

Webアプリケーション用途 DjangoやFlaskといったWebアプリケーションフレームワークが充実しているため、Webアプリケーション開発用途にも多く使われている。JetBrains とPythonソフトウェア財団による共同調査によると、2017年10月現在、26%の人が最も主要な用途としてWeb開発を選んだ。

スマホアプリ用途

kivy:オープンソースで商用利用も可能なので、スマホアプリの販売が可能。androidアプリもiOSアプリも作成することが可能 Tkinter:pythonの標準ライブラリで簡単にGUIアプリを作成可能。ネットでの情報が最も多い PyQt:クロスプラットフォームで作成可能だが、商用利用は有償 xPython:クロスプラットフォームで動作可能なGUIアプリを作成可能

システム管理およびグルー言語用途 スクリプト言語としての特性から、従来Perlやシェルスクリプトが用いられることの多かったシステム管理用のスクリプトとして複数のOSで採用されている。また、異なる言語で書かれた多数のモジュールの機能を貼り合わせるグルー言語(糊の言語)として利用する例も多い。実際、多くの商用アプリケーションでPythonは組み込みのスクリプト言語として採用されている。

JetBrainsとPythonソフトウェア財団による共同調査によると、2017年10月現在、9%の人が最も主要な用途としてDevOps、システム管理、自動化スクリプトを上げた。

教育用 Pythonは本来は教育用を目的として設計されたわけではないが、その単純さから子供が最初に学ぶプログラミングにおける教育用の言語としての利用が増えている。グイド・ヴァンロッサムはPython設計以前に教育用言語であるABCの開発にかかわり、教育用としての利用について期待感を示したこともあり、方針として非技術者向けといった利用を視野に入れているとされることもある。

私の大好きなPython利用法は、騒ぎ立てずに、言語教育でプログラミングの原理を教えること。それを考えてくれ――次の世代の話だね。-- スラド『 Guido van Rossum へのインタビュー』

情報処理推進機構(IPA)は国家試験の基本情報技術者試験では2020年の春期試験からCOBOLを廃止してPythonを追加したプレス発表 基本情報技術者試験における出題を見直し:IPA 独立行政法人 情報処理推進機構。