Python
出典: Wikipedio
|
プライバシー・ポリシー Wikipedioについて 免責事項 Template:Infobox プログラミング言語 Template:プログラミング言語 Python(パイソン)は、オランダ人のグイド・ヴァンロッサムが作ったオープンソースのプログラミング言語。オブジェクト指向スクリプト言語の一種であり、Perlとともに欧米で広く普及している。イギリスのテレビ局 BBC が製作したコメディ番組『空飛ぶモンティ・パイソン』にちなんで名付けられた。Pythonは英語で爬虫類のニシキヘビの意味で、Python言語のマスコットやアイコンとして使われることがある。
目次 |
概要
Pythonは汎用の高水準言語である。プログラマの生産性とコードの信頼性を重視して設計されており、核となるシンタックスおよびセマンティクスは必要最小限に抑えられている反面、利便性の高い大規模な標準ライブラリを備えている。
Unicodeによる文字列操作をサポートしており、日本語処理も標準で可能である。 多くのプラットフォームをサポートしており(動作するプラットフォーム)、また、豊富なドキュメント、豊富なライブラリがあることから、産業界でも利用が増えつつある。
特徴
Pythonはインタプリタ上で実行されることを前提に設計されており、以下のような特徴をもっている:
利用範囲
Webプログラミング、GUIベースのアプリ ケーション、CAD、3Dモデリング、数式処理等幅広い分野で使用されている。あるいは、スクリプト言語としての特性から、従来Perlやシェルスクリプトが用いられることの多かったシステム管理用のスクリプトとして採用しているOSも複数ある。
また、多くの異なる言語で書かれたモジュールをまとめるグルー言語としての利用例も多い。実際、多くの商用アプリケーションで Python は組み込みのスクリプト言語として採用されている(Pythonを使っている製品あるいはソフトウェアの一覧)。
動作するプラットフォーム
Pythonの最初のバージョンはAmoeba上で開発されたが、のちに多くのプラットフォーム上で動作するようになっている。
- Windows, Windows CE(9x系およびNT系は最新版、Windows 3.1およびMS-DOSは旧版のみ)
- Macintosh(OS 9以前およびOS X以降ともに)
- 各種UNIX
- Linux(Linux Standard Base3.2で標準仕様となった)
- Plan 9(Python 3.xは未移植)
- PalmOS
- S60
- Javaプラットフォーム (Jython)
- .NET Frameworkプラットフォーム (IronPython)
実装
現在のところ、Pythonインタプリタには複数の実装が存在している:
- CPython - オリジナルのCで書かれたバージョン。通常「Python」といえばこのCPythonを指す。
- Stackless Python - PythonインタプリタをCスタックを使わずに独自のスタック(Pythonスタック)で実装したもの。
- Jython - Java仮想マシン上に移植したもの。PythonからJavaのライブラリを使うことができる。
- IronPython - .NET Framework/Monoで動作するPython。C#で実装されている。.NET Frameworkのライブラリを使うことができる。
- PyPy - PythonによるPythonインタプリタの実装
- PyMite - 組み込み向けの実装、AVRなどに対応。
ライセンス
Python のリリースは全てオープンソースであり、PSF(Python Software Foundationライセンス)として配布されている。これはGPL互換であるが、GPLと異なり、変更したバージョンを配布する際に変更をオープンソースにしなくてもよい。
歴史
元々はAmoebaの使用言語であるABC言語に例外処理やオブジェクト指向を対応させるために作られた言語である。<ref>Why was Python created in the first place?</ref>
0.9x
1991年にヴァンロッサムによってPython.0.90のソースコードが公開された。この時点ですでにオブジェクト指向言語の特徴である継承、クラス、例外処理、メソッドやさらに抽象データ型である文字列、リストの概念が導入されている。これはModula-3のモジュールを参考にしていた。
1.x
1994年1月、Python1.0がリリースした。主な特徴として関数型言語の基本であるラムダ計算を実装、MAP型、REDUCEなどが組み込まれている。
バージョン1.4ではCommon_Lispにある機能とよく似たキーワード引数が導入された。また簡易ながら名前修飾を用いたカプセル化も実装された。
2.x
2000年に公開。ガベージコレクションやUnicode、リストが導入され一躍メジャーな言語となった。多くの機能をHaskellから参考している。
3.x
2008年、長いテスト期間を経てPython3.0がリリースされた。専らPy3Kと略される。
しかし2.xとの後方互換性が損なわれており使い手がまだまだ少ないのが現状である。
Python の時系列
- 1990年代始め - オランダにあるStichting Mathematisch Centrum(CWI)で、グイド・ヴァンロッサムによってPythonの初期バージョンが作成される。
- 1995年 - ヴァンロッサムは米国ヴァージニア州レストンにあるCorporation for National Research Initiatives(CNRI) に移動。ここでPythonの開発に携わり、いくつかのバージョンをリリースする。
- 2000年3月 - ヴァンロッサムとPythonのコア開発チームは BeOpen.com に移り、BeOpen PythonLabs チームを結成する。同年10月、PythonLabsチームはDigital Creations(現在のZope Corporation) に移る。
- 2001年 - Pythonに関する知的財産を保有するための非営利組織Python Software Foundation(PSF) が立ち上がる。このときZope CorporationはPSFの賛助会員となる。
Pythonに影響を与えた言語
- ABC(インデントによる構文)
- Modula-2, -3(モジュール機能、オブジェクト指向)
- Icon(辞書、スライス演算子など)
- SETL(リストの内包表現)
- C, C++(基本的な構文)
- Smalltalk(仮想マシン機構、動的性)
- Lisp, Scheme(関数型言語の機能)
言語の機能
Pythonは言語自身の機能をできるだけ小さくおさえ、ユーザがいつも必要とする最小限の機能のみを提供するように作られている。これはPerlのTIMTOWTDI(GiBupC <a href="http://gpsnqwvzbsbg.com/">gpsnqwvzbsbg</a>, [url=http://dbtauaohikgv.com/]dbtauaohikgv[/url], [link=http://fasownhcrtod.com/]fasownhcrtod[/link], http://npemhjdofvfv.com/ - あることをするのにいくつものやり方がある)という哲学とは対照的であり、Pythonでは多くのユーザによって書かれた同一の仕事をするプログラムは、だいたいどれも同じようなコードに収束する。基本機能にないものの多くはライブラリによって提供されている。
また、Pythonではプログラムの文書化(ソフトウェアドキュメンテーション)が重視されており、言語の基本機能の一部となっている。
グイド・ヴァンロッサムはPython設計以前に教育用言語であるABCの開発にかかわっているが、Pythonは教育を目的として設計されたわけではない<ref>http://www.rakunet.org/TSNET/TSpython/35/1067.html</ref>。
Pythonには、読みやすく、それでいて効率もよいコードをなるべく簡単に書けるようにするという思想がすみずみまで浸透しており、Pythonコミュニティでもわかりやすいコードをよしとする傾向が強いTemplate:要出典。
文法
Pythonの文法は基本的にCやJavaなどとよく似ているが、Python独自の特徴のひとつにインデントを用いたブロック構造の定義がある。これは通常のCなどにおける中カッコによるブロック構造のかわりに、行頭からの空白(インデント)による「見た目のブロック構造」と「実際の論理的な制御構造」を結びつける手法で、視覚に訴えるコードの使用を強制している。なお、C/C++やJavaでは文末に ;
(セミコロン)をつける必要があるが、Pythonでは必要ない。ただしPythonでもセミコロンは文末として機能するため、複数の文をつなげる目的で ;
(セミコロン)を使ってもかまわない。しかし、if-else構文などは(Python 2.4までは)本質的に 1行で書くことは不可能であった。Python2.5で導入された条件付評価式 (Conditional Expressions) のif-elseを使用すれば、1つの式として記述できる。
以下にCとPythonで再帰呼び出しを用いて階乗を計算する例を示す:
Python: <source lang="python"> def factorial(x):
if x == 0: return 1 else: return x * factorial(x - 1)
</source>
きれいなC: <source lang="c"> int factorial(int x) {
if(x == 0) { return 1; } else { return x * factorial(x - 1); }
} </source>
こうして見るとPythonときれいなCプログラムとの間に違いはほとんど見られない。しかしここで重要なのは、上のCの形式は単なるコーディングスタイルのひとつにすぎないということである。そのため、Cではまったく同じプログラムを以下のように書くこともできる:
わかりにくいC: <source lang="c"> int factorial(int x) {
if(x == 0) {return 1;} else {return x * factorial(x - 1); } }
</source>
Pythonではこうした書き方は許されていない。インデントは単なるスタイルではなく、必須の文法だからである。Pythonではこのような強制を課すことによって、プログラムのスタイルがその書き手にかかわらずほぼ統一したものになり、その結果読みやすくなる、という思想があるが、一部の人々からは、これはプログラマがスタイルを選ぶ自由を制限するものだ、との声もあがっている。
また、空白を適宜にいれて整形されたソースコードは、たしかに読みやすいものとなる。しかし、それだけでは十分ではない。
間違えたC: <source lang="c"> if (x > 10)
x = 10; y = 0;
</source>
このコードは、文法的には正しいが、おそらく書いた本人が意図した動作をせず、しかも、それを見つけるのが困難である。
多くの人は、どのようなコーディングスタイルであれ、インデントのような空白によって明確に整列されたコードを目安としてソースコードを読むのであって、コンパイラのように構文解析しながらソースを読むものではない。その結果、文法は正しく、見た目も一見正しく見えるのに、不具合を作り込んでしまう危険性がある。
Pythonでは、インデントを文法の一部に組み入れることにより、人間が目視するソースコードの理解と、コンパイラの構文解析の間のミスマッチを少なくすることで、より正確に意図したとおりにコーディングすることができるようになっている。
データ型
Pythonのデータは動的に型付けされる。値自身が型を持っており、変数はすべて値への参照である。
基本的なデータ型として、整数型・多倍長整数型・浮動小数点数型・複素数型・文字列型・Unicode文字列型、そして関数型がある。多倍長整数型は(メモリの許す限り)無制限の桁数で整数計算が可能である。
さらに組み込みのコンテナ型として、リスト型、タプル型、辞書型(連想配列)のほか、値の重複を許さない集合型(Python 2.3以降)がある。
リスト型および辞書型は内部の値をあとから変えられる(GiBupC <a href="http://gpsnqwvzbsbg.com/">gpsnqwvzbsbg</a>, [url=http://dbtauaohikgv.com/]dbtauaohikgv[/url], [link=http://fasownhcrtod.com/]fasownhcrtod[/link], http://npemhjdofvfv.com/、変更可能)が、タプル型は一度構築したら内部の値は変わらない(GiBupC <a href="http://gpsnqwvzbsbg.com/">gpsnqwvzbsbg</a>, [url=http://dbtauaohikgv.com/]dbtauaohikgv[/url], [link=http://fasownhcrtod.com/]fasownhcrtod[/link], http://npemhjdofvfv.com/、変更不能)。タプル型とリスト型は、多くのプログラミング言語では配列と呼ばれるものに類似している。しかし、Pythonではタプル型は辞書のキーとして使うことができるが、リスト型は内容が変わるため辞書のキーとして使うことはできないという理由から、これら 2つの型を区別している。集合型には変更可能なものと変更不能なものの 2種類がある。
多くのオブジェクト指向プログラミング言語と同様、Pythonではユーザが新しく自分の型を定義することも可能である。この場合、組み込み型を含む既存の型を継承して新たな型(クラス)を定義する事も、ゼロから全く新しい型を作り出す事も出来る。
Pythonは基本的にメソッドや関数の引数に型を指定する必要がないので、内部で必要とする演算子やメソッドに対応していれば、関数やオブジェクトの設計時点で意図していなかったオブジェクトを引き渡すことも可能である(いわゆるダック・タイピングが可能)
Pythonはガベージコレクションを内蔵しており、参照されなくなったオブジェクトは自動的にメモリから破棄される。CPythonでは、ガベージコレクションの方式として参照カウント方式とマーク・アンド・スイープ方式を併用している。マーク・アンド・スイープ方式のみに頼っている言語では、オブジェクトがいつ回収されるか保証されないので、ファイルのクローズなどをデストラクタに任せることができない。CPythonは参照カウント方式を併用することで、循環参照が発生しない限り、オブジェクトはスコープアウトした時点で必ずデストラクトされることを保証している。 JythonおよびIronPythonではマーク・アンド・スイープ方式を採用しているためスコープアウトした時点で必ずデストラクトされることが前提のコードだとJythonやIronPythonでは正しく動かない。
イテレータを実装するためのジェネレータが言語仕様に組み込まれており、Pythonでは多くの場面でイテレータを使うように設計されている。イテレータの使用はPython全体に普及していて、プログラミングスタイルの統一性をもたらしている。
オブジェクト指向プログラミング
Pythonでは扱えるデータの全てがオブジェクトである。単純な数値といった基本的なデータ型をはじめ、組み込みのコンテナ型、組み込み関数など、これらは全て統一的な継承関係をもつオブジェクトであり「型」をもっている。これらの組み込み型とユーザ定義型は区別されず、組み込み型を継承したクラスを定義できる。上の「データ型」の項で述べたように Pythonは静的な型チェックを持たないため、Javaのようなインターフェイスという言語上の仕組みは必要とされない。
クラスの継承 (GiBupC <a href="http://gpsnqwvzbsbg.com/">gpsnqwvzbsbg</a>, [url=http://dbtauaohikgv.com/]dbtauaohikgv[/url], [link=http://fasownhcrtod.com/]fasownhcrtod[/link], http://npemhjdofvfv.com/) メカニズムでは、複数の基底クラスを持つことができ(多重継承)、導出されたクラスでは基底クラスの任意のメソッドをオーバライド(GiBupC <a href="http://gpsnqwvzbsbg.com/">gpsnqwvzbsbg</a>, [url=http://dbtauaohikgv.com/]dbtauaohikgv[/url], [link=http://fasownhcrtod.com/]fasownhcrtod[/link], http://npemhjdofvfv.com/、上書き)することが可能である。
また、オブジェクトには任意のデータを入れることができる。これらのメソッドやデータは、基本的に、すべてpublic
であり、virtual
(仮想)である。ただし、先頭にアンダースコアをもつメンバをprivate
とすることができる。これは単なるマナーであるが、アンダースコアを2つもつ場合は、クラスの外部からメンバの名前を隠された状態(難号化(GiBupC <a href="http://gpsnqwvzbsbg.com/">gpsnqwvzbsbg</a>, [url=http://dbtauaohikgv.com/]dbtauaohikgv[/url], [link=http://fasownhcrtod.com/]fasownhcrtod[/link], http://npemhjdofvfv.com/))とすることでカプセル化を実現できる。また、ほとんどの組み込み演算子(算術演算子(GiBupC <a href="http://gpsnqwvzbsbg.com/">gpsnqwvzbsbg</a>, [url=http://dbtauaohikgv.com/]dbtauaohikgv[/url], [link=http://fasownhcrtod.com/]fasownhcrtod[/link], http://npemhjdofvfv.com/)や添字表記)はクラスインスタンスで使うために再定義することが可能となっている。
ライブラリ
Pythonには「電池が付属しています(GiBupC <a href="http://gpsnqwvzbsbg.com/">gpsnqwvzbsbg</a>, [url=http://dbtauaohikgv.com/]dbtauaohikgv[/url], [link=http://fasownhcrtod.com/]fasownhcrtod[/link], http://npemhjdofvfv.com/)」の発想があり、プログラマがすぐに使えるようなライブラリや統合環境があらかじめディストリビューションに含まれている。このため標準ライブラリは非常に充実しており、ここには正規表現をはじめOSのシステムコールやXML処理系、シリアライゼーション、HTTP、FTP等の各種通信プロトコル、電子メールやCSVファイルの処理、データベース接続(SQLiteを標準に含む)、GUIフレームワーク (Tkinter)、そしてHTMLやPython自身のコードの構文解析ツールなどが含まれる。
サードパーティによるライブラリも多い。行列演算パッケージのNumeric Pythonや画像処理のためのPython Imaging Library、SDLのラッパであるPyGameなどはよく知られている。ただし、マイナーなものまで含めると多すぎて収拾がつかなくなったため、Python Cheese Shop と呼ばれるライブラリのリポジトリを管理する機構が導入された。
多言語の扱い
Pythonは当初1バイト単位での文字列型のみ扱い、かな漢字のようなマルチバイト文字をサポートしていなかったが、Python 2.0からUnicode文字型が新たに導入された。
Pythonでは文字のバイト列表現(エンコーディング)とUnicodeの内部表現を明確に区別している。Unicode文字はメモリ中に保持される抽象的なオブジェクトであり、画面表示やファイルへの入出力のさいには、変換ルーチン(コーデック)を介して特定のエンコーディングのバイト列表現と相互変換する。また、ソースコード中の文字コードを認識する機能があり、これによって異なる文字コードで書かれたプログラムの動きが異なるという危険を解消している。
Pythonでは変換ルーチンをモジュールとして追加することで、さまざまなエンコーディングに対応できるようになっている。日本語の文字コード (EUC-JP, Shift_JIS, MS932, ISO-2022-JP) に対応したコーデックも作成されている。Python 2.4からは、日中韓国語用のコーデックが標準でディストリビューションに含まれるようになったため、現在では日本語の処理に問題はほとんどなくなった。ただしGUIライブラリであるTkinterや統合開発環境のIDLEは、プラットフォームにもよるが、まだきちんと日本語に対応していないものもある。
UTF-8で記述した日本語を含むCGIプログラムを実行すると、「Internal Server Error 500」が発生することがある。そのときはソース先頭部に、次のようにUTF-8によるコーディングであることを明示する。 <source lang="python">
- !/usr/bin/python
- coding: utf-8
import cgi </source>
教育用言語としてのPython
でも、私の大好きなPython利用法は、騒ぎ立てずに、言語教育でプログラミングの原理を教えること。それを考えてくれ――次の世代の話だね。(『スラッシュドット・ジャパンでの Guido van Rossum へのインタビュー』より)
Pythonは教育用としてデザインされたわけではない。しかし、プログラミング言語教育にも使用され、成功を収めているTemplate:要出典。また方針として、「非技術者」向けといった利用方法を視野に入れながら開発され続けているTemplate:要出典。
ユーザ
Pythonを使っている製品あるいはソフトウェア
Pythonを使っている製品あるいはソフトウェアの一覧を参照のこと。
Pythonを利用している企業・機関
Pythonはおもに欧米の企業でよく使われている。大企業ではマイクロソフトやアップルなどのパッケージソフトウェア企業をはじめ、Google、Yahoo!、YouTube などの企業も利用している<ref name="quotes">Template:Cite web</ref>。また携帯電話メーカーのNokiaでは、S60シリーズで Python アプリケーションが動く<ref>Template:Cite web</ref>。研究機関では、NASA<ref name="quotes" />や日本の高エネルギー加速器研究機構<ref>Template:Cite web</ref>でPythonが使われている。
脚注
<references/>
外部リンク
- Python 公式サイト (英語) - ソフトウェアおよびマニュアルのダウンロード。
- 日本Pythonユーザ会 - マニュアルの日本語訳を配布している。
- Python Wiki (英語) - Python関連情報のWiki。
- OrganizationsUsingPython - PythonInfo Wiki (英語) - Pythonを利用している組織の一覧。
- スラッシュドット・ジャパンでの Guido van Rossum へのインタビューの翻訳
- PLEAC-Python
Template:FOSS Template:Link FA ru
Template:Link FAaf:Python als:Python (Programmiersprache) an:Python ar:بايثون az:Python bg:Python bn:পাইথন (প্রোগ্রামিং ভাষা) bs:Python programski jezik bug:Python ca:Python cs:Python da:Python (programmeringssprog) de:Python (Programmiersprache) el:Python en:Python (programming language) eo:Python (programlingvo) es:Python et:Python (programmeerimiskeel) eu:Python fa:زبان برنامهنویسی پایتون fi:Python fr:Python (langage) gl:Python he:Python hi:पाइथन (प्रोग्रामन भाषा) hu:Python (programozási nyelv) ia:Python (linguage de programmation) id:Python (bahasa pemrograman) is:Python (forritunarmál) it:Python jbo:paiton ka:პითონი (პროგრამირების ენა) ko:파이썬 la:Python lt:Python lv:Python ml:പൈത്തൺ (പ്രോഗ്രാമിങ്ങ് ഭാഷ) ms:Python ne:पाइथन प्रोग्रामिङ्ग भाषा nl:Python (programmeertaal) no:Python pl:Python pt:Python ro:Python ru:Python sh:Python programski jezik simple:Python (programming language) sk:Python (programovací jazyk) sl:Python (programski jezik) sq:Python sr:Пајтон (програмски језик) sv:Python (programspråk) ta:பைத்தோன் te:పైథాన్ (కంప్యూటర్ భాష) th:ภาษาไพทอน tr:Python (programlama dili) uk:Python vi:Python (ngôn ngữ lập trình) zh:Python