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

import、コマンドライン引数、len()

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

標準的な 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 つ目は、よりユーザー フレンドリーな + 演算子を使用する方法ですが、* は 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 での独特な機能として、空白文字のインデントがコードの意味に影響を与えることがあります。関数を構成するようなステートメントの論理ブロックは、すべて同じインデント(親関数のインデント、または「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-statement には明白なエラーが含まれており、 repeat() 関数が誤って repeeeet() として入力されています。Python では面白いことに、実行時の名前が「Guido」でない限り、このコードは正常にコンパイルされて実行されます。実行が実際に repeeeet() を実行しようとした場合にのみ、そのような関数が存在しないことが認識され、エラーが発生します。このスニペットには 2 つ目のエラーもあります。「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 を好む言語もありますが、キャメルケースが好まれる言語もあります。一般的に Python ではアンダースコア方式が推奨されますが、すでにそのスタイルを使用している既存の Python コードに統合する場合は、キャメルケーシングに従うようにデベロッパーを誘導します。読みやすさが重視されます。詳しくは、PEP 8 の命名規則に関するセクションをご覧ください。

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

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

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

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

  import sys

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

次のようなインポート フォームがもう 1 つあります。「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 リスト」や「Python 文字列小文字」など、「Python」という単語で Google 検索を行います。多くの場合、最初のヒットで答えが得られます。この手法は、なんらかの理由で他の言語よりも Python のほうが適しているように思えます。
  • Python の公式ドキュメント サイト(docs.python.org)には高品質のドキュメントがあります。とはいえ、いくつかの単語を使った 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() メソッドのヘルプ文字列