Commits

Shinya Okano committed 3863b48

過去の資料取り込み

  • Participants
  • Parent commits 66d417d

Comments (0)

Files changed (7)

File advanced.rst

+関数
+=======================
+
+関数定義
+----------
+
+関数はdef文で定義します。引数が無くてもかっこは必須です。
+
+.. code-block:: pycon
+
+  >>> def hello():
+  ...     print 'Hello World!'
+  ...
+  >>> def add(a, b):
+  ...     return a + b
+  ...
+
+デフォルト引数
+--------------
+
+Pythonでは引数のデフォルトの値を決められます。該当の引数が与えられない場合にデフォルトの値が関数に渡されます。
+
+.. code-block:: pycon
+
+  >>> def ian(word='black'):
+  ...      print '%s ian' % word
+  ...
+  >>> ian()
+  black ian
+  >>> ian('white')
+  white ian
+
+可変長引数
+----------
+
+``*`` からはじまる引数で可変長の引数をリストとして取得できます。
+
+.. code-block:: pycon
+
+  >>> def sum(*args):
+  ...     result = 0
+  ...     for x in args:
+  ...         result += x
+  ...     return result
+  ...
+  >>> sum(1,2,3,4,5,6,7,8,9,10)
+  55
+  >>> sum(1, 2, 3)
+  6
+
+可変長キーワード引数
+--------------------
+
+``**`` からはじまる引数で可変長のキーワード引数が辞書として取得できます。
+
+.. code-block:: pycon
+
+  >>> def f(**kwargs):
+  ...     return kwargs
+  >>> f(a=1, b=2, c=3)
+  {'a': 1, 'c': 3, 'b': 2}
+  >>> def g(**kwargs):
+  ...     for key, value in kwargs.iteritems():
+  ...         print key, value
+  >>> g(a=1, b=2, c=3)
+  a 1
+  c 3
+  b 2
+
+特殊な引数指定方法
+=====================
+
+リストや辞書の各要素を引数として渡すこともできます。
+
+引数が複雑な関数を呼び出すときや、条件によって引数が細かく変化するような場合に有用です。
+
+.. code-block:: pycon
+
+    >>> def func_a(x, y, z):
+    ...     print x + y + z
+    ...
+    >>> args = [1, 3, 5]
+    >>> func_a(*args)  # func_a(1, 3, 5)という呼び出しと等価
+    9
+    >>> def func_b(name="bucho", age=36):
+    ...     print name, age
+    ...
+    >>> kwargs = {'name': "feiz", 'age': 24}
+    >>> func_b(**kwargs)  # func_b(name="feiz", age=24)という呼び出しと等価
+    feiz 24
+
+クラス
+=======================
+
+自分でデータ型を作成したい場合、Pythonではクラスを作ります。
+
+.. code-block:: pycon
+
+  >>> class Person(object):
+  ...     def __init__(self, name, words):
+  ...         self.name = name
+  ...         self.words = words
+  ...     def say(self):
+  ...         print u'「%s」と%sさん' % (self.name, self.words)
+  ...
+  >>> feiz = Person('feiz', u'ふぇ')
+  >>> feiz.say()
+  「ふぇ」とfeizさん
+  >>> tokibito = Person('tokibito', u'ぬるぽ')
+  >>> tokibito.say()
+  「ぬるぽ」とtokibitoさん
+
+
+モジュール
+=======================
+
+``import`` 文でモジュールが読み込めます。
+
+標準モジュールの ``os`` を読み込んでみましょう。
+
+``import os`` とすると ``os`` モジュール内のオブジェクトにアクセスする事ができます。
+
+.. code-block:: pycon
+
+  >>> import os              # グローバルネームスペースにosが追加される
+  >>> os.path.join('/usr/', 'home/bucho/')
+  '/usr/home/bucho/'
+
+``from os import path`` とすると ``os.path`` を ``path`` として使うことができます。
+
+.. code-block:: pycon
+
+  >>> from os import path    # グローバルネームスペースにpathが追加される
+  >>> path.join('/usr/', 'home/bucho/')
+  '/usr/home/bucho/'
+
+ファイル
+=======================
+
+ファイルの操作は ``ファイルオブジェクト`` を介して行います。
+
+読み込み
+--------
+
+open関数にファイルパスを渡し、読み込み用ファイルオブジェクトを作成します。
+
+.. code-block:: pycon
+
+  >>> fin = open("test.txt")
+  >>> fin.read()
+  'hello world\ngoodbye world'
+  >>> fin.close()
+
+読み込み2
+----------------
+
+for文で行ごとの取得ができます。
+
+.. code-block:: pycon
+
+  >>> fin = open("test.txt")
+  >>> linenum = 0
+  >>> for line in fin:
+  ...     linenum += 1
+  ...     print "%d: %s" % (linenum, line),
+  ...
+  1: hello world
+  2: goodbye world
+  >>> fin.close()
+
+書き込み
+--------
+
+ファイルに書き込みをするには、open関数の2つめの引数に"w"を渡し、書き込み用のファイルオブジェクトを作成します。
+
+.. code-block:: pycon
+
+  >>> fout = open("test.txt", "w")
+  >>> out.write("hello world")
+  >>> fout.close()
+
+file-likeオブジェクト
+---------------------
+
+fileオブジェクトのように扱えるオブジェクトは、まとめてfile-likeオブジェクト呼ばれています。
+
+StringIO.StringIOなどがよく使われます。
+
+

