Google Python 講座

先日のエントリPython勉強しますと書いた後、色々教材を探していて見つけたのですが
なんとPythonにはGoogle's Python Classというグーグルによる講座があるのです。
ビデオ、テキスト、練習課題と内容もなかなか充実しているのですが残念ながら英語版しかありません。

しかしやっぱりグーグルに教わりたい!
文字通りの意味のグーグル「先生」ですし。
なのでとりあえず「Pythonとは」にあたるIntroductionの部分を日本語に訳してみました。
原文はクリエイティブコモンズ2.5で公開されているため下に掲載しています。

ただ訳しはじめてから気づいたのですがPythonをこれから勉強する=まだ何も分かってない人間がPythonの教材を訳すのはかなり無理がありました・・・(TдT)
まず「list」なのですがこれはいわゆる「配列」のことのように思えるのですが調べてみるとPythonには「array」も別にあるようなので
とりあえずそのまま「リスト」と訳しています。
また「interpreter」の訳についてですが文中ではいわゆる対話型シェルの意味で使われている(と思われる)部分と単に実行エンジンという意味で使われている(と思われる)部分があり、両者を区別して訳すべきか悩んだ末、単に「インタプリタ」としています。
「argument」と「parameter」については文脈上区別する必要のある箇所はないと判断しどちらも単に「引数」と訳しています。
またコードサンプル内にコメントの形で書かれている注釈については日本語を含めるとコピペで不具合を生じる可能性があるためそのままにしています。

可能な限り正確な訳にしたいと思いますのでまちがいに気づかれた方は教えていただけるとありがたいです。

ここからhttp://code.google.com/edu/languages/google-python-class/introduction.htmlを引用、日本語訳したものです。

Python Introduction

Pythonは動的型付けのインタプリタ言語です。ソースコードでは変数、引数、メソッドのいずれも型を宣言しません。このことがコードを短く、変更を容易にしていますが、プログラマコンパイル時の(コンパイラによる)ソースコード内の型チェックができないということでもあります。Pythonは実行時にすべての値の型を検出し、おかしなコードは実行時に知らせてくれます。

Pythonのコードがどのように機能するか確認する最善の方法はPythonインタプリタを走らせ、そこへ実際にコードを入力してみることです。もしいつかあなたが「この数値をリストに追加したらどうなるだろう?」というような疑問を抱いたならばPythonインタプリタに打ち込んでみることがどうなるかを確認する手っ取り早い方法です。

Pythonのコードでは変数の型を宣言せずただ単に代入して実行するだけです。もし値を与えられていない変数を参照しようとすればPythonは実行エラーを示します。
C++Javaと同様にPythonでは大文字と小文字は区別され"a"と"A"は異なる変数となります。各行の終わりが「文」の終わりを意味し、--ここはC++Javaと異なるのですが--Pythonはそれぞれの「文」の最後にセミコロンを必要としません。(たぶんただの惰性だとは思いますが)Pythonでも文の終わりにセミコロンをつけることもできますが、それは推奨されていません。コメントは '#' で始めその行の終わりまでとなります。(各OSでのPythonのインストールについては Python Set UP の項目を見てください)

$ python  ## Run the python interpreter
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       ## 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
>>> foo(a)      ## try something that doesn't work
Traceback (most recent call last):
  File "", line 1, in ?
NameError: name 'foo' is not defined
>>> ctrl-d             ## type ctrl-d to exit (ctrl-z on Windows)

Pythonのプログラムについて

Pythonのソースファイルは".py"という拡張子を使います。"hello.py"というファイルに書かれたPythonプログラムを実行するもっとも簡単な手段は"python hello.py Alice"というシェルコマンドを用いることです。--これでhello.py内のコードがロード、実行されコマンドライン引数として"Alice"が渡されます。

これが非常にシンプルな hello.py というPythonプログラムです。

#!/usr/bin/python

# 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()

コマンドラインから実行したこのプログラムは次のようになります、

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

Pythonモジュールについて

