Python Introduction in Google's Python Class in Japanese

Google による Python の授業 (日本語訳)/ Google's Python Class (英語原文)

資料
日本語訳: 設定/ 入門 / 文字列/ リスト/ 整列/ 辞書とファイル/ 正規表現/ ユーティリティ
英語原文: Set Up/ Introduction/ Strings/ Lists/ Sorting/ Dict and Files/ Reg. Exp./ Utilities

練習問題
日本語訳: 基本問題/ 新生児名/ 特殊なコピー/ アクセス履歴のパズル
英語原文: Basic Exercises/ Baby Names Exercise/ Copy Special Exercise/ Log Puzzle Exercise

講義映像
英語
1日目: Introduction, Strings/ Lists and Sorting/ Dicts and Files
2日目: Regular Expression/ Utilities/ Utilities urllib/ Conclusions

Python 入門


Python は動的な, インタプリタ型の言語です. ソースコードは変数, パラメータ, メソッドの型を宣言しません. これにより, コードは短く, 柔軟になり, ソースコードを実行形式に変換するときに型の確認を行わずに済みます. Python は実行時にすべての値の型を記録し, 実行の際に意味を成さないコードに印をつけます.
Python のコードが機能するところを見る良い方法は, Python インタプリタを実行し, コードを直接そこに入力することです. "もし int を list に加えようとしたらどうなる?" といった疑問を持ったとき, それを Python インタプリタに入力するのが 何が起こるかを見る手っ取り早い方法です. Python のコードは変数の型を宣言しません. 単に変数に割り当てて実行します. コードが値を割り振られていない変数を読もうとするとき, Python は実行時エラーを生成します. C++ や Java のように, 大文字と小文字を区別するので, "a" と "A" は違う変数です. 1行の終わりは命令の終わりを示すので, C++, Java とは異なり, Python は各命令の最後にセミコロンは必要ありません. Python の命令の終わりにセミコロンをつけられます (恐らく習慣ではありません) が, 最適な書式ではありません. 注釈は "#" で始まり, 行末まで続きます. (さまざまなオペレーティングシステムでの Python のインストール方法は Python の設定 (英語), Python の設定 (日本語) を見ること. )
$ python  ## Python インタプリタを実行する. 