File appendix1.rst

+===============================================
+Appendix: パッケージ管理ツール
+===============================================
+
+Pythonにもサードパーティ製パッケージのリポジトリがあります
+
+http://pypi.python.org/
+
+ここに登録されているパッケージは、パッケージ管理ツールを使って簡単にインストールすることができます。
+
+Pythonのパッケージ管理ツールはいくつか種類がありますが、今回はeasy_installを利用してみます。
+
+
+インストール
+===========================
+
+以下のページからdistributeソースを入手します。
+
+http://pypi.python.org/pypi/distribute/
+
+アーカイブはほぼ最下段にあります。
+
+ダウンロード、解凍が完了したら、distributeのディレクトリに入り、以下のコマンドでインストールします。
+
+.. code-block:: pycon
+
+    $ python setup.py install
+
+Mac, linuxの場合はsudoで実行するのを忘れないようにしてください。
+
+easy_installを使ってみる
+=======================================
+
+試しにipythonをインストールしてみます。
+
+ipythonは高機能なPython対話シェルです。標準のPython対話シェルに比べて補完や多色表示、行番号表示などの便利機能が多数搭載されています。
+
+.. code-block:: pycon
+
+    $ easy_install ipython
+
+例によってMac, linuxの方はsudoを忘れないようにしてください。
+
+これだけでインストールは完了です。ターミナル(コマンドプロンプト)上でipythonと入力してipythonが起動できるか確認してみましょう。

File appendix2.rst

