解 説

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 ““, line 1
    ​ 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('ゼロより大きい')
    ... 
    ゼロより大きい
    

    for文

    Pythonのfor文はJavaScriptなどと違って、「for in」文のみが用意されています。
    「for in」文はシーケンスを取り出すときに便利です。
    単純なループを行いたいときはwhile文を使います。


    >>> for animal in animals:
    ...     print(animal)
    ... 
    cat
    dog
    tiger
    mouse
    

    「for in」文では、range()はよく使うのでしっかりマスターしておきましょう。

    range(start, stop, step)

    引数が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