Python/

Pythonは高水準の汎用プログラミング言語です。 Pythonの設計思想はコードの読みやすさに重点を置いています。 その構造に対するアプローチは独特であり、例えば、ブロックは波括弧 { } ではなくインデントで構造化されています。
また、Pythonはオブジェクト指向、インタプリタ、動的コーディング、クロスプラットフォームのプログラミング言語です。 これらのアプローチは、プログラマが小規模なプロジェクトから大規模なプロジェクトまで、自明で論理的なコードを書くことができるようにすることを目的としています。
Python(パイソン)の処理系はUnix(ユニックス)、GNU/Linux(グヌー・スラッシュ・リナックス)のディストリビューションやmacOS(マックオーエス)には最初から付属していますが、他のオペレーティングシステムには、Pythonの処理系が最初はインストールされていない場合があります。
GNU/Linuxのデスクトップ環境の場合、コマンド端末を起動して、コマンド端末の内部でコマンド「python」(あるいは「python3」)を実行すると、次のように「コマンドライン インタプリタ」 が起動します。(コマンド端末の起動と終了のしかたについては、後述します)。
「>>> 」のあとに、キーボードによって文字を入力をします。「>>> 」をプロンプトといいます。
なお、pythonのこのような入力モードを、「インタラクティブ モード」といいます。
インタラクティブ モードを終了したい場合は、コマンド「exit()」を実行します。
Windowsの場合、2通りのPythonのプログラミングの方法があります。
本書では、後者について説明します。
Pythonプログラムの実行方法は、大きく分けると2種類あり、
という、2種類の実行方法があります。
なお、Windowsでは、Windowsでテキスト エディターにあるプログラムを「python3」コマンドなどで起動する場合、コマンド プロンプトあるいはWindows Terminalから起動します(python付属のコマンド端末ではありません)。
では、Pythonによるメッセージ表示を、それぞれの方法で、見ていきましょう。
(これはインタラクティブ モードです。)
pythonインタプリタで、「ようこそ」とメッセージ表示をしたい場合は、次のようにコマンドを入力します。
すると、
のように、コマンド端末内に文字が表示されます。
文字列の出力はprint()を使います。「()」の中に、出力したい文字列が入ります。 Python 2まではprintは文でしたが、Python 3以降は組込み関数となったため、かっこが必須となります。
いっぽう、pythonは、拡張子「.py」のファイル(たとえばファイル名「hello.py」など)を実行するという方法でも、プログラムを実行できます。
そのため、あらかじめ、テキスト エディターに、コードを記述して保存しておく必要があります。
けっして、Wordなどのワープロソフトには、保存しないでください。ワープロソフトに保存してしまうと、たとえ、あとで拡張子を「py」に書換えても、プログラムが動作しなかったり、あるいはプログラムの内容が変わってしまう場合があります。
なので、ワープロソフトではなく、かならず、テキスト エディターに、コードを保存する必要があります。
さて、プログラム実行の前に、まず、テキスト エディターを開きましょう。
というコードを入力しましょう。
そして、入力したコードを、ファイル名「hello.py」で保存しましょう。べつにファイル名は、拡張子がpyであれば、「sample.py」や 「test.py」でも良いのですが、とりあえず本書では、さきほどのコードのファイル名は「hello.py」とします。
すると、テキスト エディターの種類によっては、プログラム文である事を認識し、
のように、色がつく場合もあります。色のつかない種類のテキスト エディターもあるので、あまり気にしなくても構いません。
そして、コマンド端末で、
と入力することで、実行できます。拡張子に「.py」をつけるのを忘れないでください。拡張子「.py」がないと、エラーになり、プログラムを実行できません。
とにかく、上記のコマンド(python3 hello.py)を実行して、コマンド端末画面に
と表示されれば成功です。
このように、pythonのプログラムの実行方法には2種類あり、
という、2種類の実行方法があります。
そして、どちらの実行方法の場合でも、ほとんどのコマンドは共通です。
では、さきほどの「ようこそ」と表示するプログラムを実行してメッセージ表示させた直後に、
ソースコードだけを書換えてみると、どうなるのでしょうか。
さきほどの「ようこそ」と表示するプログラムを実行してメッセージ表示させた直後に、ソースコードのファイル「hello.py」に
と入力して、さきほどのソースコードのファイル「hello.py」に上書き保存したら、どうなるでしょうか?
「hello.py」で保存した直後に、 コマンド端末で
を実行すると、「12345ようこそ」と表示されます。
つまり、pythonでは、コマンド python3 hello.pyを実行するたびに、ソースコード(この場合は「hello.py」がソースコード)を解釈しなおします。
「pythonがインタプリタである」という事は、上記の例のように、「プログラムの実行開始時に、ソースコードをもとに、毎回、コードを解釈しなおす」という意味です。