Pythonファイル、すなわち"モジュール"内の一番外側の文は一度だけ実行され初期化を行います--この最も外側の文はそのモジュールがどこかから最初にインポートされた時に最初から最後まで実行され、モジュールの持つ変数と関数を初期化します。Pythonのモジュールは直接実行することもできますし--上記の"python hello.py Bob"がそうです--、他のモジュールからインポートして使用することもできます。Pythonファイルでは、直接実行された場合のみ特別な変数である"__name__"に"__main__"がセットされます。この事を利用した定番の記述方法があり、それが上の例でmain()関数を呼ぶ部分に使用している"if __name__ ==..."という記述で、このモジュールが直接実行された場合にはif内が実行されますが、他のモジュールからインポートされた場合には実行されないというわけです。

一般的なPythonのプログラムでは、sys.argvという名のリストにコマンドライン引数がセットされており、通常sys.argv[0]はそのプログラム自体をさし、sys.argv[1]から順に一つ目の引数、二つ目の引数・・・が入っています。

関数について

Pythonにおける関数は次のように定義します。

# Defines a "repeat" function that takes 2 arguments.
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

# Notice also how the lines that make up the function or if-statement
# are grouped by  all having the same indentation.

"def"という文字列が括弧に囲まれた部分を引数、インデントされた部分をコードとして関数を定義します。関数内の最初の行に"docstring"という、その関数が何をするものかを説明する文章を書くことができます。"docstring"は一行に書いてもいいですし上の例のように複数行にまたがっても構いません。関数内で定義された変数はローカル変数となるため上の例の関数内の"result"という変数は別の関数内の"result"と言う変数とは別の物となります。return文に引数を持たせることもでき、その場合はその引数が呼び出し元に返されます。

これが上の例のrepeat()関数を実行し、return文で返される内容を画面表示するコードです

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

(訳注:上のコードの横にコメントの形で書かれている実行結果ですがそれぞれ「YayYayYay」「Woo HooWoo HooWoo Hoo!!!」の誤りだと思われます。)

実行時、関数は呼び出される前に"def"文の実行による定義が行われなければなりません。呼び出される関数を先に記述し、ファイルの一番最後でmain()関数を定義することが多いのはこのためです。

インデント(文字下げ)について

Pythonの変わった特徴の一つがコードの一部を空白でインデントすることがコードの意味に影響を与えるという点です。関数を作成する文のように論理的に一まとめとなっている文はすべて同じだけインデントされていなければならず、外側にさらに関数定義、if文などによるインデントがある場合そこを基準として揃っていなければなりません。もし同一のグループ内に一行だけ異なるインデントがされているならそれは構文エラーの目印です。

はじめはPythonにおける空白の使い方を少し奇妙に感じると思いますが、これは合理的であり、あっという間に慣れてしまいます。Tabはこのインデントの構造をとてつもなく複雑にしてしまうためPythonファイル内では使用を避けるべきです。Pythonのコードに対してはTabの変わりにスペースを用いるようあなたのエディタを設定しておきましょう。

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

Pythonではコンパイル時にはほんのわずかのチェックしか行わず、ほぼすべての型、名前などはここではチェックされません。各行のチェックはその行が実行される直前に行われます。先ほど上で示したrepeat()を呼ぶmain()関数が次のようであったと仮定します。

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

このif文には明らかな間違いがあります、repeat()関数がどうしたことかrepeeeet()と書かれてしまっています。ところがこれがPythonの面白いところなのですが、このコードは何の問題もなくコンパイルも実行も行われるのです、実行時にname変数の値が'Guido'でなければ。(訳注:上のコードを実行するとnameの値が'Guido'以外の値でも、repeat()関数の引数が足らないためエラーになるはずですが原文ではこうなっているためそのままにしてあります。)プログラムの動作が実際にrepeeeet()を実行しようと試みた場合に限ってそのような関数が存在しないことを検知しエラーを示すわけです。これはあなたが最初にPythonのプログラムを実行した際、まず目にするエラーがこのような単純なタイポ(うち間違い)によるものかもしれないということです。この点はもっとめんどくさい型機能を持つ言語、例えばJava、の長所です、、、それらの言語ではこのようなエラーはコンパイル時に検出してくれるからです。(もっともそれはプログラマがすべての型情報を管理しなければならないということでもあるため一長一短ですが)

変数名について

