Python
Python(パイソン)はインタープリタ型の高水準汎用プログラミング言語である。
![]() Pythonのロゴ | |
パラダイム |
関数型プログラミング、オブジェクト指向プログラミング、動的計画法、命令型プログラミング、マルチパラダイムプログラミング ![]() |
---|---|
登場時期 | 1991年 |
開発者 |
Pythonソフトウェア財団、グイド・ヴァンロッサム ![]() |
最新リリース | 3.12.2 - 2024年2月7日[1] [±] |
型付け | 強い型付け 動的型付け |
主な処理系 | CPython, PyPy, IronPython, Jython |
方言 | Cython, RPython, Stackless Python |
影響を受けた言語 |
ALGOL 68、ABC、Modula-3、C言語、C++、Perl、Java、LISP、Haskell、APL、CLU、Dylan、Icon、Standard ML ![]() |
影響を与えた言語 |
Boo Cobra D F# Falcon Go Groovy JavaScript[2] Ruby[3] Perl Scala Swift |
プラットフォーム |
クロスプラットフォーム ![]() |
ライセンス |
Python Software Foundation License ![]() |
ウェブサイト |
www |
概要
編集特徴
編集Pythonはインタプリタ上で実行することを前提に設計している。以下の特徴をもっている:
言語
編集Pythonには、読みやすく、それでいて効率もよいコードをなるべく簡単に書けるようにするという思想が浸透しており、Pythonコミュニティでも単純で簡潔なコードをよしとする傾向が強い[† 3]。
設計思想
編集構文
編集以下に、階乗 (関数名: 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ではこのように強制することによって、ソースコードのスタイルがその書き手にかかわらずほぼ統一したものになり、その結果読みやすくなるという考え方が取り入れられている。これについては賛否両論があり、批判的立場の人々からは、これはプログラマがスタイルを選ぶ自由を制限するものだ、という意見も出されている。
インデントによる整形は、単に「見かけ」だけではなく品質そのものにも関係する[5]。例として次のコードを示す。
間違えたC:
if (x > 10)
x = 10;
y = 0;
このコードはC言語の構文規則上は問題無いが、インデントによる見かけのifの範囲と、言語仕様によるifの実際の範囲とが異なっているため、プログラマの意図が曖昧になる。(前者は"y = 0;"がif文に包含され、後者は"{}"がないため"y = 0;"がif文に包含されない)この曖昧さは、検知しにくいバグを生む原因になる。例としてはApple goto failが挙げられる。
ソースコードを読む際、多くの人はインデントのような空白を元に整列されたコードを読み、コンパイラのように構文解析しながらソースを読むものではない。その結果、一見しただけでは原因を見つけられないバグを作成する危険がある。
Pythonではインデントをルールとすることにより、人間が目視するソースコードの理解とコンパイラの構文解析の間の差を少なくすることで、より正確に意図した通りにコーディングすることができると主張されている[5]。
型システム
編集型ヒント
編集Pythonは型ヒントの構文を用意している[6]。これはプログラマ向けの注釈および外部ツールによる静的型チェックに用いられる。
例として、文字列型の値を受け取って文字列型の値を返す関数は次のようにアノテーションできる。
def greeting(name: str) -> str:
return f"Hello {name}"
メモリ管理
編集Pythonはガベージコレクションを内蔵しており、参照されなくなったオブジェクトは自動的にメモリから破棄される。CPythonでは、ガベージコレクションの方式として参照カウント方式とマーク・アンド・スイープ方式を併用している。マーク・アンド・スイープ方式のみに頼っている言語では、オブジェクトがいつ回収されるか保証されないので、ファイルのクローズなどをデストラクタに任せることができない。CPythonは参照カウント方式を併用することで、循環参照が発生しない限り、オブジェクトはスコープアウトした時点で必ずデストラクトされることを保証している。なおJythonおよびIronPythonではマーク・アンド・スイープ方式を採用しているため、スコープアウトした時点で必ずデストラクトされることが前提のコードだとJythonやIronPythonでは正しく動かない。
イテレータ
編集イテレータを実装するためのジェネレータが言語仕様に組み込まれており、Pythonでは多くの場面でイテレータを使うように設計されている。イテレータの使用はPython全体に普及していて、プログラミングスタイルの統一性をもたらしている。
オブジェクト指向プログラミング
編集public
であり、virt
ual
︵仮想︶である。ただし、先頭にアンダースコアをもつメンバをprivate
とすることができる。これは単なるマナーであるが、アンダースコアを2つもつ場合は、クラスの外部からメンバの名前を隠された状態︵mangle; 難号化︶とすることでカプセル化を実現できる。また、利用者定義演算子が機能として用意されておりほとんどの組み込み演算子︵算術演算子︵arithmetic operator︶や添字表記︶はクラスインスタンスで使うために再定義することが可能となっている。
標準ライブラリ
編集Pythonには「電池付属 ("Battery Included")」という思想があり、プログラマがすぐに使えるようなライブラリや統合環境をあらかじめディストリビューションに含めるようにしている。このため標準ライブラリは非常に充実している。
- 正規表現
- OSのシステムコール
- XML処理系
- シリアライゼーション
- HTTP, FTP等の各種通信プロトコル
- 電子メールやCSVファイルの処理
- データベース接続 (SQLiteを標準で扱える)
- GUIフレームワーク (Tkinter)
- HTMLのパーサー
- Python自身のコードの構文解析ツール
サードパーティによるライブラリも豊富に存在する(参考: Python#エコシステム)。
組み込み型
編集Pythonは様々な組み込み型(built-in types)をサポートする。
Mapping型
編集dict
である。抽象基底クラスに collections.abc.Mapping
があり、抽象メソッドとして __getitem__
, __iter_
_
, __len__
が定義されている。__getitem__
をもったcollectionとも言える。
多言語の扱い
編集#!/usr/bin/env python3
# -*- coding: utf-8 -*-
s = '日本語の文字列'
実行環境
編集Pythonはインタプリタ型言語であり(ほとんどの場合)プログラムの実行に際して実行環境(ランタイム)を必要とする。以下はランタイム(実装)およびそれらが実装されているプラットフォームの一覧である。
動作環境
編集Pythonの最初のバージョンはAmoeba上で開発された。のちに多くの計算機環境上で動作するようになった。
- Windows, Windows CE(9x系およびNT系は最新版、Windows 3.1およびMS-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はパッケージ管理ソフト・ライブラリ・レポジトリなどからなるエコシステムを形成している。
パッケージ管理
編集pip
・pipenv
・poetry
・rye
・EasyInstallなどのパッケージ管理システムによっておこなわれる。バイナリパッケージのフォーマットにはwheelがあり、これをインタフェースとしてビルドシステムとパッケージ管理システムの分離が可能になっている[† 11]。
Python Package Index (PyPI) と呼ぶ公式のパッケージリポジトリが存在する。
パッケージ管理および実行環境管理を含めた統合開発環境としてはAnaconda (Pythonディストリビューション)が存在する。
ライブラリ
編集Pythonは多様なコミュニティライブラリによって支えられている。
- 数値計算
- 機械学習・データサイエンス・AI
- データ解析ソフト pandas
- グラフ表示ソフト Matplotlib
- 描画ソフト Seaborn
- データ処理インタフェース IPython
- 数式処理機能 SymPy
- データ処理の高速化 PyPy
- Pythonアプリのコンパイルによる高速化 Numba
- 画像処理のための Python Imaging Library
- SDLのラッパである Pygame
- スクレイピングライブラリ Beautiful Soup
- クローリング、スクレイピング用のpythonフレームワーク Scrapy
- 離散事象シミュレーション SimPy
- OpenCLへのインタフェース pyOpenCL
- OpenGLへのインタフェース pyOpenGL
- OpenCVへのインタフェース pyOpenCV
- CUDAへのインタフェース pyCUDA
- 3Dグラフィックスやアニメーション VPython
- 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/
- Pyramid(ピラミッド) - https://pylonsproject.org/projects/pyramid/
- Plone(プローン) - https://plone.org/
- Tornado (Webサーバ)(トルネード) - https://sites.google.com/site/tornadowebja/
- Cyclone(C10K問題対応)(サイクロン) - http://cyclone.io/
利用
編集データサイエンスおよび数値計算用途
編集Webアプリケーション用途
編集Django や Flask といったWebアプリケーションフレームワークが充実しているため、Webアプリケーション開発用途にも多く使われている。JetBrains とPythonソフトウェア財団による共同調査によると、2017年10月現在、26%の人が最も主要な用途としてWeb開発を選んだ[16]。
スマホアプリ用途
編集- kivy:オープンソースで商用利用も可能なので、スマホアプリの販売が可能。androidアプリもiOSアプリも作成することが可能
- tkinter:pythonの標準ライブラリで簡単にGUIアプリを作成可能。ネットでの情報が最も多い
- PyQt:クロスプラットフォームで作成可能だが、商用利用は有償
- xPython:クロスプラットフォームで動作可能なGUIアプリを作成可能
システム管理およびグルー言語用途
編集教育用
編集# Pythonで記述した「Hello,World!」の例
# Pythonはたった一行のコードで文字を表示することができる。
print("Hello, World!")
// Javaで記述した「Hello, World!」の例
// Javaでは文字の表示に最低5行(括弧を除くと3行)コードを記述する必要がある(もちろん改行をせずに横に連ねて書けば1行にもできるのだが)。
public class hoge {
public static void main(String...args) {
System.out.println("Hello, World!");
}
}
スポーツパフォーマンス分析
編集歴史
編集元々はAmoebaの使用言語であるABC言語に例外処理やオブジェクト指向を対応させるために作られた言語である[27]。
0.9x
編集1.x
編集2.x
編集バージョン | リリース日[31] | サポート期限[32] |
---|---|---|
2.0 | 2000年10月16日 | |
2.1 | 2001年4月15日 | |
2.2 | 2001年12月21日 | |
2.3 | 2003年7月29日 | |
2.4 | 2004年11月30日 | |
2.5 | 2006年9月19日 | |
2.6 | 2008年10月1日 | 2013年10月29日 |
2.7 | 2010年7月4日 | 2020年1月1日 |
3.x
編集バージョン | リリース日[31] | サポート期限[32] |
---|---|---|
3.0 | 2008年12月3日 | 2009年1月13日 |
3.1 | 2009年6月27日 | 2012年4月9日 |
3.2 | 2011年2月20日 | 2016年2月20日 |
3.3 | 2012年9月29日 | 2017年9月29日 |
3.4 | 2014年3月16日 | 2019年3月18日 |
3.5 | 2015年9月13日 | 2020年9月30日 |
3.6 | 2016年12月23日 | 2021年12月 |
3.7 | 2018年6月27日 | 2023年6月 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
3.10 | 2021年10月4日 | 2026年10月 |
3.11 | 2022年10月24日 | 2027年10月 |
3.12 | 2023年10月2日 | 2028年10月 |
: TypeAlias
を付与した明示的な型エイリアス
●引数仕様変数
●zip関数の追加パラメータ
3.11[51]
3.12[52]
Python の時系列
編集Pythonに影響を与えた言語
編集ライセンス
編集注釈
編集出典
編集一次文献
編集関連項目
編集- IPython - Pythonを対話的に実行するためのシェル。
- MyHDL - Python言語ベースのハードウェア記述言語
- Julia (プログラミング言語) - PythonのライブラリやC言語、Fortran言語のコードを呼び出せるプログラミング言語。Pythonよりも動作が高速である。
- スクリプト言語
- オブジェクト指向プログラミング
- 空飛ぶモンティ・パイソン - これがPythonという言語名の由来である[1][2]
学習用図書の例
編集脚注
編集- ^ Why is it called Python? - Python Software Foundation
- ^ Glyn Moody 小山祐司監訳『ソースコードの反逆』株式会社アスキー、2002年6月11日、384頁。