pythonでは、数値の四則演算(足し算、引き算、かけ算、割り算)ができます。
足し算には記号「+」を使用します。引き算には記号「-」を使用します。かけ算には記号「*」(アスタリスク)を使用します。割り算には記号「/」(スラッシュ)を使用します。
では、インタラクティブ モード(コマンド端末で1行ずつプログラムを入れるモード)で、計算をためしてみましょう。
コマンド端末で「python3」とだけ入力して実行すると、インタラクティブ モードになります。
では、計算をためしてみましょう。
なお、演算記号の前後に、スペースを入れても、かまいません。演算記号の前後にスペースを入れると、見やすくすることができます。
小数点の計算も行えます。
負数の計算もできます。
インタラクティブ モードを終了するには、「exit()」を入力します。
pythonで整数と小数を足したり引いたりすると、自動的に、小数に調節したりします。
割り算の商だけを求めたい場合、「//」を使います。
算数では「7÷3=2あまり1」なので、上記のような計算結果になります。
割り算の「あまり」を求めたい場合は、「%」を使います。
指数(べき乗)は「**」です。「^」ではありません。
数学では、「2×2×2=8」なので、上記のような計算結果になります。
3項以上の数の計算もできますが、計算の順序は、数学と同様に、足し算と引き算の順番よりも、かけ算および割り算の順番が、優先されます。
上の計算の場合、さきにかけ算を「2*4」(=8)を行い、それに1をたすので、答えは「9」になります。
足し算や引き算を先に行いたい場合は、カッコ「()」を使います。数学と同じように、先に計算させたい部分を、カッコ「()」で囲みます。
1+2=3を先に行い、それに4をかけるので、答えは12になります。
まず、GNU/Linuxの場合、ディストリビューションに何個もの種類があります。そのディストリビューションの種類により、中に入っているコマンド端末の名前が異なります。
しかし、たいてい、最近のディストリビューションには、アプリケーション検索のための画面が用意されているので、そこに「command」とか「コマンド」とか「terminal」(※ 「端末」という意味)とかを入力すれば、そのディストリビューションに入っているコマンド端末アプリが発見されるので、ディストリビューションの指示にしたがって、そのコマンド端末アプリを起動すればいいです。
「command」と最後まで入力しなくても、「comm」とか「コマ」あたりまで入力した時点で、目的のコマンド端末アプリが発見されることが多いです。このような機能をインクリメンタル サーチといいます。
また、ほとんどのディストリビューションには、コマンド端末が、最初からインストールされているので、わざわざ追加インストールしなくてもいいです。もし試してみて追加インストールを要求される場合、アプリケーションを間違えている場合があります。
たとえば、GNU/Linuxディストリビューションの一種「Fedora」を使っている場合なら、最初からコマンド端末がインストールされていて、「端末」というアプリケーション名のアプリが、コマンド端末アプリケーションです。
コマンド端末の起動方法は、普通のアプリケーションの起動と同じであり、アイコンをダブルクリックすればいいです。
なお、GNU/Linuxのコマンド端末を終了する場合は、右上(もしくは左上)にある「×」マークをクリックすることで、アプリケーションを終了できます。このほか、コマンド端末中に、「exit」と入力しても、コマンド端末を終了できます。
まちがって「exit()」(まちがい!)と入力してしまうと、そういう名前の特別な別コマンドだと解釈されてしまい、文字を追加入力する画面になってしまう。その場合、「aaaaaaa」などの無意味な文字を入力して終了させるか、アプリ右上の「×」バッテン印をクリックして終了させましょう。
「Hello, world」と表示させるプログラムが、世界のいろいろな国でいろいろなプログラミング言語の入門書で例文としてよく使われます。
pythonで「Hello, world!」を表示させる場合は次のようなプログラムになります。
pythonでいう「変数」(へんすう)とは、値につけられた名前(識別子)です。
ここまでの例では、代数学の「変数」と、プログラミングの「変数」とは、似ているところもありますが違う意味論を持ちます。 Pythonでは変数には文字列のように数値以外とも結びつけること(バインディングすること)ができます。 このため代数学でいう「変数」と、プログラミングでいう「変数」との意味の違いに気をつけてください。
Pythonでは変数には型がなく、変数にバインディング(束縛)されたオブジェクトに型があります。
などがあります。
pythonでは「=」記号は、「左辺の識別子に右辺のインスタンスをバインドする」ことを意味します。 数学の等号とはもちろん、静的型付けの言語の代入とも意味が違いますが、Pythonを含む動的型付けな言語ではこれを代入と呼びます。
変数名はべつに1文字でなくてもかまいません。
変数の名前には、そのプログラムの使い道にもとづいた名前をつけると、わかりやすくなります。
pythonでは、識別子の大文字と小文字とを区別します。 このため、たとえば「print("ABC")」を「PRINT("ABC")」と書くと、エラーになり実行できません。 また、変数名や関数名などの識別子につかえる文字として、英数字とアンダースコア「_」が、識別子として使用できます。 ただし、識別子の先頭の一文字には数字は使えません。

キーワード(Keywords)は、Pythonの構文規則の中に現れる特別なトークンで、識別子の様式に合致するにも関わらず、識別子には使用できない単語の集合です。 次に示すキーワードは識別子には使用できません。
ソフト・キーワード(Soft keywords)は、識別子の中で、特定の状況下でのみ予約されるものです。 識別子 match、case、_ は、パターン・マッチング文に関連する文脈では、構文的にキーワードとして機能しますが、この区別はトークン化の際ではなく、パーサー・レベルで行われます。 ソフトキーワードであれば、match、case、_を識別子名として使用している既存のコードとの互換性を保ちつつ、パターン・マッチングで使用することができます。
予約済み識別子クラス(Reserved classes of identifiers)は、キーワードやソフト・キーワード以外の識別子で特別な意味を持つものです。 予約済み識別子クラスは、先頭と末尾のアンダースコア文字のパターンによって識別されます。
アトムは、式の最も基本的な要素です。最も単純なアトムは、識別子またはリテラルです。括弧や大括弧、中括弧で囲まれた形式も、構文上はアトムに分類されます。
アトムとして出現する識別子は名前です。
名前がオブジェクトにバインドされている場合、アトムを評価するとそのオブジェクトが得られます。名前がバインドされていない場合、評価しようとすると NameError という例外が発生します。
組込み関数(例えば print)や、組込み型(例えば int)はキーワードではありません。 キーワードではありませんが、迂闊に組込み関数や組込み型と同じ名前の変数や関数を定義すると、次から関数が使えなくなります。 回避方法はあります。
回避方法はあるものの、読んだヒトが混乱するので組込み関数や型と重複した識別子は使わないように心がけましょう。


