Python の概要

序章

Google の Python オンライン チュートリアルへようこそ。このコースは、社内で提供されている Python 入門コースに基づいています。設定ページで説明したように、この資料では Python 3 について説明します。

MOOC コースをお探しの場合は、Udacity と Coursera のコース(プログラミング入門 [初心者向け] または Python 入門)をお試しください。最後に、動画を視聴せずに自分のペースで進められるオンライン学習をご希望の場合は、こちらの投稿の最後の方に記載されているものをお試しください。各コースには、学習コンテンツと、練習に使える Python のインタラクティブ インタープリタが含まれています。ここで言及している「インタープリタ」とは何ですか?次のセクションで確認しましょう。

言語の概要

Python は、動的で解釈実行(バイトコード コンパイル)言語です。ソースコードに変数、パラメータ、関数、メソッドの型宣言がない。これにより、コードは短く柔軟になりますが、ソースコードのコンパイル時の型チェックは失われます。Python は、実行時にすべての値の型を追跡し、意味のないコードを実行時にフラグ設定します。

Python コードの動作を確認する優れた方法は、Python インタープリタを実行して、コードを直接入力することです。「listint を追加するとどうなるか?」のような疑問が生じた場合は、Python インタープリタに入力するのが、何が起こるかを確認する最速かつ最良の方法です。(実際の動作については、以下をご覧ください)。

$ python3        ## Run the Python interpreter
Python 3.X.X (XXX, XXX XX XXXX, XX:XX:XX) [XXX] on XXX
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 6       ## set a variable in this interpreter session
>>> a           ## entering an expression prints its value
6
>>> a + 2
8
>>> a = 'hi'    ## 'a' can hold a string just as well
>>> a
'hi'
>>> len(a)      ## call the len() function on a string
2
>>> a + len(a)  ## try something that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str
>>> a + str(len(a))  ## probably what you really wanted
'hi2'
>>> foo         ## try something else that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'foo' is not defined
>>> ^D          ## type CTRL-d to exit (CTRL-z in Windows/DOS terminal)

python と入力してから >>> プロンプトが表示されるまでの間に python が出力する 2 行は、使用している python のバージョンと、そのビルド場所を示しています。最初に「Python 3.」と出力される限り、これらの例は機能します。

上記のように、変数と演算子を簡単に試すことができます。また、コードが値が割り当てられていない変数を読み取ろうとすると、インタープリタはランタイム エラーをスローします(Python 用語では「発生」します)。C++ や Java と同様に、Python では大文字と小文字が区別されるため、「a」と「A」は異なる変数です。行の末尾はステートメントの末尾を示します。そのため、C++ や Java とは異なり、Python では各ステートメントの末尾にセミコロンは必要ありません。コメントは「#」で始まり、行末まで続きます。

Python ソースコード

Python ソースファイルは「.py」拡張子を使用し、「モジュール」と呼ばれます。Python モジュール hello.py の最も簡単な実行方法は、シェル コマンド「python hello.py Alice」を使用することです。このコマンドは、Python インタープリタを呼び出して hello.py のコードを実行し、コマンドライン引数「Alice」を渡します。コマンドラインから Python を実行する際に使用できるさまざまなオプションについては、公式ドキュメント ページをご覧ください。

次に、非常にシンプルな hello.py プログラムを示します(コードブロックは中かっこではなくインデントで厳密に区切られています。これについては後で詳しく説明します)。

#!/usr/bin/python3

# import modules used here -- sys is a very standard one
import sys

# Gather our code in a main() function
def main():
    print('Hello there', sys.argv[1])
    # Command line args are in sys.argv[1], sys.argv[2] ...
    # sys.argv[0] is the script name itself and can be ignored

# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
    main()

コマンドラインからこのプログラムを実行すると、次のようになります。

$ python3 hello.py Guido
Hello there Guido
$ ./hello.py Alice  ## without needing 'python3' first (Unix)
Hello there Alice

インポート、コマンドライン引数、len()

Python ファイル(「モジュール」)の最も外側のステートメントは、1 回限りの設定を行います。これらのステートメントは、モジュールがどこかに初めてインポートされたときに上から下へ実行され、変数と関数を設定します。Python モジュールは、上記のように python3 hello.py Bob として直接実行することも、インポートして他のモジュールで使用することもできます。Python ファイルが直接実行されると、特殊変数「__name__」が「__main__」に設定されます。そのため、上記のボイラープレート if __name__ ==... を使用して、モジュールが直接実行された場合は main() 関数を呼び出し、モジュールが別のモジュールによってインポートされた場合は呼び出さないようにするのが一般的です。

標準の Python プログラムでは、リスト sys.argv には標準の方法でコマンドライン引数が含まれます。sys.argv[0] はプログラム自体、sys.argv[1] は最初の引数などです。argv または引数の数がわかっている場合は、上記のインタラクティブ インタープリタ コードで文字列の長さをリクエストしたときと同様に、len(sys.argv) を使用して Python からこの値をリクエストできます。一般に、len() を使用すると、文字列の長さ、リストとタプル(配列のような別のデータ構造)の要素数、辞書の Key-Value ペアの数を確認できます。

