Python言語のシンタックスのざっとした紹介
Pythonは、元々教育用言語として開発されましたが、その使いやすくきれいなシンタックスが熟練者と初心者によって、受け入れられてきました。
Pythonのシンタックスの清潔さは何人かの人がそれを実行可能な疑似コードと呼ばせるようになってます。そして、本当に私自身の経験はそれがしばしば、つまりCで書かれた似たようなスクリプトを読むよりもPythonスクリプトを読んで理解することがはるかに簡単でした。さあ、私たちはPythonの文法の主たる機能の議論をはじめましょう。
文法は言語の構造について言及します(すなわち、正しい形式のプログラムを構成していること)。そのときまで、私たちはセマンティックスについてはフォーカスしないでしょうが後のポイントでこれに戻るでしょう、セマンティックスはシンタックスを含めたシンボルの単語の意味です。
次のコード例を考えましょう。
# set the midpoint
midpoint = 5
# make two empty lists
lower = []; upper = []
# split the numbers into lower and upper
for i in range(10):
if (i < midpoint):
lower.append(i)
else:
upper.append(i)
print("lower:", lower)
print("upper:", upper)
lower: [0, 1, 2, 3, 4]
upper: [5, 6, 7, 8, 9]
このスクリプトはちょっとおかしいですが、必要十分にPythonシンタックスの重要な様相のいくつかを記述しています。さあこれを通してPythonの文法的な機能のいくつかを話しましょう。
"#"によるコメント付け
スクリプトがコメントで始まります。
# set the midpoint
Pythonのコメントは、ポンド記号(#)一つで示されます、そして行中のポンド記号の後はインタプリタには無視されます。これは例えば、次に続く記載の行中のコメントと同様に示されるものみたいに独立したコメントをもてるということを意味します。例えば、
x += 2 # shorthand for x = x + 2
Pythonは、複数行コメントのためのいかなるシンタックスを持っていません、それはつまりCやC++で使われる複数行の文字列を通した/* ... */ のようなシンタックスで、しばしば複数行コメントのための置き換えとして使われるものです("String Manipulation and Regular Expressions"については、よりこれで)。
行端が文を終わらせます
次の行は、そのスクリプトです。
midpoint = 5
これは、演算子のあてはめで、私たちはmidopointという名前の変数を作り、値の5を割り当ててます。この文の終わりが単に行末で記されることに気をつけてください。これは、CやC++のような、すべての文をセミコロン(;)で終わらなければならない言語と違います。
Pythonにおいては、もし次の行まで分を続けたいならば、""マークを使ってできます。このように、
In [2]:
x = 1 + 2 + 3 + 4 +\
5 + 6 + 7 + 8
""記号を使わずに、パラメータを持ったまま、次の行で以下のような表現でも可能です。
In [3]:
x = (1 + 2 + 3 + 4 +
5 + 6 + 7 + 8)
たいていのPython形式は、最初の""記号を使ったものより、パラメータを内包したまま行が続く二つ目のバージョンをおすすめします。
セミコロンは任意に文を終わらせます
ときどき、一行で複数の文をだしたいときに役立つものがあります。スクリプトの次の部分です
lower = []; upper = []
これは、Cのようなセミコロン(;)が、一行で二つの分を出すために、Pythonで任意に使えることの例を示すものです。機能的に、これはこう書いたのと全く同等です。
lower = []
upper = []
ときに便利ですが、一行で複数文をだすためにセミコロンを使うことは、一般的にたいていのPython形式のガイドでおすすめされてません
インデント:空白の問題
次に、コードのメイン部にいきましょう:
for i in range(10):
if i < midpoint:
lower.append(i)
else:
upper.append(i)
これはループと条件を含んだ制御構造文で構成されています、少しこの種の命令文をみてましょう。いまから、これがおそらくPythonシンタックスの主たる議論の的となる機能であることを示すことを考えましょう、つまり空白が意味をもっています。
プログラミング言語において、コードブロックは命令文の集合ですが、一つの群として扱われるべきです。例えばCでは、コードブロックは中括弧によって記されます。
// C code
for(int i=0; i<100; i++)
{
// curly braces indicate code block
total += i;
}
Pythonでは、コードブロックはインデントで記されます。
for i in range(100):
# indentation indicates code block
total += i
Pythonでは、インデントされたコードブロックはいつも前の行のコロン(:)によって先導されます。
インデントの利用は、Pythonコードにおいてよく見られる一様で可読的なスタイルを強制することを支えています。しかし、模倣されないことに対して困惑させるかもしれません。例えば、次の二つのスニペットは違う結果を生むでしょう。
>>> if x < 4: >>> if x < 4:
... y = x * 2 ... y = x * 2
... print(x) ... print(x)
左のスニペットにといて、print(x) はインデントされたブロックです、そしてxが4より小さいときだけ実行されます。右のスニペットの print(x) はブロックの外です、そして xの値にかかわらず実行されるのです。
空白の意味をPythonがどう使うかはしばしば、ほかの言語になれたプログラマたちを驚かせていますが、それは実際にはコードブロックのインデントを強制しない言語よりもはるかに首尾一貫して可読性のあるコードに導きます。もしあなたがPythonの空白の使用について同意できないならば、ためしにやってみましょう、私がやったように、あなたはそれを感謝するようになるかもしれません。
最終的には、コードブロックをインデントする多くの空白が、スクリプトをくまなく通した構成と同じくらい長いことに気づくべきでしょう。慣習的に、たいていの形式ガイドは4つの空白でコードブロックをインデントすることをお勧めします、そしてそれは、私たちがこのレポートにおいて従う慣習なのです。EmacsやVimのような多くのテキストエディタが、自動的に4つの空白インデントをする、Pythonモードを含んでいることに留意してください。
行中の空白は気にしない
空白の意味の真言が、コードブロックを示す行の前の空白に対する真理を持っている一方で、Pythonコードの行中の空白は、問題としません。例えば、三つの表現のうち三つとも同等です。
In [4]:
x=1+2
x = 1 + 2
x = 1 + 2
この柔軟性を悪利用することは、コードの可読性について問題を引き起こします、事実空白の悪利用をすることは、しばしばスポーツのために行う人たちのように意図的にわかりにくいことが主要な意味の一つになっています。効果的に空白を使うことは、特に演算子をそれぞれを区別する場合において、はるかにわかりやすいコードを生み出します、マイナスの値でべき乗する次の二つの表現を比較してみましょう。
x=10**-2
to
x = 10 ** -2
空白を使った二つのバージョンは一目ではるかに読みやすいとわかります。たいていのPython形式のガイドは、単項演算子の周りには空白はなしで、二項演算子の周りに一つのスペースを使うことをおすすめします、"Basic Python Semantics: Operators."でさらにPython演算子について話しましょう。
グルーピングまたは呼出しのために括弧があります
前のコードスニペットで、二つの括弧の使用がありました。最初は、命令文や数学的な演算子をグループ分けする典型的な方法として使われます。
In [5]:
2 * (3 + 4)
Out[5]:
14
それらは関数が呼び出されることを示すのにもつかわれます。次のスニペットで、print() 関数は、変数の中身を表示するのにつかわれます(sidebarを見てください)。関数呼び出しは、関数の中に含まれる引数と括弧と括弧終わりのペアで示されます
In [6]:
print('first value:', 1)
first value: 1
In [7]:
print('second value:', 2)
second value: 2
括弧の始まりと終わりが関数の評価を示すことに依然として使われる中で、いくつかの関数は引数まったくなしで呼び出されます。この例はリストをソートするメソッドです
In [8]:
L = [4,2,3,1]
L.sort()
print(L)
[1, 2, 3, 4]
sortのあとの"()"は実行されるべき関数で、引数が必要とされてなくても要求されます。
余談:print()関数上の留意
上記でprint()関数の例を使いました。print()関数はPython2系と3系の間でかわった部分があります。Python2では、命令文のように振舞います。こう書けました。
# Python 2 only!
>> print "first value:", 1
first value: 1
いくつかの理由で、言語のメンテナがPython3のprint()は関数になるべきと決めました。そんなわけていまはこうかきます。
# Python 3 only!
>>> print("first value:", 1)
first value: 1
これはPython2と3の間に作られた多くの後方非互換のうちの一つです。この本の執筆のように、両方のPythonのバージョン書かれた例を見つけるのは一般的です、そしてprint()関数よりもprint文の存在がしばしばPython2のコードでみる最初の印の一つになります。
終わりにしてさらに学ぶこと
これはPythonシンタックスの重要な機能のとても簡潔な探索でした。その目的は、後の節のコードを読むときのための参考としてよい枠組みを与えることです。私たちがPythonの形式ガイドを言及するときはしばしば、チームが一貫性のある形式の中でコードを書くことを支えることができます。たいていのPythonで広く使われる形式ガイドはPEP8として知られています、そしてそれは、https://www.python.org/dev/peps/pep-0008/ に見つけられます。あなたはよりPythonコードを書き始めるなら、これを通して読むことが役に立つでしょう。形式の提案は多くのPythonのグルたちの知識を含みます、そしてたいていの提案は単なる勿体ぶったものこえるものです、それらは経験に基づいた、コード中のバグやさりげない間違いを回避するおすすめなのです。