文字列の入力には、組込み関数input()を使います。
なお、数字(1や2など)を入力しても、文字として認識されます。 たとえば上のプログラムの実行で1を入力すると、出力は11となります(文字列の乗算演算子は文字列をオペランドの個数分繰返した文字列を返します)。
では、数値を入力させて、計算をさせたい場合、どうすればい良いのでしょうか?
文字列を浮動小数点数の数値を得たい場合は、組込み関数float()を使います。

さきほどの数値の入力と計算プログラムを、この方法で、書き換えましょう。
これを実行して、たとえば「5」と入力してエンターキーを押すと、出力として i=5, 2 * i=10 と表示されます。
Python には文字列の中に式を埋込み文字列化する「フォーマット済み文字列リテラル(Formatted string literals; F文字列とも)」があります。
のように、fを引用符の前につける事で利用できます。 引用符は二重引用符でも一重引用符でも、どちらでも構いません(ただし、引用符の開始と終始における引用符の種類は一致している必要があります。)。 JavaScriptなどの「テンプレート・リテラル」に相当する機能です。
F文字列は Pyhon3.6 から導入されました。Python2.x系では利用できません。
場合によってはテンプレートリテラルを使いつつも '{' や '}' 自身を文字列中で使用したい場合があります。 その場合は、'{' は '{{'、'}' は '}}' と二重にします。
式の後に等号'='を付けることで式のテキストと評価後の値の両方を文字列化することができます。
最初に、文字列の % 演算子がありました。
次に、文字列のformatメソッドができました。
Python の制御構造には、逐次・分岐・繰返しの3つがあり。このうち逐次はプログラムが左上から左から右・上から下に進む当たり前の状態ですので、これ以上の説明は必要ないと思います。
条件分岐とは、ある条件を満たすかどうかで、次に実行するプログラムの位置を変えることです。
最も素朴な条件分岐は、単一のif文です。
※なにも表示されません。
つぎに、if文のなかのxの条件を変えてみて、条件が成り立つようにしましょう。
つまり、if文の構文は、次のようになります。
上のコードでは、print("ef")はif文のブロックの外にあることになります。 なぜなら、print("ef")は字下げされてないからです。 なので、プログラムを実行すると「ef」が表示されます。
いっぽう、次のコードでは、結果が変わります。
上のコードでは、print("ef")はif文ブロックの中にあるので、プログラムを実行しても、「ef」は表示されませんし、もちろん「abcd」も表示されません。
ifブロック内は、字下げをそろえないと、エラーになります。
(↑エラーになります。)
下記コードでは、x==2が満たされていないので、インデントされたブロックは実行されません。そのため実行すると「プログラムが終了しました。」だけが表示されます。
条件式には、不等号(>や<など)も使えます。
上のコードを実行すると「xは2よりも大きいよ。」と「プログラムが終了しました。」が表示されます。
記号>のような、値を比較する演算子のことを比較演算子といいます。 pythonで使える比較演算子には、次の表のようなものがあります。
in 演算子は、オブジェクトがコレクションの要素にあるかを返します。
前の節では、if文の条件式によってブロックの実行/否を切り替えました。 ここでは、一歩進めて条件式に合致していなかった場合に別のブロックを実行するelse節を含んだ条件実行構文を紹介します。
なお、elseをつかわないでも、同じ内容の処理が書けます。
else節を使うと、条件式によって2方向にプログラムフローを分けることができました。 実施のプログラムでは、2つ以上の条件式によってプログラムフローを分けることがあります。 そのような場合、次のように条件式ごとにif文が入れ子になります。
このプログラムは意味的には正しいのですがインデントが深くなりすぎ、読むのも修正するのも難儀なので、Python にはelse節の中にif文が入れ子になっていことを表すキーワード elif が用意されています。
Python には、if文の他、if式があります。

「変数xは2より大きくて、5より小さい」ときにだけ実行するような処理は、次のように書きます。
andは、両方の条件が成り立つという意味です。
上記のコードを実行すると、「
」が表示されます。「そうでない場合。」は表示されません。
xを6に変えてみましょう。
上記のコードを実行すると、「
」が表示されます。「xは2より大きくて5より小さいよ。」は表示されません。
演算子 andをもちいて、
のように、使いうことにより、条件式Aと条件式Bが両方とも成り立つ場合に、「条件式A and 条件式B」が成り立つという意味にできます(数理論理学の用語でいう「論理積」です)。