+========================================================
+Appendix: Pythonのコーディングスタイル
+========================================================
+
+PEP8
+==========
+
+Pythonでは、推奨されるコーディングスタイルがPEP8に定義されています。
+
+もちろん、あくまで推奨なので、必ず守らなくてはいけないものではありませんが、読みやすいPythonコードを書くために是非とも覚えておいてください。
+
+    http://oldriver.org/python/pep-0008j.html
+
+pep8パッケージを使うと、コードがpep8に準拠しているかどうかチェックすることができます。
+
+    http://pypi.python.org/pypi/pep8
+
+PEP257
+=================
+
+Pythonには"docstring(ドキュメンテーション文字列)"という仕組みがあります。
+
+PEP257は、docstringの推奨される書き方についてのPEPです。
+
+    http://www.python.org/dev/peps/pep-0257/
+
+
+=======================
+基本編
+=======================
+
+
+Hello World!
+=======================
+
+ターミナル(コマンドプロンプト)を起動して、 ``python`` と入力して実行すればPythonが対話モードで起動します。
+
+``>>>`` が標準のpythonインタプリタのプロンプトです。 [#]_
+
+.. code-block:: pycon
+
+  $ python
+  >>> print "Hello World!"
+  Hello World!
+
+printはpython3から式になります。python2.6からは互換性のため、文でも式でも書けるようになっています。
+
+.. code-block:: pycon
+
+    >>> print("hello world")
+
+.. [#] ipythonなど、>>>でないインタプリタもありますが、やっぱりpythonといえば>>>ですね。
+
+スクリプトファイル
+============================
+
+スクリプトファイルは、拡張子.pyで作成します。
+
+hello.py::
+
+    # -*- coding: utf-8 -*-
+
+    print "hello world."
+
+先頭のcoding: utf-8という記述は、スクリプトファイルのエンコーディングを指定するものです。スクリプト内で日本語を扱うときは必ず指定するようにしてください。
+
+.. code-block:: pycon
+
+    $ python hello.py
+    hello world.
+
+演算
+===============
+
+.. code-block:: pycon
+
+  >>> 1 + 2
+  3
+  >>> 2 * 2
+  4
+
+pythonでは整数同士の割り算の結果は整数に丸められてしまうので注意してください。
+
+いずれか一方が小数であれば小数で計算されます。
+
+.. code-block:: pycon
+
+  >>> 5 / 2
+  2
+  >>> 10 / 3.0
+  3.3333333333333333
+
+加減乗除算に加えて、自乗(**)と剰余(%)が利用できます。
+
+.. code-block:: pycon
+
+  >>> 5 % 2
+  1
+  >>> 2 ** 4
+  16
+
+文字列結合は ``+`` です。更に文字列には ``*`` も使えます。
+
+.. code-block:: pycon
+
+  >>> 'ryo' + 'aita'
+  'ryoaita'
+  >>> 'feiz,' * 10
+  'feiz,feiz,feiz,feiz,feiz,feiz,feiz,feiz,feiz,feiz,'
+
+比較演算
+============
+
+比較演算子は ``==``, ``!=``, ``<=`` などがあります。結果として真偽値が返されます
+
+.. code-block:: pycon
+
+  >>> 2 * 3 == 6
+  True
+  >>> 2 != 2
+  False
+
+論理演算
+============
+
+論理演算は ``and`` ``or`` ``not`` が利用できます。
+
+.. code-block:: pycon
+
+  >>> 1 and 2   # 1が真なので2が結果
+  2
+  >>> 0 and 1   # 0が偽なので1は評価されない
+  0
+  >>> 0 or 1    # 0が偽なので1が評価される
+  1
+
+変数
+=======================
+
+pythonでは変数は代入した時点で自動的に作成されます。事前に宣言しておく必要はありません。
+
+.. code-block:: pycon
+
+  >>> bucho
+  NameError
+  >>> bucho = 'show'
+  >>> bucho
+  'show'
+
+コメント
+=========================
+
+#の後ろはコメントになります。
+
+.. code-block:: pycon
+
+    >>> # コメント
+
+複数行コメントの構文はありませんが、複数行文字列で代替できます。
+
+.. code-block:: python
+
+    """コメント
+    コメント
+    コメント
+    """
+
+データ型(1)
+=======================
+
+整数, 小数
+----------------
+
+.. code-block:: pycon
+
+  >>> 1234
+  1234
+  >>> 3.14
+  3.14
+
+
+真偽値
+--------
+
+.. code-block:: pycon
+
+  >>> True
+  True
+  >>> False
+  False
+
+文字列
+------
+
+文字列は ``'`` か ``"`` で囲みます。二つに差はありません。
+
+.. code-block:: pycon
+
+  >>> 'Good morning, Feiz!'
+  'Good morning, Feiz!'
+
+文字列に改行を含めるには、 改行文字``\n`` を使うか、三連の(ダブル)クオーテーションで囲みます。
+
+.. code-block:: pycon
+
+  >>> print 'Feiz!\nGood Bye!!'
+  Feiz!
+  Good Bye!!
+
+  >>> print """Azuma
+  ... Kenta"""
+  Azuma
+  Kenta
+
+エスケープシーケンス(``\``)をそのまま表示するには、 ``\\`` とニ連続で書くか、raw文字列を使います。
+
+raw文字列は、クオーテーションの前に``r``をつけて表します。
+
+.. code-block:: pycon
+
+  >>> print 'Feiz!\nFeeeeeeiz!!'  # 何もしない場合改行して表示される
+  Feiz!
+  Feeeeeeiz!!
+
+  >>> print 'Feiz!\\nFeeeeeiz!!'  # 2連続で書く場合
+  Feiz!\nFeeeeeiz!!
+
+  >>> print r'Feiz!\nGood Bye!!' # raw文字列を使う場合
+  Feiz!\nGood Bye!!
+
+クォーテーションの前にuをつけるとUnicode文字列になります。
+
+.. code-block:: pycon
+
+    >>> u"あずま"
+    u'\u3042\u305a\u307e'
+
+
+データ型(2)
+===========
+
+リスト
+------
+
+順序を持った値の集合です。型が混在しても問題ありません。
+
+.. code-block:: pycon
+
+  >>> mylist = [1, 'aita', True]
+  >>> mylist
+  [1, 'aita', True]
+
+インデックスは0から始まります。
+
+.. code-block:: pycon
+
+  >>> mylist[1]
+  'aita'
+
+インデックスに負の整数を指定すると、リストの終端から値が取り出せます。
+
+.. code-block:: pycon
+
+  >>> mylist[-1]
+  True
+
+``in`` 演算子を使うと、ある値がリストの中に存在しているか調べられます。
+
+.. code-block:: pycon
+
+  >>> 'aita' in mylist
+  True
+  >>> 4 in mylist
+  False
+
+``range`` 関数を使うと数値のリストが簡単に作れます。
+
+.. code-block:: pycon
+
+    >>> range(5)
+    [0, 1, 2, 3, 4]
+    >>> range(3, 10, 2)
+    [3, 5, 7, 9]
+
+タプル
+------
+
+値を変更できない集合です。値を変更できない以外の特性はリストと同様です。
+
+.. code-block:: pycon
+
+  >>> mytuple = (1, 2)
+  (1, 2)
+  >>> mytuple[0] = 3  # エラー
+  TypeError
+
+1要素のタプルを作るときは、後ろにカンマを入れるのを忘れないようにしましょう。
+
+.. code-block:: pycon
+
+  >>> (1)  # ただの「1」になってしまう
+  1
+  >>> (1,)
+  (1, )
+
+スライス
+----------
+
+リストやタプルや文字列の特定の範囲を切り出すことができます。
+
+.. code-block:: pycon
+
+  >>> [1,2,3,4,5][:3]  # 先頭から添字3の一つ前まで
+  [1, 2, 3]
+  >>> 'Azuma Kenta'[3:]  # 添字3から末尾まで
+  'ma Kenta'
+  >>> [1,2,3,4,5,6,7,8,9,10][1:-1:2]  # 3つ目を指定するとN個飛びで値を取り出せます。
+  [2, 4, 6, 8,]
+
+
+データ型(3)
+===========
+
+辞書
+----
+
+添え字に文字列や数値、オブジェクトを使用できる集合です。
+
+.. code-block:: pycon
+
+  >>> {'a': 10, 'b': 20}
+   {'a': 10, 'b': 20}
+  >>> {'a': 10, 'b': 20}['a']
+  10
+  >>> {'a': 10, 'b': 20}['b']
+  20
+  >>> {1: 10, 2: 20}[1]
+  >>> 20
+
+
+None
+----
+
+Noneは何もないことを表すのに使われます。
+
+.. code-block:: pycon
+
+  >>> None
+
+フォーマット文字列
+========================
+
+Cのprintfのように、文字列に外から値を入れ込むことができます。
+
+値を入れ込みたい場所に、値の型に応じたフォーマット文字列を入れておきます
+
+.. code-block:: pycon
+
+  >>> fmt_string = 'feiz is %d years old.'  # 年齢を入れる部分を%dに置き換えている
+
+値を入れるには、 ``%`` 演算子を使います。
+
+.. code-block:: pycon
+
+  >>> print fmt_string % 24
+  feiz is 24 years old.
+
+複数の値を入れる場合は、リストやタプルにします。
+
+.. code-block:: pycon
+
+  >>> '%s is %d years old' % ('aita', 24,)
+  'aita is 24 years old'
+
+また、リストやタプルの代わりに辞書を使うことも出来ます。渡した辞書のキーに対応する部分に値が入ります。
+
+.. code-block:: pycon
+
+  >>> '%(name)s told me to install %(product)s' % {'name': "bucho", 'product': "bumblebee",}
+  'bucho told me to install bumblebee'
 
    install
    reading_document
+   basic
+   statements
+   advanced
+   stdlibs
+   appendix1
+   appendix2
    problem
 
 過去のハンズオン資料

File statements.rst

+=======================
+制御構造
+=======================
+
+インデント
+----------
+
+Pythonではインデントに文法としての意味があります。多くの言語における{}にあたる構造を、インデントが揃った部分として表現します。
+
+一般的にはスペース4つでのインデントがよく使われます。
+
+.. code-block:: python
+
+    if x:
+        print x
+        print "fe"
+
+    if x:
+    print x # 文法エラー
+
+if
+------------
+
+.. code-block:: pycon
+
+  >>> x = 20
+  >>> if x == 20:
+  ...     print 'x equals 20!'
+  ... elif x > 20:
+  ...     print 'x larger than 20!'
+  ... else:
+  ...     print 'x smaller than 20!'
+
+ifの条件式部分には、カッコはあってもなくても構いません。不要な場合は書かないのがPythonらしい書き方です:)
+
+for
+---
+
+Pythonの ``for`` 文はリストやタプルの要素を順番に反復処理します。
+
+.. code-block:: pycon
+
+  >>> for x in range(3):
+  ...     print 'x = %d' % x
+  ...
+  x = 0
+  x = 1
+  x = 2
+
+``for`` 文に ``else`` 節を付けると、反復が終了した後に実行される処理を書くことができます。
+
+ただしbreakなどでループを途中で抜けた場合、else節は実行されません。
+
+.. code-block:: pycon
+
+  >>> for x in range(3):
+  ...     print 'x = %d' % x
+  ... else:
+  ...      print 'done'
+  ...
+  x = 0
+  x = 1
+  x = 2
+  done
+
+while
+----------
+
+.. code-block:: pycon
+
+  >>> x = 0
+  >>> while x < 10:
+  ...     print x,
+  ...     x += 1
+  0 1 2 3 4 5 6 7 8 9
+
+whileにもelse節が記述できます。forとは違って、whileのブロックが一度も実行されなかった場合にのみelse節のコードが実行されます。
+
+.. code-block:: pycon
+
+    >>> while False:
+    ...     print 1
+    ... else:
+    ...     print 2
+    2
+
+
+with
+-----
+
+with文は処理の終了後に必ず実行したい処理を纏めて定義することのできる構文です。
+
+ファイルオブジェクトなど、いくつかの組み込みオブジェクトは標準でwithに対応しています。
+
+.. code-block:: python
+
+    with open('xxx.txt') as f:
+        print f.read()
+
+本来openしたファイルオブジェクトはcloseメソッドを呼び出して閉じないといけませんが、with文を使えばwithブロックを抜けた時点で自動的にcloseが呼び出されます。
+
+独自にwithでの処理を定義することもできます。標準パッケージのcontextlibを使うと、簡単に記述することができます。
+
+try
+-------
+
+``try`` 節の中でエラーが発生した場合の処理を、 ``except`` 節で記述することができます。
+
+.. code-block:: pycon
+
+  >>> try:
+  ...     1 / 0  # ゼロ除算エラーが発生するコード
+  ... except:
+  ...     print "zero devide error"
+  
+``except`` に処理するエラー型を指定することで、特定のエラー専用の例外処理を書くこともできます。
+何も指定しない場合は、あらゆるエラーが処理されます。
+
+  >>> try:
+  ...     f()    # 何かの計算をする関数
+  ... except NameError:
+  ...     print "name error"
+  ... except ValueError:
+  ...     print "value error"
+  ... except ZeroDivisionError:
+  ...     print "zero devide error"
+  ... except:
+  ...     print "other error"
+
+``finally`` 節を記述すると、``try`` 節の中でエラーが発生してもしなくても、必ず実行される処理を書くことができます。
+
+.. code-block:: pycon
+
+  >>> myfile = open('torumemo.txt')
+  >>> try:
+ ...     ...
+ ... finally:
+ ...     myfile.close()
+========================================
+標準モジュール
+========================================
+
+Pythonには標準で多数のモジュールが同梱されています。あまりに数が多いため全て把握するのは大変ですが、有用なモジュールを押さえておけば開発効率は飛躍的にアップします。
+
+os
+========
+
+:document: http://www.python.jp/doc/release/library/os.html
+
+ファイルとディレクトリを扱うモジュールです。色々な機能がありますが、特に使用頻度の高い関数を紹介します。
+
+* os.path - ファイルパスをいじくる
+
+
+joinでファイルパスを繋げます。
++演算子やフォーマット文字列を使った結合と違い、不正なパスが生成されません。
+
+.. code-block:: pycon
+
+    >>> import os
+    >>> path = os.path.join('/home/bucho', 'show.jpg')
+    >>> print path
+    /home/bucho/show.jpg
+
+
+    >>> dir = '/home/bucho'
+    >>> name = 'show.jpg'
+    >>> path = dir + name
+    >>> print path
+    /home/buchoshow.jpg  # 意図しないパスになってしまう
+
+existsでファイル/ディレクトリの存在チェックを行えます。
+
+.. code-block:: pycon
+
+    >>> os.path.exists(path)
+    True
+
+dirnameでディレクトリパスが得られます
+
+.. code-block:: pycon
+
+    >>> os.path.dirname(path)
+    '/home/bucho'
+
+splitextでパスを拡張子とそれ以外に分割できます
+
+.. code-block:: pycon
+
+    >>> name, ext = os.path.splitext(path)
+    >>> print name
+    /home/bucho/show
+    >>> print ext
+    .jpg
+
+* os.walk - ファイルとディレクトリの一覧を得る
+
+検索対象パスを指定してos.walkを呼び出すと、検索パス, パスに含まれるフォルダ名のリスト, パスに含まれるファイル名のリストの3要素タプルを生成するジェネレータが返ります。
+最初に渡した検索パス以下のすべてのファイル/フォルダが再帰的に検索されます。
+
+.. code-block:: pycon
+
+    >>> import os
+    >>> for path, folders, files in os.walk('/home/bucho'):
+    ...     for file in files:
+    ...         print path + file
+    ...
+    ...
+    /home/bucho/daisuki.3gp
+    /home/bucho/hagesii.wmv
+    /home/bucho/tof.jpg
+    /home/bucho/wozozo.bmp
+    /home/bucho/.ero/show.jpg
+    /home/bucho/.ero/hide/show.jpg
+
+re
+====
+
+:document: http://www.python.jp/doc/release/library/re.html
+
+正規表現を扱うモジュールです。
+
+正規表現内ではバックスラッシュが頻出するため、raw文字列(r'')を使って記述するのが良いでしょう。
+
+正規表現にマッチするとMatchObjectが返ります。
+
+.. code-block:: pycon
+
+    >>> import re
+    >>> match_obj = re.search(r'(\d+)$', 'aita255')
+    >>> print match_obj.group(1)
+    255
+
+何度もマッチングを繰り返す場合は、コンパイル済み正規表現オブジェクトを使うことで負荷を軽減することも出来ます。
+
+.. code-block:: pycon
+
+    >>> compiled = re.compile(r'(\d+)$')
+    >>> compiled.search(...
+
+pdb
+===
+
+:document: http://www.python.jp/doc/release/library/pdb.html
+
+pythonのデバッガです。
+
+set_traceを実行すると、コードの実行を途中で停止し、デバッグ用のプロンプトが表示されます。実際に動作している時のコードの状態を確認できるため、非常に有用です。
+
+.. code-block:: pycon
+
+    >>> import pdb;pdb.set_trace()
+    >>> if xxx == yyy:
+    ...     zzz = True
+    ...
+
+上記のコード例の1行目が実行されると、実行が一旦停止されてpdbのプロンプトが表示されます。
+
+プロンプト上では通常のインタプリタと同じようにコードを実行できるほか、停止させている実行を1行分進める/実行中のコードを表示する/強制終了するなどの操作が行えます。
+
+:n: 実行を1行分だけ進めます。
+:c: pdbを終了し、スクリプトの実行を再開します。
+:q: スクリプトの実行を強制的に終了します。
+:s: 実行しようとしている関数の内部に進みます。
+
+datetime
+========
+
+:document: http://www.python.jp/doc/release/library/datetime.html
+
+日付と時刻のデータを扱うモジュールです。
+
+.. code-block:: pycon
+
+    >>> from datetime import datetime
+    >>> datetime.now()
+    datetime.datetime(2011, 10, 15, 9, 41, 00, 000000)
+
+    >>> gantan = datetime(2012, 1, 1, 0, 0, 0)
+    >>> gantan.year
+    2012
+
+日付のみを扱うdateもあります。
+
+.. code-block:: pycon
+
+    >>> from datetime import date
+    >>> date.today()
+    datetime.date(2011, 10, 15)
+
+
+timedeltaを使うと、日付/時間の加減算ができます。
+
+.. code-block:: pycon
+
+    >>> from datetime import datetime, timedelta
+    >>> dt = datetime.now()
+    >>> dt
+    datetime.datetime(2011, 10, 15, 9, 41, 00, 000000)
+    >>> dt + timedelta(days=3)
+    datetime.datetime(2011, 10, 18, 9, 41, 00, 000000)
+
+
+random
+======
+
+:document: http://www.python.jp/doc/release/library/random.html
+
+乱数を生成します。
+
+random関数は0〜1の範囲の小数をランダムに返します。
+
+.. code-block:: pycon
+
+    >>> import random
+    >>> random.random()
+    0.6130030617573102
+    >>> random.random()
+    0.038878091500788026
+
+randint関数は第一引数**以上**、第二引数**以下**の整数値をランダムに返します。
+
+.. code-block:: pycon
+
+    >>> random.randint(1, 10)
+    6
+    >>> random.randint(1, 10)
+    3
+    >>> random.randint(1, 10)
+    1
+    >>> random.randint(1, 10)
+    8
+    >>> random.randint(1, 10)
+    10
+
+urllib, urllib2
+===============
+
+:document: http://www.python.jp/doc/release/library/urllib2.html , http://www.python.jp/doc/release/library/urllib.html
+
+URLを開くモジュールです。2.x系ではurllibとurllib2が混在していますが、urllib2の方が色々と優れているため、こちらを利用するのがよいでしょう。
+
+urllib2.urlopenに対象URLを渡して呼び出すと、コンテンツが格納されたfile-like objectが返ります。
+
+.. code-block:: pycon
+
+    >>> import urllib2
+    >>> result = urllib2.urlopen('http://www.beproud.jp/')
+    >>> print result.read()  # file-like objectなのでreadで読み出します。
+    <!DOCTYPE html>
+    <html>
+        <head>
+            <title>HOME | 株式会社ビープラウド</title>
+            <meta http-equiv="Content-Language" content="ja" />
+            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+            <meta name="description" content="株式会社ビープラウド Be PROUD [IT High Technology &amp; Human Centric Company]" />
+            ...
+
+
+urlopenのdata引数にapplication/x-www-form-urlencoded形式の文字列を渡すと、POSTリクエストとなります。
+
+app...endoced形式の文字列は、urllib.urlencode関数で簡単に生成することができます。
+
+.. tip::
+
+    urlencode関数は**urllib**モジュールの関数です。
+
+.. code-block:: pycon
+
+    >>> import urllib, urllib2
+    >>> post_data = urllib.urlencode({
+            'name': 'spam',
+        })
+    >>> result = urllib2.urlopen('http://aita.jp/tabetai/', data=post_data)
+
+
+エラーはHTTPError例外としてraiseされます
+
+.. code-block:: pycon
+
+    >>> result = urllib2.urlopen('http://www.beproud.jp/bucho.ero')
+    HTTPError: HTTP Error 404: Not Found
+
+openerオブジェクトを作成し、ハンドラの設定を行うことで様々な形式でのリクエストが可能です。
+
+.. code-block:: pycon
+
+    >>> # ベーシック認証のハンドラを追加します
+    >>> basic_auth = urllib2.HTTPBasicAuthHandler("Bucho's secret folder", "http://www.beproud.jp/bucho.ero/", 'bucho', 'show')
+    >>> opener = urllib2.build_opener(basic_auth)
+    >>> result = opener.open('http://www.beproud.jp/bucho.ero/')
+
+json
+====
+
+:document: http://www.python.jp/doc/release/library/json.html
+
+
+jsonを扱うモジュールです。urllib2との組み合わせで使われることが多いかと思います。
+
+json.loadsにjson文字列を渡すと、Pythonのオブジェクトにマッピングされます。
+
+.. code-block:: pycon
+
+    >>> import json
+    >>> aita = json.loads('''{
+            "result": {
+                "organization": "BeProud inc",
+                "age": 24,
+                "name": "aita",
+                "like": [
+                    "onigiri",
+                    "hamburger",
+                    "gyudon",
+                    "oomori"
+                ]
+            }
+        }''')
+    >>> aita['result']['like']
+    [u'onigiri', u'hamburger', u'gyudon', u'oomori']
+
+
+json.dumpsにリストや辞書オブジェクトを渡すとjson文字列を返してくれます。
+
+.. code-block:: pycon
+
+    >>> json.dumps({
+            'result': {
+                'name': 'aita',
+                'organization': 'BeProud inc',
+                'age': 24,
+                'like': ['onigiri', 'hamburger', 'gyudon', 'oomori']
+            }
+        })
+    '{"result": {"organization": "BeProud inc", "age": 24, "name": "aita", "like": ["onigiri", "hamburger", "gyudon", "oomori"]}}'