「Python」の版間の差分

提供: Wikinote
移動: 案内検索
(スライス)
(リスト)
行48: 行48:
 
  a = a + [6, 7]  # 連結 → [0, 5, 6, 7]
 
  a = a + [6, 7]  # 連結 → [0, 5, 6, 7]
 
  a = a * 2      # 連続 → [0, 5, 6, 7, 0, 5, 6, 7]
 
  a = a * 2      # 連続 → [0, 5, 6, 7, 0, 5, 6, 7]
 +
 +
* [http://www.python.jp/doc/2.5/tut/node7.html 5. データ構造]
  
 
== その他 ==
 
== その他 ==

2010年9月9日 (木) 00:18時点における版

かなり忘れつつある Python について。

参考リンク

覚え書き

  • グローバル変数など、外側のスコープにある変数は読み出し専用となる。global 文を使えば代入できる。
  • 一定時間待ちを入れる場合は、import time して time.sleep(n) を使う。
  • gzip コマンドで圧縮したデータを zlib モジュールでは展開できない (ヘッダが異なるため)。gzip + StringIO モジュールを使って回避する。

文字列

  • シングルクォートとダブルクオートに違いはない。
    • エスケープシーケンスを無視する場合は raw 文字列を使う。r"raw 文字列\n"
  • 三重クォート """ あるいは ''' は改行をそのまま含めることができる。
  • 連結は + 演算子を用いる。
    • 文字列リテラルは、列記で連結可能。"ho" "ge" → "hoge"
  • len() 組み込み関数でバイト数を得る。
    • マルチバイトを考慮した文字数は len(str.decode("UTF-8")) で得ることができる。
  • in で包含判定ができる
  • int(str) で整数に変換。第 2 引き数で基数指定可能。

スライス

文字の間に添字を置くとわかりやすい。

s = "H e l l o"
    0 1 2 3 4 5
  - 5 4 3 2 1   ← ここは -0 でないことに注意!! (0 = -0 のため)

s[1]   → 'e'
s[:3]  → 'Hel' # 先頭 3 文字
s[3:]  → 'lo'
s[-4]  → 'e'
s[-3:] → 'llo' # 末尾 3 文字
s[:-1] → 'Hell' # 最後の 1 文字を削る (改行削りに有用)
s[:]   → コピーを作る

リスト

書くのが面倒なくらい柔軟性に富んだデータ型である。

  • 変更可能 (mutable)
  • 入れ子可能 (リストの要素をリストにできる)
  • 文字列と同様のスライス表現で操作できる。
  • len() でリストの長さを得る。
a = []          # 初期化、クリア
a = [0, 3, 5]
a[1:1] = [1, 2] # 挿入 → [0, 1, 2, 3, 5]
a[1:4] = []     # 削除 → [0, 5]
a = a + [6, 7]  # 連結 → [0, 5, 6, 7]
a = a * 2       # 連続 → [0, 5, 6, 7, 0, 5, 6, 7]

その他

リストを N 分割する

ちょうど N 個に分割するわけではなく、最大で N 個なので注意。

def split_list(list, n):
    l = len(list)
    size = l / n + (l % n > 0)
    return [ list[i:i+size] for i in range(0, l, size) ]

こんな感じで分割したリストのリストになる。

>>> l = [1,2,3,4,5,7,8,9,10]
>>> split_list(l, 2)
[[1, 2, 3, 4, 5], [7, 8, 9, 10]]
>>> split_list(l, 3)
[[1, 2, 3], [4, 5, 7], [8, 9, 10]]
>>> split_list(l, 4)
[[1, 2, 3], [4, 5, 7], [8, 9, 10]]
>>> split_list(l, 5)
[[1, 2], [3, 4], [5, 7], [8, 9], [10]]

テンプレート

ファイルか標準入力

ファイルが指定されれば、それらをすべて処理し、指定されなければ標準入力から読む。

import sys

if len(sys.argv) == 1:
    files = [ sys.stdin ]
else:
    files = [ open(f) for f in sys.argv[1:] ]

for file in files:
    ...

getopt

どの言語でもこいつだけはテンプレート化する必要がある。。

ソースコード <toggledisplay>

import sys
import getopt

def usage(exit_code):
    print "Usage: %s [-a] [-b str]" % sys.argv[0]
    sys.exit(exit_code)

try:
    opts, args = getopt.getopt(sys.argv[1:], "ab:h")
except getopt.GetoptError:
    usage(1)

(opt_a, opt_b) = (False, None) # defaults
for (opt, val) in opts:
    if opt == "-a":
        opt_a = True
    elif opt == "-b":
        opt_b = val
    elif opt == "-h":
         usage(0)
    else:
         usage(1)

for arg in args: # remainder
    ...

</toggledisplay>