Python文法の入門編段階で気をつけておくポイントです。
Pythonの語源はニシキヘビではなく、イギリスの代表的なコメディグループのMonty Pythonのコメディ番組「空飛ぶモンティ・パイソン」です。
とはいえ、ニシキヘビはロゴなどに使用されています。O’REILLYの本もニシキヘビです。
文法の勉強の前に、まずはPythonのコードスタイルガイドライン「PEP8」を読むことから始めましょう。
例えば、変数名や関数名はキャメルケースを使うのではなく、全部小文字のスネークケースを使うとなっています。ヘビつながりというわけではないでしょうが、他の言語からPythonを始めるときは注意しておく必要がありそうです。
また、数字の1や0と区別が付かない場合があるので、単一の文字 ‘l’ (小文字のエル)、’O’ (大文字のオー)、’I'(大文字のアイ) を変数に使わないようにしよう、などの記載があります。
さらに、書き方をアフォリズムとしてまとめたPEP20があります。PEP20は「 The Zen of Python 」とされていたもので、Pythonの設計思想が綴られています。
Python導入後ならコマンドで表示することができます。
PEP20を表示するコマンド
import this
抜け落ちていそうな決まりごと
文字列とブロック
- Pythonではブロックを作るときにインデントを使います。これはPythonの大きな特徴です。
1レベルインデントはスペースを4つ使うのが標準です。インデントの方法はスペースが好ましいとされています。
タブを使うのは、既にタブでインデントされているコードと一貫性を保つためだけに留めておきます。
Python 3 では、インデントにタブとスペースを混ぜることを禁止していますので注意しましょう。特に入門者が出しやすいエラーになります。 - PEP8ではすべての行の長さを、最大79文字までに制限しましょう。
長い行を折り返には、括弧やブラケット、波括弧を利用することです。長い行は文を括弧で囲むことで、複数行に分割できます。行を継続させるには、バックスラッシュよりもこれらを使用すべきです。 - 三重引用符(トリプルクオート)を使うと複数行の文字列を記述することが簡単になります。三重引用符を使用する場合は通常二重引用符 “”” を使うようにします。
- バックスラッシュ(\)は特殊文字です。そのためバックスラッシュをそのまま記号として使いたい場合はraw文字列を使うと良いです。これは文字列の引用符の前にrを付け足します。
print(r'C:\some\sample')
演算
- 除算は常にfloat型を返すということを忘れないでください。
- 切り下げ除算ができます。「 // 」
- 対話モード、Jupyter Notebookでは、変数としてのアンダースコア「_」の役割は、最後に使用した式を代入することができること。これを知らないと人のコードを読むときに?となります。
例a = 2 b = 3 a + b # Jupyter Notebookの場合は次の内容を新しいコードセルを追加して記述 a * _ # 結果 10
エスケープの注意点
特殊文字は「\」でエスケープします。
ただし、「” “」の中で「’」を文字として使用する場合は、エスケープの必要が無いです。
また、「’ ‘」の中で「”」を文字として使用する場合は、エスケープの必要が無いです。
raw文字について
次のような問題が起こる場合があります。
>>> print('C:\some\name')
結果
——
C:\some
ame
——
これは「\n」が改行を意味するからです。
このような場合は raw文字列 を使います。
使い方は簡単で、最初の引用符の前に「r」を置くだけです。
例
print(r'C:\some\name')
結果
——
C:\some\name
——
トリプルクオート
シングルクオート、またはダブルクオートを三重にします。
通常はダブルクオートの三重を使います。
トリプルクオートの例
>>> print(""" ... Usage:thingy[OPTIONS] ... -h ... -H hostname ... """)
結果
——
Usage:thingy[OPTIONS]
-h
-H hostname
——
表示結果の先頭の空行を無くしたい場合は次のようにします。
>>> print("""\ ... Usage:thingy[OPTIONS] ... -h ... -H hostname ... """)
結果
——
Usage:thingy[OPTIONS]
-h
-H hostname
——
文字列リテラルの連結
文字列どおしの結合は次のようにします。
'My ''name ''is ''Tahara'
結果
——
‘My name is Tahara’
——
長い文字列を折り返して記述したい場合()を使う方法があります。
text = ('あああああああああああああああああ' ... 'いいいいいいいいいいいいいいいい' ... 'うううううううううううううううう')
「あ」から「う」まで一気にクオテーションで囲んで途中で改行することはできません。
「あ」を改行した途端にエラーになります。
text = ('あああああああああああああああああ File "<stdin>", line 1 text = ('あああああああああああああああああ SyntaxError: EOL while scanning string literal
変数と文字列を連結するにはプラス 「+」 を使います。
変数と文字列を連結する場合、変数名と文字列を並べただけではエラーになります。このようなときに「+」を使います。
失敗例
>>> aa = 'aaaaaaa' >>> aa'bbbb'
結果
——
File “
aa’bbbb’
^
SyntaxError: invalid syntax
——
「+」で繋いだ例
>>> aa + 'bbbb'
結果
——
‘aaaaaaabbbb’
——
文字列のインデックス指定
文字列はリスト状態になっています。そのためインデックス指定ができます。
文字列をインデックス指定した例
>>> p ='Python' >>> p[1] 'y' >>> p[-1] 'n' >>> p[2:4] 'th' >>> p[:3] 'Pyt' >>> p[:] 'Python' >>> p[10] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: string index out of range
Pythonの文字列はインデックス指定ができますが、イミュータブルなため、それぞれの値を変更することができません。
文字列を変更しようとして失敗した例
>>> p[0] = B Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'B' is not defined
文字列の長さはビルトインのlen()が使えます。
len(p)
結果
————
6
————
スライス
[start:end:step]の記述でスライスできます。
[start:end]とした場合はstepは1です。
記述方法をまとめると以下のようになります。endが実はendではなくて、end-1になることが初心者には違和感がありますが、慣れるようにしましょう。機械学習ではスライスが頻繁に使われることになります。
- [:]は先頭から末尾までのシーケンス全体を抽出
- [start:]はstartから末尾までのシーケンス全体を抽出
- [:end]は先頭からend-1までのシーケンスを抽出
- [start:end]はスタートからend-1までのシーケンスを抽出
- [start:end:step]step文字ごとにstartからend-1までのシーケンスを抽出
num = [1,2,3,4,5]の場合、num[0:4]とnum[:]は同じ結果になりません。
num[:]と同等にするにはnum[0:5]とする必要があります。
num[0:-1]とした場合は、[1, 2, 3, 4]となります。
例
>>> num = [1,2,3,4,5] >>> num[0:4] [1, 2, 3, 4] >>> num[:] [1, 2, 3, 4, 5] >>> num[0:5] [1, 2, 3, 4, 5] >>> num[0:-1] [1, 2, 3, 4]
リスト
文字列やリストは各要素をスライスすることができます。
リストの簡単な例
>>> s = [1,2,3,4,5] >>> s[0] 1 >>> s[1:2] [2] >>> s[1:-1] [2, 3, 4] >>> s[-1] 5
文字列はイミュータブルだがリストはミュータブルです。
そのため値を変更することができます。
リストの特定要素を変更する例
注意:上のサンプルと繋がっています。
>>> s[0] = 10 >>> s[:] [10, 2, 3, 4, 5] >>> s[:] = [] >>> s []
リストの長さはlen()で求まります。
例
>>> len(s) 5
if文
Pythonのブール値は「True」と「False」です。先頭が大文字になっていますので注意してください。
if文他言語と使い方として代わりはないが、{}の代わりにインデントを使うことと「else if」ではなく「elif」になっていることが注意点です。
また、switch文が無いので「elif」を並べて使うことです。
>>> x = int(input('整数を入れてください')) 42 >>> if x < 0: ... x = 0 ... print('負の数はゼロ') ... elif x == 0: ... print('ゼロ') ... else: ... print('ゼロより大きい') ... ゼロより大きい [/python] <h3>for文</h3> Pythonのfor文はJavaScriptなどと違って、「for in」文のみが用意されています。 「for in」文はシーケンスを取り出すときに便利です。 単純なループを行いたいときはwhile文を使います。 例 >>> for animal in animals: ... print(animal) ... cat dog tiger mouse
「for in」文では、range()はよく使うのでしっかりマスターしておきましょう。
引数が3つある場合は3つ目はステップ数です。
>>> range(0,10) range(0, 10) >>> for i in range(0,10): ... print(i) ... 0 1 2 3 4 5 6 7 8 9 >>> for i in range(0,10,2): ... print(i) ... 0 2 4 6 8 >>> for i in range(-10,-100,-30): ... print(i) ... -10 -40 -70
ループでの「else」の取り扱い
これは「for文」で「else」を使う例ですが、ループの 「else」 句は 「break」 されなかった場合に実行されます。
次のコードはループ内での「else」と「break」の使い方がよくわかる内容です。
ポイントは「for in」文と「else」が組み合わされていることです。「if」と組み合わされているのではないので注意してください。
「if」の判定が「False」だった場合と「for」文で何も行われなかった時も、「else」以下は対象になります。
しっかりと読み解いてみましょう。
>>> for n in range(2,10): ... for x in range(2,n): ... if n % x == 0: ... print(n,'equals',x,'*',n/x) ... break ... else: ... print(n,'is a prime number') ... 2 is a prime number 3 is a prime number 4 equals 2 * 2.0 5 is a prime number 6 equals 2 * 3.0 7 is a prime number 8 equals 2 * 4.0 9 equals 3 * 3.0
continue文を使った例
>>> for n in range(2,10): ... if n % x == 0: ... print(n,'equals',x,'*',n/x) ... continue ... print(n,'is a prime number') ... 2 is a prime number 3 equals 3 * 1.0 4 is a prime number 5 is a prime number 6 equals 3 * 2.0 7 is a prime number 8 is a prime number 9 equals 3 * 3.0
pass文
pythonには「pass文」があります。
「pass文」は何もしないということです。
開発の時などに有効に使えます。
例
>>> while True: ... pass ... ^CTraceback (most recent call last): File "<stdin>", line 2, in <module> KeyboardInterrupt