Python Programing Langage
このページの参照数 6185 回
リンク(随時更新)†
日本語のサイト†
一般サイト†
- PyJUG
日本のPythonユーザグループ
リンクのページに、日本人ユーザのページ/ブログの一覧があります
初心者用入門/紹介サイト†
リンク†
英語サイト†
- MoinMoin
pukiwikiほど有名じゃないけど、
Pythonで書かれたWikiEnginesの一つです。
- Mailman
結構有名なのだけど、Pythonで書かれている
ことはあまり知られていないメールサーバ
- pygame
Pythonでゲームを作るなら、コレは必須でしょう
- py2exe
PythonをインストールさせずにPythonをWinで動かす(3.0は未対応)
Pythonってどんな言語?†
「プログラミング未経験の方」向けの説明†
Pythonは数あるプログラミング言語の中で、入門者に優しく、奥の深い言語です。Pythonだけではできないこともたくさんありますが、習得したPython言語が不要になる日はまずこないでしょう。
なお、有名なマーフィーの法則に「教育用にも使えるものは、教育用にしか使えない」というものがありますが、このPython言語に関して言えば、その法則にはあてはまりません(実際、教育用としても実用としても使われているのですから)
欠点といえば、実行速度の遅さと、日本での知名度の低さ、でしょうか。
ともかく、「はじめてプログラミングを習ってみたい」なら、Pythonがお勧めです。
「他言語を経験された方」向けの説明†
Pythonは、プログラミングの概念をすでにある程度理解された方にとっては、ものの2、3時間で習得できるお手軽な言語です。もしかしたら、前言語には無かった新しい視点が得られるかもしれません。
- ソースコードの見通しの良さ(可読性)を最重要視
Pythonの言語仕様の全てはここから始まります。他人がソースを読んだり、自分の過去のソースを読んだ時に「見通しが良い」ことは、すなわち改良/再利用を促進するのみならず、教育/習熟用にも利用でき、さらに非プログラマにもアピールしやすく、その結果、ユーザを増やすことにもつながります。ソースコードを読む/読ませることに特化した言語というのが、Pythonの最大の特徴だと思われます。
なお、この可読性に関しては、他の要素と矛盾することが多く、特に書きやすさ(記述性?)との矛盾は、「手軽で書きやすい言語」というスクリプト言語の特徴と思われる部分と相反するため、批判が多い特徴でもあります。
- C/C++言語に似た言語仕様
細部を見ていくと、C系言語のポリシーとはかなり異なるPythonですが、見かけ上はC系言語に近い文法構造/演算子/予約語を採用しています(特にC++に近い)。思想を言語仕様に反映させていまいちポピュラーにならなかった、Pythonの祖先であるABC言語の反省からこうなったものと思われますが、逆にC/C++言語系言語や、同じC系スクリプト言語であるPerlのユーザには違和感を与える結果になることもあるようです。
- インデントブロック(非フリーフォーマット)
C系言語の「当然の特徴」の一つが、インデント(字下げ)や改行などを読みやすい形に自由にデザインできる「フリーフォーマット」なのですが、Pythonでは{}(ブレース括弧)ではなくインデントの深さによってブロック構造を表現するため、フリーフォーマットではなくなってしまいました。
これは、ABC言語から受け継いだ重要な仕様ですが、その意図は最初に述べた「可読性」重視によるものです。しかし、特にクラッシックな非フリーフォーマット言語を経験してきている方々には、非フリーフォーマットというだけでなんだか「古臭くて使いにくい」という印象を与え、敬遠される結果になっているようです。実際に使い始めた人は、あまり気にならなくなるようですが、それでも、AWKで流行った「一行野郎」(コンソールに一行で入力できるスクリプト)で、あまり凝ったことが出来なくなったのは事実で、スマートさをモットーとするパワースクリプターにはやや不人気のようです。
- 文(statement)ベースの構文
多分プログラマに、フリーフォーマットより不人気であろう特徴は、この「文ベース」の構文でしょう。「式(expression)」をベースにしたC言語系プログラミングテクニックがほぼ壊滅的に使用不能になることは、その道で職人芸を発揮してきたプログラマ(C,C++,Perl,AWK,ICONなど)にとってはあまり面白いことでは無いでしょう。式ベースにすることによる可読性の低下防止と思われますが、好みの分かれるところでしょう。
- オブジェクト指向思想にこだわらないOOP言語
Pythonは最初からオブジェクト指向プログラミング言語(Object Oriented Programing Langage)として設計されていますが、オブジェクトは「オプションだ」と言い切られているように、オブジェクトを意識せずとも十分プログラミングは可能です。ただし、ver.1.6以降(実際はPython ver.2.x系のための改変なので、以後Python2と記述します)大幅な言語仕様の見直しが行われ、以前はオブジェクトでなかった数値などもオブジェクトとして再設計されたため、「完全なオブジェクト指向言語」になりつつあります。しかし、オブジェクトを意識せずともプログラミングできる基本は全く変わっていません。
New!Python3では、旧式クラスを廃し、object型を継承する新式クラスのみに限定(ただしobject型からの継承は省略可能)
- 少ない文法、多彩なデータ型
Perlの多彩な文法は魅力的で、クールなショートカットスクリプトを書くには非常に便利ですが、Pythonではあえてその魅力的な部分を捨てて、単純な文法構造に徹しています(理由はやはり可読性)
その代わり、ICONから譲り受けた多彩な組み込みデータ型や演算子が使用できます。Javaでは敬遠された演算子のオーバーロードは、C++式ではなく、Smalltalk式のメソッドフック実装という形でオブジェクト毎に設定できますので、シンプルな記述が可能となります(Javaの思想ではこの「演算子のオーバーロード」は「可読性の低下・難解・使用率の低さ」ゆえに忌避されているようですが、ほとんどのパッケージソースが閲覧可能なPythonでは、事実上あまり問題になっていないようです。とはいえ、パブリックなモジュールには、必要以上には使われていないのも事実ですが・・・)。なお、Python2では、組み込みデータ型の継承による拡張が可能となりましたので、データ型利用の自由度はさらに上がりました。
- 比類なき手軽なモジュール
プログラミング言語において、プログラムを分割するモジュールを自作することは、ある程度高度な知識を必要とするのが通常です。しかし、Pythonでは自作のモジュールも扱いも信じられないくらい簡単です(Modula-3式だそうです)。スクリプトファイルを作れば、特別なことをせずともそれはモジュールとして扱えます。呼び出し側でimportすると、そこに書いてあることが普通に実行されるだけです。関数やクラスをいっぱい作って「自分のPython」にじゃんじゃんカスタマイズできます。覚えることは名前空間に関する簡単なルールだけ。他言語でモジュールにしりごみしている人でも、Pythonでは楽しくモジュールとつきあえます。
- 遅い実行速度
「改善されている」「マシンパワーが全体的に上がっているのでさして問題にならない」「生産効率のほうが重要だ」などといわれていますが、本質的に「人間に読みやすい、書きやすい」言語を目指したため、どうしてもコンパイラ言語のみならず、他のスクリプト言語や、下手すると実行コンパイルさえしない優秀なインタープリタ言語(PHPなど)よりもさらに遅かったりします。改善されているのは事実ですが、やはり他言語と比較して早くなることは、これからもまず無いでしょう。
- 少ない組み込み関数/豊富なライブラリモジュール
Python言語仕様とは少し異なりますが、ライブラリモジュールをインポートせずに使えるPythonの機能はごくわずかです。Cほど極端ではありませんが、例えば実行時の引数を調べることすら、sysというモジュールをインポートしないと使えません。さらに内訳をバラすなら、sysは「組み込みモジュール」として、処理系のコアと不可分に組み込まれているのに、わざわざ呼び出しが必要なのです。そもそも、「組み込みモジュール」なんて不思議なもの、他の言語にあるでしょうか?(標準、じゃないですよ)。これは、キーワードや組み込み関数を極力減らし、名前空間の衝突によるトラブルを回避した結果なのですが、他言語の経験者にはいかにも奇異に見えるかもしれません
- ロング整数(多倍長整数)サポート
メモリの限り無限桁数を扱えるロング整数が、コアとしてサポートされています。その関係か、科学計算関連でPythonを使用される方は多いようです。ver.2.4において、ロング整数は通常の整数とシームレスに変換されるようになりました。
New!Python3では、ロング整数という概念が無くなり、整数のメモリモデルは内部で自動的に処理されます。ゆえに表面上は限りなく大きな整数を扱えるといったイメージになります)
- 例外検出用文法のサポート
例外を捕らえる文法が、基本文法として取り入れられています。例外は組み込み例外以外にも自由に設定できるので、エラー検出以外にもプログラムに積極的に利用できます。例えばPythonではジャンプ構文が全面的に撤廃されていますので、多重ループから抜けるために例外文法を利用することなどが可能です。
- 日本語問題
現在、PyJUGの日本語環境をインストールすれば、UTF-8系Unicodeについては問題なく使えるのですが、S-JISとなると、内部でコード変換する必要がでてくるなど、やや面倒な処理が必要となります(Pythonはテキストだけでなくバイナリファイルも普通に処理できるので、フィルタなどはそちらで行うこともできますが、GUIを使うためにはコード変換が必須です)
※Python(2.4)より、本家の実装が日本語(及び、韓国語/中国語)をサポートしました。アジアにPythonが認知された結果なのか、あるいは本家Pythonコミュニティーがアジアの存在を認知したのか、いずれにせよ喜ばしいことです☆
New!Python3では、内部でネイティブにユニコードを扱うので、日本語の扱いがさらに楽になりました
- 明示的なselfポインタ
Pythonにはメソッドの外のクラスフィールド/インスタンスフィールドに対して暗示的にアクセスすることはできません。そのため、C++のthisやSmalltalkのselfにあたるポインタを「自分で設定し」「そこからアクセスする」必要があります。メソッドの第一引数は必ず所属オブジェクトのselfポインタになります
- 強力なモジュール機能
ライブラリモジュールが充実していることはすでに述べましたが、自分でモジュールを作成することもPythonでは容易です。import文でパスの通った場所のファイル名を指定してやれば、そのファイルは指定された名前空間に導入されます。モジュールの作り方には何の制限もなく、ただ、ファイルの拡張子を.pyにすれば良いだけです。このことによって、プログラムのモジュール化や再利用が促進され、コーディングのコストが大幅に削減されます。また、モジュールをパッケージ化したり、モジュールの中から特定のオブジェクトのみをインポートしたり、さらにはモジュール導入の際にモジュール名とは別の名前空間で登録できたりします。
なおこの特徴は、Modula-3という言語から導入したそうです。Javaのモジュール/パッケージインポートに似ていますが、モジュールから手軽にオブジェクトを利用できるJavaと、あくまで名前空間の衝突を避けようとするPythonは実際にははっきりと異なりますので、両方を使うプログラマは注意が必要です。
- かっこが外せない?
AWK,Perl,Rubyなどでは、関数の後ろの括弧が、見かけ上明白な場合は括弧がはずせますが、Pythonでは外せません。Pythonでは関数もすべてオブジェクトなので、括弧が無い場合、関数の適用ではなく、関数オブジェクトへの参照とみなされます(詳しくはここがヘンだよPythonistaを参照してください)
「マニアを自認する方」向け†
ここでは、Pythonという言語をある程度見聞きして知っている方について、ややコアなPythonの話題を掲げます。
※注意:この項目の特徴に関しては、使用の際、十分注意が必要です。さらに、この項目に挙げられた特徴を使用せずとも、通常のプログラミングにはほとんど支障がありません。
- 関数型プログラミングをサポート
関数は全てオブジェクト(ポインタ)として登録されます。そのため、高階関数に普通の引数のように直接引き渡す事も可能です。
- メタクラスプロトコル
最初から装備されていたらしいですが、便利に使えるようになったのは、2.1以降です。クラスのクラスであるtypeを使って、動的にクラスを作るなどの操作が可能です。
- レキシカルスコープとクロージャの実装
関数の入れ子を作ると、入れ子の深度とスコープルールが一致するレキシカルスコープルールが、Python2ではより明確になりました。このため、クロージャの実装がより手軽になりました(多分・・・)。
New!Python3ではさらに、予約語nonlocalの登場によって、さらに便利に。
- イテレータ/ジェネレータ
Python2で導入されたyieldキーワードによって、クラスによるオブジェクト定義を行わずとも手軽にイテレータ/ジェネレータを作成できるようになりました。
ver.2.4では、関数を用いずにジェネレータを定義する構文が追加されました。
- フィールド代入制限機構
Pythonでは、メソッドやフィールドの書き換えについて、ほとんど何の制限もありませんが、誤ってそういったものを書き換えないための保護策は、__setattr__組み込みメソッドによって実現されています。ただし「悪意ある」書き換えを保護する機能は、存在しません。
現在、Python3で新式オブジェクトスタイルが本格的に導入されていて、セキュリティ関連のコードもかなり書きやすくなりましたが、相変わらず「間違い」には対処できても「悪意」に対処するつもりは無いようです
Pythonのオブジェクト的メタファ†
完全なオブジェクト指向言語であるSmalltalk(Squeakなど参照)から見ると、Pythonのオブジェクトというのは、かなり珍妙に見えるかもしれない。
object message
と書くとき、Smalltalkでは、messageという単項メッセージをobjectに送った、という話だけで済む。
ところが、Pythonで同様に
object.method()
と書くと、話は非常にややこしくなる。まず、二通りの考え方が生まれる。
'object.method'を一つの名前とし、このオブジェクトに()という単項メッセージを送る。
'object'というオブジェクトに引数methodの二項メッセージ'.'を送り、その返り値である'object.method'に単項メッセージ()を送る。
つまり、methodがあくまでメッセージ(演算子)でなくオブジェクト(値)であることが、Pythonの解釈をややこしくしている。
使用上の注意†
- スタック・フローオーバーに注意
Pythonは比較的大きなメモリ空間を使用することができますが、スタックには限界があります。特に末尾再帰を最適化してgotoループにするような器用なことはしてくれません。たとえばこの、再帰を用いた階乗計算の式ですが……
fact = lambda n m=1:m if n==0 else fact(n-1, m*n)
この例では、大体1,000回程度でフローオーバーしてしまいます。この場合は、reduce(functools.reduce)を使用するか、素直にforループなどを使用しましょう。
import functools
fact2 = lambda n: functools.reduce((lambda x, y: x * y),range(1, n+1))
def fact3(n):
k = 1
for x in range(1,n+1):
k *= x
return k
どちらでも、10,000を指定してもスタックフローオーバーにはなりません。
Python3(Python 3000, py3k)†
最初はGuidoの夢想から始まったらしいPython3000の実現! Python3系が登場しました。現在豊富な資産を持つPython2派と、未来志向Python3派の地味な戦いが激化?
その他のサイト内Python関連ページ†
おまけ†