Pythonには、C言語のswitch文はありませんでしたが、Python 3.10 から match 文がサポートされました。
match文は、2021年に導入された新しい機能なので、3.10 より古い3.9以下バージョンのpythonではmatch文は使えません。なので古いバージョンでは、if文などで代用してください。
上の例は、連想配列を使って下のように書き換えることができます。
python では モジュール Enum で列挙型が提供されています。 Enum はclassを用いる方法と、Enum関数を用いる方法の2つがありますが、ここでは class を用いる方法を紹介します。
map = 1 などのブロックの値は、べつに大小が順番どおりである必要はなく、それどころかWindowsで実験した限りは整数値である必要すらもなく小数値や数式ですら代入できてしまうのですが、しかしわざわざ分かりづらい数値を与える必要もないし、今後のバージョンの仕様変更なども想定して、なるべく普通の整数値を与えるのが安全だと思います。
なお、pythonの場合、enum変数をprint出力すると、下記のように格納された変数名(例の場合では"GameMode.menu")が出力されます。
enum変数自体には、「<GameMode.menu: 2>」のように変数名と値の両方のペアが格納されます。
それだけではenum変数を数値演算に活用できず不便なので、enum変数の数値を指定したい場合は下記のように.valueプロパティを指定します。
.nameプロパティは上記のように、GameMode.menu ではなく menu の部分だけを指定します。
他のプログラミング言語では、enum変数のprint表示の形式は違うかもしれないので、それぞれの言語のマニュアルを参照してください。
値をきめるのが面倒な場合、auto をインポートすれば、pythonが自動的にきめてくれます。
メソッド __str__ を定義すると、str() をオーバーロードできます。
列挙子の値は整数でなくてもよく、autoプロシージャを使うまでもなくメッセージ文字列そのものを値とし、値には self.value でアクセスしました。 併せて、クラスメソッドの実装例も追加しました。
繰返しに関するPythonの構文には、while文と for文の2つがあります。
while 文は、ある条件を満たすあいです、処理を繰返します。
上記の while 文の例は、代入演算子をつかうと、
while文はif文と組合わせることもできます。
forのあとの変数(ループ変数と呼ばれます)は、別にiである必要はなく、特に以後値を参照しない場合は _ を使うと慣習的に「参照しないこと」が明示できます。
ただし、あくまで慣習にすぎず、言語仕様上は _ という名前の変数にすぎないので、_ の値を参照するプログラムを書けば実行でき、インタプリターは何の警告もしません。 また、pylint の様な静的なソースコード診断ツールでは、_ は未使用変数のチェックの対象から外されているなど、言語仕様ではないものの _ を特別な識別子として扱う事は慣例的に定着しているので、_ の値を参照するコードを書かないことを強く推奨します。
慣習上、for文を書くときは、i で回数を数えることが多い。
のように、すると、
のように表示されます。 組込み関数 range() は range クラスのオブジェクトを返します。
continue文は、ループの先頭に戻ります。continue文を含むループのブロックのcontinue文以降は実行されません。
pass文は、なにもしません。 「なにもしないが構文上ブロックが要求される」ケースで使われます。
while文あるいはfor文のブロックで文「break」を使うと、ループを中断します。
break文で中断する対象は、if文ではありません。break文は、ループを中断するものです。
なおwhile Trueのように、while直後の条件式をブール値 True にすると、条件式は常に真となり、永久ループとなります。
while文あるいはfor文がbreak文で中断しなかった場合、forにつづくelse節が実行されます。else節は、大概のプログラミング言語ではif文と組合わせて使いますが、Pythonではこれに加え繰返し(while文あるいはfor文)と組合わせることができます。


Pythonでは、ループはスコープを作りません。
式は、演算子と1項以上のオペランド(被演算子)からなります。 典型的には中置の二項演算子式ですが、単項演算子やif式のような式とは思い難い見た目をしているものもありますが、値を持つ構文要素はすべからく式と考えて構いません。
次の表は、Pythonにおける演算子の優先順位を、最も高い優先順位(最も拘束力が強い)から最も低い優先順位(最も拘束力が弱い)へとまとめたものです。同じ枠内の演算子は同じ優先順位を持ちます。構文が明示的に与えられていない限り、演算子は二項演算子です。同じボックス内の演算子は左から右へグループ化されます(右から左へグループ化される指数演算を除く)。
比較、メンバーシップテスト、同一性テストはすべて同じ優先順位を持ち、比較のセクションで説明したように、左から右へ連鎖する機能を持っていることに注意してください。
いくつかの処理をまとめたものを、プログラミングでは「関数」(かんすう)といいます。数学でいう「関数」とは、意味がちがうので、気をつけてください。
なお英語では、数学の「関数」のことを function (ファンクション)といいます。プログラミング用語の「関数」のことも英語では function といいます。
もとの英語をみれば、どちらにも「数」にあたる英語(number 「ナンバー」など)が無いことに、注目してください。
プログラミングの「関数」では、かならずしも、数(整数や小数などの「数」)をつかう必要は、ありません。
さて、pythonでは、ユーザーが自分で関数をつくることができます。ユーザーによる関数の作成には「def」を用います。「def」とは、おそらく定義を意味する英語 definition の頭3文字です。

このように、繰り返し作業をするときなど、関数が便利です。
関数の定義の書式は、
というふうになります。
関数名のあとに、コロン記号「:」をつけるのを、忘れないようにしてください。
関数のプロックは、インデントが終わるまでです。
たとえば下記の関数work()の場合、
関数のブロックは、
までです。
print("c")は、関数work()のブロックの外です。
(実行結果↓)
ある処理を繰返し行いたい場合、関数をつかうことで、記述をへらせます。 関数に作業させる際、関数外で定義された値を、上記のように利用する事ができ、そのような変数を「引数」(ひきすう)といいます。
上記のコードのうち、関数の定義部分は、
↑ この範囲が、関数の定義部分です。
引数のある関数の定義の書式は、
というふうになります。
「引数」は「ひきすう」と読みます。


