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 3」である限り、これらの例は問題なく機能するはずです。

上記のように、変数と演算子を簡単にテストできます。また、コードで値が割り当てられていない変数を読み取ろうとすると、インタープリタはランタイム エラーをスローします(Python では「raise」)。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__」に設定されます。そのため、モジュールが直接実行されるときに main() 関数を呼び出すように、上記のボイラープレート if __name__ ==... を用意するのが一般的です。ただし、モジュールが他のモジュールによってインポートされる場合は呼び出しません。

標準の Python プログラムでは、リスト sys.argv には標準的な方法でコマンドライン引数が含まれます。sys.argv[0] はプログラム自体、sys.argv[1] は最初の引数、というように続きます。argc または引数の数がわかっている場合は、上記のインタラクティブ インタープリタ コードで文字列の長さをリクエストしたときと同じように、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 つの方法も紹介しました。1 つはユーザー フレンドリーな + 演算子を使用する方法で、もう 1 つは Python の「繰り返し」演算子である * を使用する方法です。つまり、'-' * 10'----------' となり、画面上の「線」を簡単に作成できます。コードのコメントでは、* は + よりも高速に動作することを示唆しています。これは、* は結果オブジェクトのサイズを 1 回計算するのに対し、+ は + が呼び出されるたびに計算を行うためです。+ と * はどちらも「オーバーロード」演算子と呼ばれます。これは、数値と文字列(および他のデータ型)で意味が異なるためです。

def キーワードは、かっこ内にパラメータが含まれ、コードがインデントされた関数を定義します。関数の最初の行には、関数の動作を説明するドキュメント文字列(「docstring」)を指定できます。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」などのインデントから設定された同じインデントを設定する必要があります。グループ内の 1 つの行のインデントが異なる場合、構文エラーとして報告されます。

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

初心者からよくある質問は、「インデントを何個空けたらよいですか?」です。公式の 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 の基本的なエラーの多くは、各変数の値の型を忘れることによって発生します。そのため、変数名(実際のものすべて)を使用して、状況を整理します。

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

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

モジュールとその Namespace の詳細

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

たとえば、標準の「sys」モジュールには、argv リストや exit() 関数などの標準的なシステム機能が含まれています。「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」という単語で Google 検索を行います(「python list」や「python string lowercase」など)。多くの場合、最初のヒット結果が答えになります。この手法は、何らかの理由で他の言語よりも Python で効果的です。
  • Python の公式ドキュメント サイト(docs.python.org)には、質の高いドキュメントがあります。それでも、2、3 語の Google 検索の方が速い場合もあります。
  • Python やプログラミングを初めて学ぶ方向けの公式チュートリアルのメーリング リストもあります。
  • 多くの質問(と回答)は、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() メソッドのヘルプ文字列