2012/12/30

Pythonにまつわるアイデア:PEP

Pythonには、「PEP」(Python Enhancement Proposal)(日本語では「Python強化提案」?となるでしょうか)と呼ばれるドキュメント集があります。

法律の条文のように、「PEP 8」「PEP 20」「PEP 234」といった風に「PEP+数字」という形で膨大なドキュメントがオープンに管理されています。

Python(の言語そのもの)の開発は、このPEPをベースに進められています。考え方や方向性をPEPドキュメントとしてひとつひとつ作成・オープンにしてから、コミュニティからの意見を取り入れた形で開発の方向づけや意思決定が行われているようです。

PEPの一覧PEPの目的とルールを説明したページなどがありそれで詳細も見ることができますが、いずれも分量が多いです。。。いちPythonユーザとしてPythonを使う範囲であれば「PEPは開発に関わるドキュメント」程度におさえておくのでよいのかなと思います。

2012/12/28

PythonのBoolean変数型

PythonのBoolean型の変数には次の2つがあります。
  • True 真
  • False 偽

True、Falseのいずれとも、最初の1文字だけ大文字で書きます。

Boolean型の変数には、andやor、notなどの論理演算が可能です。いずれも小文字で書きます。

たとえば
c = a and b
とすると、aとbがともにTrueの場合のみcをTrueとする。a、bのいずれかひとつでもFalseであればcはFalseとする、という演算になります。

同様に
c = a or b
とすると、aとbの少なくとも一方がTrueであればcはTrue、両方ともFalseだった場合のみcもFalse、という処理になります。

notは、TrueとFalseを裏返す処理になります。「not a」なら、aがTrueならFalse、FalseならTrueを返します。

このBoolean型の変数を使うことによって、たとえば
while True:
    (処理A)
とすると、Aという処理を繰り返し行うことが可能です。

2012/12/26

Pythonの制御構造

Pythonの制御構文には、次のようなものがあります。
  • 条件分岐: if文
  • ループ: for文 while文

条件分岐

条件分岐とは、「ある条件が成り立つときだけAという処理を行う」といった構文です。

「ある条件が成り立つときだけ」ではなく、「ある条件が成り立つときにはA、成り立たないときにはB」と、MECEに(モレなくダブりなく)何らかの処理を行うようなやり方もできます。

Pythonの条件分岐には「通常のif文」と「ifを使った三項演算子」とがありますが、三項演算子についてはできることはif文と変わらないためここでは割愛します。

ちなみに、条件分岐は英語で「conditional branching」というそうです。日本語の条件分岐はその直訳ですね。

ループ

ループとは、「ある一定の処理を何度も繰り返し行う」ような構文です。こちらは英語でも同じく「loop」と呼ぶみたいですね。

if

条件分岐のif文は次のような形で使います。
if n > 10:
    print 'nは10よりも大きな数字です'
elif n > 5:
    print 'nは10以下で5よりも大きな数字です'
else:
    print 'nは5以下の数字です'

このコードは、nという変数が10を越えていたら「nは10よりも大きな数字です」と画面に出力してくれます。一方で、nが5よりも大きく10以下の場合は「nは10以下で5よりも大きな数字です」と、さらに、nが5以下の場合は「nは10以下の数字です」という文章を画面に表示します。

Pythonのif文では、ほかの言語でよく見るような「()」(丸括弧)や「{}」(中括弧)、「endif」を使いません。代わりに、「:」(セミコロン)とインデント(字下げ)を使って階層構造を表現します。Pythonにおける「else if」は「elif」と書きます。

この例であれば、「print~」の文の左には4つの半角空白が入っており、これをPythonインタプリタは階層構造になっているものと解釈します。

ちなみに、PythonにはC言語で見られるような「switch~case」文は用意されていません。

for文

Pythonでのfor文は次のような形で使います。
for i in range(0, 10):
    print i

このコードは、0、1、2、・・・9と、0から9までの数字を順番にprint出力します。「range(0, 10)」という部分の0と10を一般化して「range(m, n)」として
for i in range(m, n):
    print i
とすると、これはnから始まってn+1、n+2、と順番にn未満の最大の整数まで表示してくれます。

また、Pythonでいう配列(リスト)の各要素を順番に走査したい場合は次の形で行うことができます。
for e in array:
    print e

if文と同様、こちらも、繰り返し行いたい部分をインデント(字下げ)することで階層構造を表現する形になります。

詳細はここでは割愛しますが、「for a in b:」のbにあたる部分をPythonで「イテレータ」と呼びます。

while文