下記のように、呼び出し時に引数の値を「menseki(3,5)」のように指定することもできます。


このようにpythonでは、関数内で数を置きかえる動作は、原則として、関数外の動作に影響を与えません。
組込み関数idを使うとオブジェクトのidを得ることができます。 2つの変数同士のidが同じ場合、2つの変数は同じオブジェクトにバインドされています。 大概の型のオブジェクトのidはメモリー上のアドレスですが、整数のようにそうではない型も少数ながらあります。
関数の戻り値(return value;返り値・返却値とも)は、return 文で返します。
return文があると、その行で関数が終了します。
関数の仮引数には名前(識別子)がありますが、仮引数を明示して関数の実引数を渡し呼出すことができます。 このような識別子を明示して呼びされた実引数をキーワード引数と言います。
関数の引数には、既定値(ディフォルト)を設けることができます。
関数の引数は可変長にできます。
Pythonには、厳密な意味での多値返却はありませんが、タプルやリストを返すことで多値返しに近いことができます。
「多値返却風な処理」や「多値返しに近いこと」と歯切れが悪いのは、型アノテーションを
としたいのですが、
としなければならず、タプルを返していることを明確に意識する必要があるからです。
デコレーター(decorator)は、関数の内容を書き換えずに修飾するための仕組みです。 関数の引数に関数を指定します。既存の関数の前に@{デコレーター名}を付けることで、その関数を修飾することができます。
デコレターの文法は、以下のような糖衣構文です。

ローカル変数や仮引数にグローバル変数がシャドーイングされた場合、 関数の中でも、
と変数宣言することにより、その変数をグローバル変数として取り扱えます。
C言語には、このような機能(関数内で変数をグローバル宣言する機能)は、ありません。 C++では、グローバル変数の参照に :: を前置することでシャドーイングを回避できます。

nonlocal文は、内包関数から、自分を呼び出した関数のローカル変数にアクセスする仕組みです。 global文と違い、新たな変数を作ることはできません。
クロージャ(関数クロージャ)は、外側の変数を格納する関数です。
この絵柄に見覚えがある人もいると思います。デコレーターの引数(デコレート対象の関数)はラッパー関数は格納した変数です。
Pythonでは、複数のオブジェクトを要素として持つオブジェクト(=コレクション)のうち、整数のインデックスによって要素を参照できるオブジェクトのグループをシーケンス(sequence)と呼びます。 組込み型の代表的なシーケンスは、リスト、タプル、レンジ オブジェクトです。
シーケンスに共通の機能として、スライス記法があります。
組込み関数hasattr(obj, name)を使うと、オブジェクトobjが名前nameな属性を持っているかの検査ができます。
リストの要素は、文字列だけ、あるいは数値だけでも、かまいません。
文字列だけのリストの場合、たとえば
また、リストは数値と文字が下記のように混在することも、別々の項なら可能です。
他のプログラミング言語だと、数値と文字列とが混在するデータ構造をつくるのにクラスを使わないといけない言語もありますが、しかしPythonではクラスを使わずとも、リストだけで数値との共存が可能です。
リストは、for文の対象となるコレクションとして使えます。

リストの要素に、あとから追加することもできます。
python のリストを希望の数だけ予め確保するには、myList = [0] * 100 の様に、初期値を持った配列に乗算演算子を作用し、所望の個数を指定した式の値を与えます。
勿論、律儀に要素を1つづつ追加する方法も有効です。
リストの要素を、あとから削除することもできます。次のコードのようにpop()を使うと、リスト末尾の要素を削除できます。
要素の末尾を削除したいリストのうしろに「.pop()」をつけ、ることで、要素の末尾を削除していけます。
なお、この.pop()のような、操作したい対象物のうしろにドット記号(.)と操作内容のキーワードをつける特別な関数のことをpythonでは、「メソッド」といいます。
myList.pop()をくりかえすと、さらに末尾から、削除していきます。