ユーザー定義関数

Python の関数は次のように定義されます。

# Defines a "repeat" function that takes 2 arguments.
def repeat(s, exclaim):
    """
    Returns the string 's' repeated 3 times.
    If exclaim is true, add exclamation marks.
    """

    result = s + s + s # can also use "s * 3" which is faster (Why?)
    if exclaim:
        result = result + '!!!'
    return result

また、関数や if 文を構成する行が、すべて同じインデント レベルでグループ化されていることにも注目してください。また、文字列を繰り返す 2 つの方法を紹介しました。+ 演算子はユーザー フレンドリーですが、* は Python の「繰り返し」演算子であるため、'-' * 10'----------' を返します。これは、画面上に「線」を作成する便利な方法です。コードのコメントで、* は + よりも高速に動作すると説明しました。これは、* では結果オブジェクトのサイズが 1 回だけ計算されるのに対し、+ では + が呼び出されるたびに計算が行われるためです。+ と * は、数値と文字列(およびその他のデータ型)で意味が異なるため、「オーバーロード」演算子と呼ばれます。

def キーワードは、かっこ内のパラメータとインデントされたコードで関数を定義します。関数の最初の行は、関数の機能を説明するドキュメント文字列(「docstring」)にすることができます。ドキュメント文字列は、上の例のように 1 行にすることも、複数行の説明にすることもできます。(これは Python 固有の機能である「三重引用符」です)。関数内で定義された変数はその関数に対してローカルであるため、上記の関数の「result」は別の関数の「result」変数とは別になります。return ステートメントは引数を取ることができます。その場合、呼び出し元に返される値は引数になります。

上記の repeat() 関数を呼び出し、その戻り値をプリントするコードは次のとおりです。

def main():
    print(repeat('Yay', False))      ## YayYayYay
    print(repeat('Woo Hoo', True))   ## Woo HooWoo HooWoo Hoo!!!

実行時に、関数は呼び出される前に「def」の実行によって定義される必要があります。通常、呼び出す関数を上に置き、ファイルの末尾近くに main() 関数を定義します。

インデント

Python の特徴の 1 つは、コードの空白文字のインデントが意味に影響することです。関数を構成するステートメントなどの論理ブロックはすべて、親関数や「if」などのインデントから設定された同じインデントを持つ必要があります。グループ内のいずれかの行のインデントが異なる場合、構文エラーとしてフラグが設定されます。

Python での空白文字の使用は、最初は少し奇妙に感じましたが、論理的であり、すぐに慣れました。TAB はインデント スキームを大幅に複雑にするため、使用しないでください(TAB の意味はプラットフォームによって異なる場合があります)。Python コードで TAB の代わりにスペースを挿入するようにエディタを設定します。

初心者からよくある質問は、「インデントは何スペースにすべきですか?」です。公式の Python スタイルガイド(PEP 8)によると、インデントには 4 つのスペースを使用する必要があります。(豆知識: Google の内部スタイル ガイドラインでは、2 つのスペースでインデントすることが規定されています)。

実行時にチェックされるコード

Python はコンパイル時にほとんどチェックを行わず、各行の型や名前などのチェックは、その行が実行されるまで延期されます。上記の main() が次のように repeat() を呼び出すとします。

def main():
    if name == 'Guido':
        print(repeeeet(name) + '!!!')
    else:
        print(repeat(name))

この if ステートメントには、repeat() 関数が repeeeet() と誤って入力されているという明らかなエラーが含まれています。Python では、実行時の名前が「Guido」でない限り、このコードはコンパイルされて正常に実行されます。実行が実際に repeeeet() を実行しようとしたときに、そのような関数がないことに気づき、エラーが発生します。このスニペットには 2 つ目のエラーもあります。name に値が割り当てられる前に、'Guido' と比較されています。未割り当ての変数を評価しようとすると、Python は「NameError」を発生させます。これらの例は、Python プログラムを初めて実行したときに、最初に表示されるエラーのいくつかが、このような単純なタイプミスや初期化されていない変数であることを示しています。Java のような冗長な型システムを持つ言語は、このようなエラーをコンパイル時に検出できるという利点があります(ただし、すべての型情報を維持する必要があります。これはトレードオフです)。

Python 3 では、型ヒントが導入されました。型ヒントを使用すると、関数の各引数の型と、関数から返されるオブジェクトの型を指定できます。たとえば、アノテーション付き関数 def is_positive(n: int) -> bool: では、引数 nint で、戻り値は bool です。これらの型の意味については後ほど説明します。ただし、型ヒントは完全に任意です。型ヒントを使用すると、cider-v や VS.code などの一部のエディタで、関数が正しい引数型で呼び出されていることを確認するチェックを実行できるため、型ヒントを採用するコードが増えています。コードの編集中に引数を提案して検証することもできます。このチュートリアルでは型ヒントについては説明しませんが、型ヒントについて耳にしたり、実際に目にしたりしたときに、それが何であるかを理解できるようにしておきましょう。