Pythonの変数はソースコード内には全く型が記述されていないため、その変数が何なのかが(その名前から)思いだせるような意味のある名前を付けておくとすごく役に立ちます。そう、もしそれが単一の名前をさすのであれば"name"、名前のリストであれば"names"、タプルのリストであれば"tuples"といった具合です。Pythonの初歩的なエラーの多くが各変数に入っている値がどんな型だったのかを忘れてしまった結果なのです、あなたが付ける変数名は(変数名に限らずすべての物ですが)常に筋の通ったものを使いましょう。

モジュールとインポートについて

Pythonコードの各ファイルは*モジュール*とも呼ばれます。"binky.py"というファイルは"binky"モジュールでもあるわけです。各モジュールには基本的に"x = 6"や"def foo()"といった変数定義を持っています。仮に"binky.py"というファイルに"def foo()"が含まれていたとしましょう。するとこのfoo関数の完全修飾名は"binky.foo"になります。この方法を用いることで、さまざまなPythonモジュールがそれぞれの関数や変数に好きな名前を付けることができ、それでいて変数名の衝突が起こらないわけです--module1.fooはmodule2.fooとは区別されるからです。

例えばよく使われる"sys"というモジュールがあり、これはargvリストやexit()関数といったシステムに関する標準的な機能を持っています。"import sys"という文を用いることで他のモジュールがsysモジュール内の定義にアクセスできます。「インポート」は積極的にすべての定義を取り込んでしまうわけではなく、あくまでsys.exit()といった完全修飾名による利用が可能な状態にするだけです。

 import sys

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

"from hashing import sha1, md5"のような他のインポート方式もあります。この方法では sha1() と md5() が(そのままの)短い名前のまま利用可能になります。

Pythonでは多くのよく使われるモジュールが一緒にパッケージされておりPythonインタプリタの標準的なインストールで同時にインストールされます、そのため特別な何かをしなくてもそれらを使うことができます。一般によく使われる標準Pythonモジュールには次のような物があります。

オンラインヘルプとdir関数について

pythonのヘルプを手に入れるには3つの良い方法があります。

  • "python"や"python list"、"python string lowercase"などの単語でグーグル検索しましょう。最初にヒットするものが答えであることはよくあります。ある理由によりpythonでは他の言語の場合よりこのテクニックが有効に働きます。
  • 公式のpythonドキュメントサイト--docs.python.org--には高品質な文章があります。それでもなお、二つの単語の組み合わせでグーグル検索するほうが早いこともよくあります。
  • 下で説明するhelp()関数を使いましょう。

pythonインタプリタ実行中は、help()関数でさまざまなモジュール、関数、メソッドに関する文章を呼び出すことができます。これらの文章はJavaJavadocに似ています。これは素早く文章を利用する方法の一つです。ここではインタプリタ内からhelp()関数を呼ぶさまざまな方法を示します。

  • help(len) --組み込みのlen関数に関する文章を表示します。(入力するのは"len"であって関数呼び出しの"len()"ではないことに注意してください。)
  • help(sys) --sysモジュールの全体像に関する文章です。(先に"import sys"が実行されていなければなりません。)
  • dir(sys) --dir()はhelp()に似ていますが定義済みのシンボル(訳注:ここでは変数名、関数名などのこと)の一覧を表示するだけです。
  • help(sys.exit) --sysの中のexit()関数についての文章です。
  • help('xyz'.split) -- "str"といった文字列はそれ自体が文字列を扱うコードを持ったモジュール"str"になります。(訳注:ただし日本語はそのままでは使用できません。)しかし、そのことが分かっていなくても「適当な文字列」を使ってあなたの意図するもの(この'xyz'.fooは文字列に対して実行可能なfoo()というメソッドの意)のhelp()を呼び出すことができます。
  • help(list) --組み込みの"list"モジュールに関する文章です。
  • help(list.append) -- listモジュール内のappend()関数についての文章です。


この資料はグーグル社のNick Parlanteによって作成されました。Google's Python Classのテキストとビデオはクリエイティブコモンズ2.5ライセンスに基づき利用可能です。

http://code.google.com/edu/languages/google-python-class/introduction.html

Pythonの勉強より英語の勉強になった(^_^;)