リスト( list )は、任意のオブジェクトをゼロ個以上、順次付けて保持できるコレクションです。
リストは、要素を ,(カンマ) で区切り全体を [ ] で囲みます。 要素の型は同じである必要はありません。
リストの各要素を、代入・置き換えすることもできます。
リストの中にリストを入れることも出来ます。ただし、下記のように入れたリストの項目数が等しくなるようにする必要があります。
リストの中にリストを入れたものを2次元リスト(または2重リスト)といい、
リストの中にリストを入れたもののなかに、さらにリストを入れたものを3次元リストと言います。
組込み関数mapを使うと、iterableオブジェクトの全ての要素に、一括で何かの関数を適用する事ができます。
abs のような組込み関数だけでなく、ユーザー定義関数やlambdaもmap関数の第一引数にすることができます。
組込み関数filterは、iterableオブジェクトの要素の中から、条件に適合するものだけを選び出して、新たなリストを作ります、
上記のmap関数とfilter関数の使用例はリスト内包表記をつかうと
と表現できます。 for式やif式、if-else式(条件演算子)はリスト内包表記と組合わせると関数呼出しを使わないでもイテレーションやケース分けができます。
絶対値を求める部分も、
とインラインで表現できます。
他のプログラミング言語とPythonの類似点と差異をリストを中心に比較します。
宣言と初期化の部分に注目し様々な差異がありましたが、要素の参照は、
の構文で、この部分はどの言語でもほぼ同じですが、FortranとBASICでは、
のように丸括弧になります。
Pythonに「配列」というデータ型は存在しません。C言語などに、配列というデータ型があります。
言語によっては、「配列」データ型と「リスト」データ型とが別個に存在するものもあります(たとえば Kotlin という言語には、配列(array)データ型と、リスト list データ型とが別々に存在します) なお、kotlin は現在では、Android スマートホンのアプリケーションプログラムの開発などで、よく使われる言語です。
また、Goには「リスト」はなく「スライス」slice があります(Goのスライスの機能はPythonやkotlinの「リスト」と一見似ていますが、Goのスライスは「要素の型が一致している必要がある」ので本質的に「リスト」とは違い、異種リストの実装には interface{} を使います)。
Goには、配列型と「スライス」slice の2つのデータ型がありよく混同されますが、スライスは要素のアクセスは線形時間 O(n)、配列の要素のアクセスは定数時間 O(1)であることが大きな違いです。
リストや配列に類似した型は、要素の参照にかかる時間によって
タプル( tuple )は、任意のオブジェクトをゼロ個以上、順次付けて保持できるコレクションです。 リストとよく似た特徴がありますが、リストと違い生成後は内容が変更できない「イミュータブル」なオブジェクトです。
メソッドセットはリストに準じますが、イミュータブルなので append clear copy extend insert pop remove reverse sort の9つのメソッドはありません。
レンジ( range )は、等差数列を表すシーケンスです。
レンジにリテラルはありません。 コンストラクターである組込み関数 range()を使って生成します。
レンジは、for文の対象となるシーケンスとして使えます(これが一番一般的な使用例でしょう)。
array モジュールは、同一の型の要素をもつシーケンスを提供します。 JavaScript の TypedArray や、C言語等の静的型付けの言語の配列に相当します。
arrayオブジェクトは、arrayモジュールのarray() です。
arrayの各要素を、代入・置き換えすることもできます。
Pythonの辞書(Dictionary)は、任意個のキーとコレクションです。
Pythonでは、辞書のキーの重複は許されず、最後の値で上書きされます。 これは辞書リテラルにも当てはまり、同じキーの最も右の値がリテラル内のキーの値となります。
セット(set; 集合)は、一意で不変のオブジェクトの、順不同の有限集合を表します。 そのため、どのような添え字でもインデックスを付けることはできません。 しかし、反復処理することは可能で、組込み関数len() は、セット内のアイテムの数を返します。 集合の一般的な用途は、高速なメンバーシップテスト、シーケンスからの重複の除去、および交叉、和集合、差集合、対称差などの数学的操作の計算です。
keys(), values(), items()の返すオブジェクトは、それぞれキー、値、キーと値のペアーのタプルのイテレータブルですが、関数から返った値は辞書とその後も結びついています(これらのオブジェクトをセット・ビュー オブジェクトと呼びます)。 リストのように静的なオブジェクトではありません。
破壊的メソッドは、レシーバーであるセットオブジェクト自体を変更するメソッドです。
モジュール化(modularization / modularize)は、全体をいくつかの構成単位に分割し、問題の規模と質を低減する分割統治法(divide-and-conquer method)の一つです。 Pythonでは、パッケージ(package)とモジュール(module)がモジュール化の実現に用いられます。 このうち、パッケージはモジュールの構造的な整理手段と考えられ、まずモジュールの用途・用法について解説し、モジュールをユーザーが定義する具体的な例も示します。
平方根などの数学に関する関数を使用したい場合は、モジュールmathをインポートします。
また、インポートされた関数をつかうときは、どのモジュールに由来する関数かを、pythonが判断できるようにするために、「math.sqrt()」のように、関数の前にモジュール名を書きます。 「.」はドット記号です。つまり、「モジュール名.関数名」のような書式になります。
モジュールmathでは、三角関数や指数関数なども、使えます。三角関数の単位は、ラジアンです。
サイコロの目のような、乱数をつかうには、モジュールrandomをインポートします。
たとえばモジュールmathから、sqrtだけをローカル名前空間へインポートしたい場合、コードが次のようになります。
ここまでは、標準ライブラリーのモジュールを紹介してきましたが、モジュールはユーザー自身で定義することもできます。
ここでは、与えられた数が素数か否かを判定するモジュール isprime を作ってみましょう。
try と except のある構文を用いて、例外が発生した時の処理を記述できる。
例外の起きそうな処理を、tryブロックに書く。tryブロック内で数値を0で割るなどの処理が発生すると、エラーとして認識され、exceptブロックの処理にうつり、exceptブロック内の処理が行われる。
上記のプログラムでは、もし0で割るなどの例外が発生すると、exceptブロックにある処理が実行されるので、「エラーが発生しました。」が表示される。また、print(a)が実行されるよりも先にエラーが発生するため、先にexceptブロックに処理が移るので、計算結果の3 / xは表示されない。
なお、もし正常に数値を入力するなどして、例外が発生しなければ、けっして「エラーが発生しました。」は表示されずに、3 / xの計算結果が表示される。
たとえば、入力の数値として、数「2」を入力すると、3 / 2の計算結果である「1.5」が表示され、そのままプログラムが終わる。
なお、tryブロックの外で例外が発生しても、exceptには処理は移動せずに、プログラムのエラーにより終了する。
たとえば、上記のプログラムで、「0」を入力すると、「エラーが発生しました。」は表示されない。0を入力してエンターキーを押した直後に、インタープリターによりエラーメッセージ「ZeroDivisionError: division by zero」などのメッセージが表示され、そしてプログラムは終了する。
elseブロックの処理は、例外が発生しなかった場合に、最後に行われる処理である。
finallyブロックの処理は、例外が発生しても発生しなくても、どちらの場合にも、最後に行われる処理である。
pythonの例外処理では、生じた例外クラスに応じての場合わけもできます。
のように、生じた例外クラスにおうじて、exceptのあとに例外クラスを指定します。
「ゼロで割り算できない」という例外の場合は組込み例外 ZeroDivisionError を、exceptの直後に記述することにより、例外クラスを指定します。
よって、この部分のコード記述は、
のようになります。
ほかにも例外クラスはあります。例外クラスが、型(かた)についてのエラーの場合には組込み例外 ValueErorrを、exceptの直後に記述することにより、例外クラスを指定します。なお、「型」とは、「整数型」とか「文字列型」とかのことです。
つまり、この場合の、この部分のコード記述は、
のようになります。
まとめると、
のようになります。
なお、エラーを種類を指定するキーワードは、上記のZeroDivisionError や ValueError の他にも、たくさん、あります。
__builtins__ の要素のうち BaseExceptionのサブクラスを例外とし、例外と例外の __doc__ を表にしました。
クラス(Classes)は、オブジェクト指向ブログラミング言語の分類の1つ「クラスベースのオブジェクト指向ブログラミング言語」の対象となる概念です。 Pythonもクラスベースのオブジェクト指向ブログラミング言語です。
クラスは、データや機能の集まりを提供する手段です。 新しいクラスを定義すると、そのクラスの新しいインスタンスを作成することができるようになります。 クラスの各インスタンスは、その状態を維持するために属性をもつことができます。 クラスのインスタンスは、属性を参照したり変更したりするためのメソッドを持つこともできます。