Python 2.4.4 (#1, Oct 18 2006, 10:34:39)

[GCC 4.0.1 (Apple Computer, Inc. build 5341)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> a = 6 ## このインタプリタを起動している間の変数を設定する. >>> a ## 式の入力により, 値が出力される. 6 >>> a + 2 8 >>> a = 'hi' ## a は文字列も格納できる. >>> a 'hi' >>> len(a) ## len() 関数を文字列に対して呼び出す. 2 >>> foo(a) ## 機能しないことを試してみる. Traceback (most recent call last): File "", line 1, in ? NameError: name 'foo' is not defined >>> ctrl-d ## 終了するために ctrl-d を入力する. (Windows では ctrl-z)

Python プログラム


Python のソースファイルは ".py" という拡張子を使います. hello.py というファイルに入った Python プログラムを 実行する簡単な方法は, シェルコマンドで "python hello.py Alice" と入力することです. -- これにより, hello.py の中のコードを読み込み, 実行し, コマンドラインの引数 "Alice" をコードに渡します.
これはとても簡単な Python プログラム hello.py です.
#!/usr/bin/python

# 使うモジュールをインポートする. -- sys はとても標準的に使われます. 
import sys

# コードを main() 関数に集める. 
def main():
  print 'Hello there', sys.argv[1]
  # コマンドラインの引数は sys.argv[1], sys.argv[2] .. に入ります. 
  # sys.argv[0] はスクリプト名そのもので, 無視できます. 

# プログラムを起動するために main() 関数を呼ぶ
# 標準的な共通語
if __name__ == '__main__':
  main()

コマンドラインからこのプログラムを実行すると:
$ python hello.py Guido
Hello there Guido
$ ./hello.py Alice    # 初めに 'python' は必要ない (Unix)
Hello there Alice

Python モジュール


Python のファイルの中の最も外側の命令である "モジュール" は, 一回だけの設定を行います. その命令は一番上から下に向かって, はじめに そのモジュールはどこからか引き入れられ, 変数と関数を設定します. (上の "python hello.py Bob" のように) Python のモジュールは直接実行出来る 一方, 何か他のモジュールにより引き入れられて使われることもあります. Python ファイルが直接実行されるとき, 特別な変数 "__name__" は "__main__" に設定されます. このため, モジュールが直接実行されていて, モジュールが何か他のモジュールにより引き入れられていないとき, main() 関数を呼ぶために上に示した共通語 if __name__ ==... が一般的に使われます.
標準的な Python プログラムでは, リスト sys.argv はコマンドラインの引数を持っていて, 標準では, sys.argv[0] がプログラムそのもので, sys.argv[1] が第一引数, それ以降と続きます.

関数


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

# 2つの引数を取る "repeat" 関数を定義する. 
def repeat(s, exclaim):
  """Returns the string s repeated 3 times.
  If exclaim is true, adds exclamation marks.
  """
  
  result = s + s + s
  if exclaim:
    result = result + '!!!'
  return result

# 関数, または, if 文を構成する行が同じ字下げ幅を持つことにより, 
# まとめられていることに注意. 

"def" はカッコ内のパラメータの関数を定義し, そのコードは字下げされています. 関数の1行目は, 関数の動作を表す説明文 ("docstring") に なることもあります. docstring は, 1行の場合もあり, 上の例に示したように 複数行の場合もあります. 関数で定義された変数は, その関数に局所的なものなので, その関数の "結果" は 他の関数の "結果" 変数とは別のものです. return 命令は引数を取ることができ, その場合は, その引数の値が呼び出し先に返されます.
こちらは, 上の repeat() 関数を呼び出し, 返された値を表示するコードです.
def main():
  print repeat('Yay', False)      ## Yay
  print repeat('Woo Hoo', True)   ## Woo Hoo!!!

実行時に, 関数は呼び出される前に, "def" の実行により 定義されなければいけません. 一般的に, main() 関数を定義するのはファイルの下のほうで, その上に main() 関数が呼びだす関数があります.

字下げ


Python における一般的ではない特徴の1つとして, コード中の空白による字下げがコードの意味に影響を与えることがあります. 関数を構成するような, 命令の論理的なひとまとまりは, 同じ字下げ幅をすべて持つ必要があり, その字下げ幅は そのブロックの親の関数や "if" といったものの字下げ から設定されます. ひとつのまとまりの中のある行が異なる字下げ幅を持っていると, そこは文法エラーになります.
Python における空白の使い方は当初, 奇妙に感じるかもしれませんが, 論理的なもので, 私はすぐに慣れました. タブ記号を Python のファイルに入れるのは避けること. 入れてしまうと, 字下げの枠組みがとても複雑になってしまいます. あなたのテキストエディタを Python のコードではタブ記号の代わりに空白記号を 挿入するように設定すること.

コードは実行時に確認


Python は実行形式に変換するときに ほとんど確認をせず, ほとんどすべての型や名前などについての 各行の確認を, その行が実行されるまで延期します.
def main():
  if name == 'Guido':
    print repeeeet(name) + '!!!'
  else:
    print repeat(name)

この if 文は, repeat() 関数がたまたま repeeeet() と入力されている, という 明らかな誤りを含んでいます. Python では面白いことに, 実行時の name が 'Guido' でない限り, このコードは実行形式に変換され, 正常に動作します. repeeeet() 関数が実際に処理されようとする実行時にはじめて, そのような関数はないことがユーザにやっと知らされ, エラーが生成されます. これが意味するのは, Python のプログラムを初めて実行したとき, 初めに見るエラーのいくつかは, 上の例のような単純な打ち間違いだ, ということです. これは, より冗長な型の方式を持つ Java のような言語に利がある場合にあたり, そういった言語は実行形式に変換するときに, このようなエラーを見つけることができます (しかしもちろん, すべての型情報を保持する必要があり, 一長一短です).

変数名


Python の変数はソースコードの中に型について何も書かれていないので, 意味のある変数名をつけると, プログラムが何をしているのかを 思い出すのに非常に役立ちます. 単一の名前に関する変数なら "name" とし, 名前のリストに関する変数なら "names", タプルのリストなら "tuples" と名づけること. 多くの基本的な Python のエラーは, どんな型の値がそれぞれの変数に 入っているかを忘れていることから起こります. ですから, (本当にすべての) 変数名をわかりやすい名前にすること.

モジュールとインポート


Python のコードからなる 1つのファイルをモジュールと呼びます. ファイル "binky.py" はモジュール "binky" でもあります. モジュールは基本的に "x = 6", "def foo()" といった変数の定義を含みます. ファイル "binky.py" が "def foo()" を含んでいるとします. この foo 関数の完全修飾名は, "binky.foo" になります. この方法では, さまざまな python モジュールは 関数や変数を好きなように名づけることが出来て, 変数名は決して重複することはありません. -- module1.foo は module2.foo とは区別されます.
例えば, 引数のための argv リストや exit() 関数のような 基本的なシステムの道具を含む, 基本の "sys" モジュールがあります. "import sys" という文で, 別のモジュールは sys モジュールの中にある定義を利用できます. インポートは, 能動的にすべての定義を取り込むわけではなく, 単に, そこで定義されているものを完全修飾名で利用できるようにするだけです.
  import sys

  # もう, sys.xxx という道具を参照できます. 
  sys.exit(0)

次のような, もう1つのインポートの形式があります. "from hashing import sha1, md5" これにより, sha1(), md5() はその短い名前のまま, 利用可能になります.
Python のインタプリタを普通にインストールするときに, そこに同梱されている多くの基本的なモジュールは Python とひとまとめになっているので, そのモジュールを使うのに特別なことをする必要はありません. 良く使われる基本的な Python のモジュールとしては,
  • sys -- exit(), argv, stdin, stdout,... を利用できる.
  • re -- 正規表現
  • os -- オペレーティングシステムのインターフェイス, ファイルシステム
があります.

オンラインヘルプと dir


Python に関する情報を得る3つの良い方法があります.
  • "python リスト" や "python 文字列 小文字" のような "python" から始まる検索語で google サーチを使うこと. その 1番目の検索結果が答えになっていることもしばしばです. この方法は他の言語の場合よりも Python の方が上手くいくようです.
  • 公式 Python の文章のサイト docs.python.org には高品質の文章があります. にもかかわらず, いくつかの検索語による google 検索の方が早い場合が良くあります.
  • 以下に説明する help() 関数を使う.

Python インタプリタの内側では, help() 関数が様々なモジュール, 関数, メソッドに 対する説明文を引き出します. その説明文は Java の javadoc に似ています. これは説明文に早くアクセスする 1つの方法です. インタプリタの中から help() 関数を呼ぶ方法はいくつかあります.
  • help(len) -- 組み込みの len 関数の説明文 (関数を呼ぶなら "len()" ではなく "len" と入力する. )
  • help(sys) -- sys モジュールに対する全体の説明文
  • dir(sys) -- dir() は help() と同じような機能を持っていますが, 定義された記号の簡単なリストを出力するだけです.
  • help(sys.exit) -- sys モジュールに含まれる exit() 関数に対する説明文
  • help('xyz'.split) -- モジュール "str" が組み込みの文字列の型に対するコードを含んでいる ことを知らなかった場合, その 型の を使って help() を呼ぶことが出来ます. ここで 'xyz'.foo と書くと, 文字列に対して動く foo() メソッドを 意味します.
  • help(list) -- 組み込みの "list" モジュールの説明文
  • help(list.append) -- リストモジュールにある append() 関数の説明文

この資料は Google の Nick Parlante によって作成されたものの翻訳です. Google による Python の授業の文章と映像は Creative Commons Attribution 2.5 ライセンスの下で利用できます.