Pythonでのwhile文は次のような形で使います。
i = 10
while i > 1:
   print i
   i = i - 1

このコードは、10から1までの整数を順に表示します。if文やfor文と同様、繰り返し行いたい処理の部分をインデント(字下げ)します。

2012/12/11

Pythonの集合型

Pythonには、ほかの変数を格納できる集合型の変数として次の4つがあります。
  • リスト
  • タプル
  • 集合
  • 辞書

リスト

listA = [1, 2, 3, 4]
listB = ['Hello', 'World']
リストは、変数を一列に並べたものです。英語では「list」。

順序が付いており、0から始まるインデックスを使って各要素にアクセスすることができます。他の言語では「配列」にあたるものです。
listA[1]  # 2番目の要素「2」が格納されている
listB[0]  # 1番目の要素「Hello」が格納されている
ひとつのリストに型の異なるさまざまな要素を混在させることもできます。
listC = [1, 'Hello']
ほかのリストを要素として持つこともできます。
listD = [listA, listB]
この場合、サブのリストの要素へは、インデックスを続けて2つ使うことでアクセスすることができます。
listD[1][0]  # 「Hello」が格納されている

タプル

tupleA = (1, 2, 3, 4)
tupleB = ('Hello', 'World')
タプルはリストと同じく変数を一列に並べたものです。英語では「tuple」。便宜上タプルと書きますが、発音は「トゥプル」に近いです。

タプルもリストと同様に、0から始まるインデックスを使って各要素にアクセスすることができます。
tupleA[1]  # 2番目の要素「2」が格納されている
リストとタプルのちがいは、リストは定義した後にも要素の追加や更新・削除といった編集が可能な一方、タプルはそのような操作を受けつけない点。というのが最初の理解としてはよいかと思います。

そういった操作が可能かどうかを表す特徴を、mutable(可変)/immutable(不可変)といったりします。


集合

setA = set([1, 2, 3])
集合は、順序なしで変数をまとめたものです。英語では「set」。

集合の各要素は必ずユニークであるという制限があり、同じ要素を2つ以上持つことはできません。つまり、
setA = set([1, 2, 3])
setA.add(1)
と、すでに含まれている要素を追加してみても、その後の中身は変わらず
setA  # set([1, 2, 3])
のままとなります。

Pythonの集合では、数学の集合論で使う集合でいう「集合同士の演算」が可能です。つまり、和集合(union)、共通部分(intersection)、差集合(difference)といった集合をごくカンタンな記述で得ることができます。


辞書

dictA = {'pochi':'wan', 'tama':'nyan' }
辞書は、変数を「キー」と「値」という2つをひとセットとしてまとめたものです。英語では「dictionary」。

リストの要素はインデックスでアクセスできましたが、辞書の要素にはキーでアクセスすることができます。
dictA['pochi']  # 'wan'が入っている


リスト、タプル、集合、辞書―-それぞれに特徴があります。まずはその特徴を把握し、それぞれを適切な「使いどころ」で使うということがPythonらしいシンプルなコードを書く最初のポイントかと思います。

それぞれについてはまた別に取り上げていきます。

2012/12/05

Pythonの基本的な変数の型

Pythonの最も基本的な変数の型には、大きく分けて次の2つがあります。
  1. 数値型
  2. 文字列型

数値型

1、2、3、9.0、100といった数値を扱うものです。

数値型の中にもさらに3つのタイプがあり、
  • 整数
  • 浮動小数点数
  • 複素数
に分けられます。

それぞれ中身は名前のとおり、整数は0、1、10といった整数を扱い、浮動小数点数は1.5、2.0、3.1415といった小数点以下を含む数字を扱います。同じ1でも「1」と表記した場合は整数型となり、「1.0」と表記した場合は浮動小数点数となります。

また、複素数型は1+j、3+4jという形で虚数単位を「j」で表します。

変数を定義するときは

x = 1
y = 1.5
z = 3 + 5j

という形で定義します。

もちろんどういう使い方をするかにはよりますが、整数と不動小数点数にくらべて複素数を使う機会は少ないことが多いかと思います。

文字列型

"Hello"、'World'といった文字列を扱うものです。

Pythonでは、"(ダブルクォーテーション)と'(シングルクォーテーション)の両方を文字列のマークとして使うことができ、

text1 = "Hello"
text2 = 'World'

という形で定義することができます。

文字列にダブルクォーテーションやシングルクォーテーションそのものを含めたい場合は

text3 = "'"
text4 = "\""

シングルクォーテーションをダブルクォーテーションで囲む(あるいはその逆)か、バックスラッシュ(\)を使ってエスケープすると使うことができます。