##
6 シーケンス型

組み込み型には 6 つのシーケンス型があります: 文字列、ユニコード文字列、 リスト、タプル、バッファ、そして xrange オブジェクトです。

文字列リテラルは `'xyzzy'`、`"frobozz"` といったように、 単引用符または二重引用符の中に書かれます。 文字列リテラルについての詳細はは、 Python リファレンスマニュアル の第 2 章を読んで下さい。 Unicode 文字列はほとんど文字列と同じですが、`u'abc'` 、 `u"def"` といったように先頭に文字 "`u`" を付けて 指定します。 リストは `[a, b, c]` のように要素をコンマで区切り角括弧で 囲って生成します。タプルは `a, b, c` のようにコンマ演算子で 区切って生成します (角括弧の中には入れません)。 丸括弧で囲っても囲わなくてもかまいませんが、空のタプルは `()` のように丸括弧で囲わなければなりません。 要素が一つのタプルでは、例えば `(d,)` のように、要素の後ろに コンマをつけなければなりません。

バッファオブジェクトは Python の構文上では直接サポートされていませんが、 組み込み関数 `buffer()` で生成することができます。バッファオブジェクトは結合や反復をサポート していません。

xrange オブジェクトは、オブジェクトを生成するための特殊な構文がない 点でバッファに似ていて、関数 `xrange()`で生成します。 xrange オブジェクトはスライス、結合、反復をサポートせず、 `in` 、 `not in` 、`min()` または `max()` は効率的ではありません。

ほとんどのシーケンス型は以下の演算操作をサポートします。"`in`" および "`not in`" は比較演算とおなじ優先度を持っています。 "`+`" および "`*`" は対応する数値演算とおなじ優先度です。 8

以下のテーブルはシーケンス型の演算を優先度の低いものから順に挙げたものです (同じボックス内の演算は同じ優先度です)。テーブル内の s および t は同じ型のシーケンスです; n、i および j は整数です:

演算 | 結果 | 注釈
--- | --- | ---
`x in s` | s のある要素 x と等しい場合 `True` 、そうでない場合 `False` | (1)
`x not in s` | s のある要素が x と等しい場合 `False` 、そうでない場合 `True` | (1)
`s + t` | s および t の結合 | (6)
`s * n , n * s` | s の浅いコピー n 個からなる結合 | (2)
`s[i]` | s の 0 から数えて i 番目の要素 | (3)
`s[i:j]` | s の i 番目から j 番目までのスライス | (3), (4)
`s[i:j:k]` | s の i 番目から j 番目まで、k 毎のスライス | (3), (5)
`len(s)` | s の長さ |
`min(s)` | s の最小の要素 |
`max(s)` | s の最大の要素 |

注釈:

(1)
  s が文字列または Unicode 文字列の場合、 演算操作 `in` および `not in` は部分文字列の一致テスト と同じように動作します。バージョン 2.3 以前の Python では、 x は長さ 1 の文字列でした。Python 2.3 以降では、x はどの長さでもかまいません。

(2)
  n が `0` 以下の値の場合、`0` として 扱われます (これは s と同じ型の空のシーケンスを表します)。 コピーは浅いコピーなので注意してください; 入れ子になったデータ 構造はコピーされません。これは Python に慣れていないプログラマを よく悩ませます。例えば以下のコードを考えます:

      >>> lists = [[]] * 3
      >>> lists
      [[], [], []]
      >>> lists[0].append(3)
      >>> lists
      [[3], [3], [3]]

  上のコードでは、 `lists` はリスト `[[]]` (空のリストを唯一の 要素として含んでいるリスト) の3つのコピーを要素とするリストです。 しかし、リスト内の要素に含まれているリストは各コピー間で共有されています。 以下のようにすると、異なるリストを要素とするリストを生成できます: 上のコードで、`[[]]` は空のリストを要素として含んでいるリストですから、 `[[]] * 3` の3つの要素の全てが、空のリスト（への参照）になります。 `lists` のいずれかの要素を修正することでこの単一のリストが変更されます。以下のようにすると、異なる個別のリストを生成できます:

      >>> lists = [[] for i in range(3)]
      >>> lists[0].append(3)
      >>> lists[1].append(5)
      >>> lists[2].append(7)
      >>> lists
      [[3], [5], [7]]

(3)
  i または j が負の数の場合、インデクスは文字列の 末端からの相対インデクスになります: `len(s) + i` または `len(s) + j` が代入されます。 しかし `-0` は `0` のままなので注意してください。

(4)
  s の i から j へのスライスは `i <= k < j` となるようなインデクス k を持つ要素からなるシーケンスとして定義されます。i または j が `len(s)` よりも大きい場合、`len(s)` を使います。 i が省略された場合、`0` を使います。 j が省略された場合、`len(s)` を使います。 i が j 以上の場合、スライスは空のシーケンスになります。

(5)
  s の i 番目から j 番目まで k 毎のスライスは、 1#1 となるような、 インデクス`x = i + n*k` を持つ要素からなる シーケンスとして定義されます。言い換えるとインデクスは `i`、`i+k`、`i+2*k`、`i+3*k` などであり、j に達したところ（しかし j は含みません）でストップします。 i または j が `len(s)` より大きい場合、`len(s)` を使います。i または j を省略した場合、``最後'' (k の符号に依存)を示す値を使います。k はゼロにできないので 注意してください。

(6)
  s と t の両者が文字列であるとき、CPythonのような実装では、 `s=s+t` や `s+=t`という書式で 代入をするのにin-place optimizationが働きます。このような時、最適化は二乗の実行時間の低減をもたらします。この最適化はバージョンや実装に依存します。実行効率が必要なコードでは、バージョンと実装が変わっても、直線的な連結の実行効率を保証する`str.join()` を使うのがより望ましいでしょう。 バージョン 2.4 で 変更 された仕様: 以前、文字列の連結はin-placeで再帰されませんでした

#### Footnotes

... は対応する数値演算とおなじ優先度です。8
  パーザが被演算子の型を識別できるようにするために、このような優先度でなければならないのです。