変数名

Python の変数にはソースコードで型が明示されていないため、変数に意味のある名前を付けて、何が起こっているのかを思い出せるようにすると便利です。単一の名前の場合は「name」、名前のリストの場合は「names」、タプルのリストの場合は「tuples」を使用します。 多くの基本的な Python エラーは、各変数にどのような型の値が入っているかを忘れたことが原因で発生します。変数の名前(実際に使用しているものすべて)を使用して、混乱を防ぎましょう。

実際の命名に関しては、「複数の単語」で構成される変数名に underscored_parts を好む言語もあれば、camelCasing を好む言語もあります。一般に、Python ではアンダースコア メソッドが優先されますが、そのスタイルをすでに使用している既存の Python コードに統合する場合は、キャメルケースを使用するように開発者に指示します。読みやすさが重要です。詳細については、PEP 8 の命名規則に関するセクションをご覧ください。

ご想像のとおり、「if」や「while」などのキーワードは変数名として使用できません。使用すると構文エラーが発生します。ただし、組み込み関数を変数名として使用しないように注意してください。たとえば、'str'、'list'、'print' は適切な名前のように見えますが、これらのシステム変数をオーバーライドすることになります。組み込み関数はキーワードではないため、Python の初心者による誤用が発生する可能性があります。

モジュールとその名前空間の詳細

「binky.py」というモジュールに「def foo()」が含まれているとします。この foo 関数の完全修飾名は「binky.foo」です。このようにして、さまざまな Python モジュールで関数と変数を自由に命名できます。変数名が競合することはありません。module1.foo は module2.foo とは異なります。Python の用語では、binky、module1、module2 にはそれぞれ独自の「名前空間」があります。これは、変数名とオブジェクトのバインディングです。

たとえば、argv リストや exit() 関数などの標準システム機能を含む標準の「sys」モジュールがあります。「import sys」というステートメントを使用すると、sys モジュールの定義にアクセスして、完全修飾名(sys.exit() など)で利用できるようになります(sys にも名前空間があります)。

  import sys

  # Now can refer to sys.xxx facilities
  sys.exit(0)

「from sys import argv, exit」という別のインポート形式もあります。これにより、argv と exit() を短い名前で使用できるようになりますが、関数や属性の由来を判断しやすいため、完全修飾名を使用した元の形式をおすすめします。

Python インタープリタの標準インストールにバンドルされているモジュールとパッケージは多数あるため、これらを使用するために特別な操作を行う必要はありません。これらをまとめて「Python 標準ライブラリ」と呼びます。よく使用されるモジュール/パッケージは次のとおりです。

  • sys - exit()、argv、stdin、stdout などへのアクセス
  • re - 正規表現
  • os - オペレーティング システム インターフェース、ファイル システム

すべての標準ライブラリ モジュールとパッケージのドキュメントは、http://docs.python.org/library で確認できます。

オンライン ヘルプ、help()dir()

Python のヘルプを利用する方法はいくつかあります。

  • 「python list」や「python string lowercase」など、「python」という単語で始まる Google 検索を行います。最初の検索結果が答えであることがよくあります。この手法は、他の言語よりも Python で効果を発揮するようです。
  • Python の公式ドキュメント サイト(docs.python.org)には、質の高いドキュメントが用意されています。それでも、Google 検索で数語を入力する方が早い場合もよくあります。
  • Python やプログラミングを初めて学ぶ方を対象とした公式の Tutor メーリング リストもあります。
  • 多くの質問(と回答)は、StackOverflowQuora で見つけることができます。
  • help() 関数と dir() 関数を使用します(下記を参照)。

Python インタープリタ内で help() 関数を使用すると、さまざまなモジュール、関数、メソッドのドキュメント文字列が表示されます。これらのドキュメント文字列は、Java の javadoc に似ています。dir() 関数は、オブジェクトの属性を返します。以下は、インタープリタから help() と dir() を呼び出す方法の例です。

  • help(len) - 組み込みの len() 関数のヘルプ文字列。呼び出しである「len()」ではなく「len」であることに注意してください。これは望ましくありません。
  • help(sys) - sys モジュールのヘルプ文字列(最初に import sys を実行する必要があります)
  • dir(sys) - dir()help() に似ていますが、定義されたシンボル(「属性」)の簡単なリストのみを返します。
  • help(sys.exit) - sys モジュールの exit() 関数のヘルプ文字列
  • help('xyz'.split) - 文字列オブジェクトの split() メソッドのヘルプ文字列。help() は、そのオブジェクト自体またはそのオブジェクトのと、その属性を使用して呼び出すことができます。たとえば、help('xyz'.split) の呼び出しは help(str.split) の呼び出しと同じです。
  • help(list) - list オブジェクトのヘルプ文字列
  • dir(list) - list オブジェクトの属性(メソッドを含む)を表示します。
  • help(list.append) - list オブジェクトの append() メソッドのヘルプ文字列