クラスにはインスタンスの持つ属性として関数も持つことができます。この関数属性のことをメソッドと言います。 メソッドを定義するには、関数を定義したようにクラス定義中にdefで定義します。メソッドの第一引数はselfで、インスタンス自身です。
前節の Car.get_colour() のようなクラスの属性の値を返す関数をゲッター、Car.set_colour() のようなクラスの属性の値を返す関数をセッターと呼びます。
ゲッター・セッターは、クラスの実装の内部構造隠蔽を目的としていますが、上記のコードでは、
このような場合はクラスプライベートな識別子を使います。 クラスプライベートな識別子は特別な構文があるわけではなく、属性の最初の2文字を '__' にするだけです。
これで、ゲッター・セッターを経由しなければ、__colour を参照できなくなりました。 ゲッター・セッターには、値の変換や型や範囲のチェックなど、追加の価値を付加することができます。
ゲッター・セッターで、内部構造の隠蔽は果たせましたが、セッター・ゲッターはメソッドなので値の参照や変更(代入など)のたびにメソッド呼出しが必要で、コードの量が増えると負担に感じてきます。 そこで、@property と @*.setter を適用すると、通常の参照や変更の構文を使えるようになります。
@property や @colour.setter はPythonのキーワードではなく、デコレーターという仕組みを使っています。
特殊メソッド(special method;マジックメソッド magic method とも)は、加算などの型に対する特定の操作を実行するためにPythonから暗黙的に呼び出されるメソッド。 このようなメソッドは、ダブルアンダースコアで始まり、ダブルアンダースコアで終わる名前を持っています。
Pythonのコミュニティは、メソッドがNoneを返すことを推すなどメソッド・チェインには否定的ですが、クラス×メソッドの仕組みはメソッド・チェインと親和性が高いです。
Ruby#ユーザー定義クラスをPython3に移植しました。
ここまでは、インスタンスの属性だけ扱って来ましたが、インスタンスではなくクラスに属する属性があります。 これをクラス変数と呼びます。
このように、クラス変数は参照と同じ構文で変更(左辺値化)すると、新しくインスタンス変数は生えてきてしまい、発見困難なバグの原因になります。 では、毎回 クラス名 . 属性 の構文を使えば良いようですが、クラスが継承された場合に基底クラスの属性か派生クラスの属性かで齟齬が生じるので、(特にメソッドでは)__class__ を使って参照・変更を行うべきです。
Python は、動的型付けの言語で変数・関数の仮引数や関数の戻り値には型を指定する必要がありません(指定する方法が、従来は存在しませんでした)。
この性質は、普遍的なアルゴリズムを書くなどの用途に適していますが、たとえば、リストの値の合計を求めるつもりで書いた関数が、文字列を要素とするリストに適用さるとリストの要素を連結した文字列を返すなど、コードを書いたときの想定とは異なる使われ方をしたとき、劇的に違う実行結果を招いてしまうことがあります。
型アノテーション(Type Annotation;型注釈とも)は、変数・仮引数・戻り値の型を示す注釈です。 型アノテーションは pyhthon 3.5 からは構文解析の対象ですが、型の検査はpythonインタープリターでは行われず、外部プログラムの MyPy などで静的に行います。
型ヒント・型アノテーションは、まだ新しい機能で typing モジュールを import しない方向に進化しつつあり、今後の動向が注目されます。
オーブジェクトの型アノテーションについては、__annotations__ 属性によって Python プログラム中からアクセスできます。
ファイルを書くにも読むにも、まず、そのファイルを開く必要があります。 ファイルを開くには、組込み関数 open() を使います。 もしopen()をするときにその名前のファイルがなければ、ファイルを作成されます。
open()の2番目の引数にある「"w"」は、「書込みモード」という意味です。 open()の戻り値は f に保持されます(f の型は _io.TextIOWrapper クラスです)。
ファイルに書込むには open() の戻り値 f を組込み関数 print() のキーワード引数 file に与えます。 組込み関数 print() は今まで何度も出てきましたが、キーワード引数 file には何も指定していなかったのでディフォルトの sys.stdout (標準出力)が仮定されていました。
オープンしたファイルは必ずクローズする必要があります。 この例では、with文を使っているのでブロックを抜けると自動的にクローズされます。
カレントディレクトリを見ると、「create.txt」という名のファイルが作成されており、開くと「hello」と書かれているはずです。
ここでは組込み関数 open() の第二引数『モード』を与えていませんので、ディフォルトのモード "r"(読込み)になります。 open() の戻り値 f をレシーバーにメソッド readline() を呼び出すと、ファイルから1行ずつ読み込むことができます。
上の例では、ファイルから一行だけ読み込み表示していましたが、全ての行を表示するには
のように for文 を使います。 print() 関数のキーワード引数 end に を渡しているのは s には改行が含まれているため、 print() のディフォルトの動作「改行を追加する」をキャンセルするためです。
Pythonインタープリターには、常に利用可能な関数や型がいくつか組込まれています。
組込み関数 abs(x) は x の絶対値を返します。
組込み関数 all(it) は、iterableオブジェクトitの要素がすべて真のときにTrueを返し、1つでも偽があればFalseを返します。
組込み関数 any(it) は、iterableオブジェクトitの要素がすべて偽のときにFalseを返し、1つでも真があればTrueを返します。
組込み関数 ascii(obj) は、組込み関数 repr(obj) と同様に,オブジェクトobjの印刷可能な表現を含む文字列を返しますが,repr()が返す文字列中の非ASCII文字を,\x, \u, \Uを用いてエスケープします。
組込み関数bin(i)は、整数iを2進数文字列に変換します。
組込み関数bool(obj)は、オブジェクトobjを真理値に変換します。
組込み関数callable(obj)は、オブジェクトobjが呼出し可能かを返します。
組込み関数float(x, base)は、数値または文字列xから構成される浮動小数点数を返します。
組込み関数hex(i)は、整数iを16進数文字列に変換します。
組込み関数input(prompt)は、標準入力から1行を読込み、それを文字列に変換して(末尾の改行を取り除いて)返します。
組込み関数int(x, base)は、引数xを基数baseで整数に変換します。
組込み関数oct(i)は、整数iを8進数文字列に変換します。
組込み関数 pow は累乗を返します。
modが存在する場合、baseをmodulo modのexp乗にします(pow(base, exp) % modよりも効率的に計算されます)。2つの引数形式pow(base, exp)はべき乗演算子の使用と同等です: base**exp。
引数は数値型でなければなりません。オペランドの型が混在する場合、二項演算子の強制適用規則が適用される。int 型のオペランドでは、2 番目の引数が負でない限り、結果はオペランドと同じ型になります(強制適用後)。たとえば、pow(10, 2)は100を返しますが、pow(10, -2)は0.01を返します。int型またはfloat型の負の基数と非積分指数に対しては、複素数の結果が返されます。例えば、pow(-9, 0.5)は3jに近い値を返します。
int 型のオペランド base および exp に対しては、mod が存在する場合、mod も整数型でなければならず、mod は 0 以外でなければなりません。modが存在し、expが負の場合、baseはmodに対して相対的に素でなければなりません。この場合、pow(inv_base, -exp, mod) が返され、inv_base は base の mod の逆数です。

組込み関数 print は引数のオブジェクトを文字列化しテキストストリームに書出します。
組込み関数 range() は、組込み型 Range クラスのコンストラクターです。
組込み関数 repr(obj) は、オブジェクトobjの印刷可能な表現を含む文字列を返します。
Pythonインタープリターには、常に利用可能な関数や型がいくつか組込まれています。
Pythonは動的型付けな言語です。変数には型がなく変数の示すオブジェクトが型を持ちます。 これはPythonの興味深い特徴であり、PythonはLispやSchemeなどのような特殊な言語群の一部となっています。
一方、静的型付けな、C言語やJavaなどのコンパイル言語の場合には、最初に変数の名前と型を宣言してから、内容を割当てる必要があります。 これはコンパイル作業を最適化することができるので、これらの言語にとっては好ましいことです。
他方、動的型付けは、特にメタプログラミングや再帰性(Reflexivity)のような高レベルの論理構成を簡単に書くことができます。 またポリモーフィズムを実践するためには、リストや辞書などの充実したデータ構造の使用が役に立ちます。
数値には、int(整数)、float(浮動小数点数)、complex(複素数)の3種類があります。 標準ライブラリには、有理数を表すfractions.Fractionと、ユーザーが精度を定義できる十進数浮動小数点数を表すdecimal.Decimalという追加の数値型があります。
整数型 int はPythonの組込み型です。 整数の精度は無限です。
論理型 bool はPythonの組込み型です。 論理型は整数のサブタイプでもあります。
浮動小数点型 float はPythonの組込み型です。 浮動小数点数は、通常Cではdoubleを使って実装されています。 プログラムを実行しているマシンの浮動小数点数の精度や内部表現についての情報は、sys.float_infoにあります。
複素数型 complex はPythonの組込み型です。 複素数には実数部と虚数部があり、それぞれが浮動小数点数になっています。 複素数zからこれらの部分を抽出するには、z.realとz.imagを使用します。