「Python」の版間の差分
提供: Wikinote
細 (→ファイルか標準入力から読む) |
細 (→getopt) |
||
行165: | 行165: | ||
どの言語でもこいつだけはテンプレート化する必要がある。。 | どの言語でもこいつだけはテンプレート化する必要がある。。 | ||
− | |||
import sys | import sys | ||
import getopt | import getopt | ||
行192: | 行191: | ||
for arg in args: # remainder | for arg in args: # remainder | ||
... | ... | ||
− |
2015年5月10日 (日) 09:05時点における版
かなり忘れつつある Python について。
目次
参考リンク
- Python 2.5 ドキュメント - 19th September, 2006
- Python 講習会 資料 ― 古いけど、まとまっていて見やすい。
覚え書き
- グローバル変数など、外側のスコープにある変数は読み出し専用となる。
global
文を使えば代入できる。 - 一定時間待ちを入れる場合は、
import time
してtime.sleep(n)
を使う。 - gzip コマンドで圧縮したデータを zlib モジュールでは展開できない (ヘッダが異なるため)。gzip + StringIO モジュールを使って回避する。
- 対話モードでは、最後に表示された結果は変数
_
に代入される。 -
print
の末尾にコンマを入れると、改行されない。print "hoge",
- 一つの要素のタプルは、値の後ろにコンマを付ける。
("hoge",)
- 複数の比較演算子を
a < b == c
のように書ける素晴らしい言語。 -
print >> sys.stderr, ...
で標準エラーに出力
文字列
- シングルクォートとダブルクオートに違いはない。
- エスケープシーケンスを無視する場合は raw 文字列を使う。
r"raw 文字列\n"
- エスケープシーケンスを無視する場合は raw 文字列を使う。
- 三重クォート """ あるいは ''' は改行をそのまま含めることができる。
- 連結は + 演算子を用いる。
- 文字列リテラルは、列記で連結可能。
"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]]
モジュールに定義された名前のリスト
dir 関数を使う。(忘れやすい)
>>> dir() ['__builtins__', '__doc__', '__name__', '__package__'] >>> import time >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'time'] >>> dir(time) ['__doc__', '__file__', '__name__', '__package__', 'accept2dyear', 'altzone', 'asctime', 'clock', 'ctime', 'daylight', 'gmtime', 'localtime', 'mktime', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'timezone', 'tzname', 'tzset']
socket の setsockopt() を使う
- SO_KEEPALIVE の場合
import socket s = socket.socket() s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
- SO_LINGER の場合
import socket import struct s = socket.socket() s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 30))
テンプレート
awk 風 Python スクリプトテンプレート
テキスト処理を何でもかんでも簡単な awk で済ませちゃうクセがついてしまったので、 自分に Python を使うように仕向けるための awk 風テンプレート。
FS, NR, FILENAME, FNR, NF, s[0], s[1..NF] が利用可能。
#!/usr/bin/env python import sys if len(sys.argv) == 1: files = [ sys.stdin ] else: files = [ open(f) for f in sys.argv[1:] ] ### BEGIN { FS = None ### } NR = 0 for file in files: FNR = 0; FILENAME = file.name for line in file: NR += 1; FNR += 1 s = line.split(FS) s[0:0] = [ line[:-1] ] NF = len(s) # print NR, FILENAME, FNR, NF, s ### { ### } ### END { ### }
ファイルか標準入力から読む
ファイルが指定されれば、それらをすべて処理し、指定されなければ標準入力から読む。
import sys if len(sys.argv) == 1: files = [ sys.stdin ] else: files = [ open(f) for f in sys.argv[1:] ] for file in files: ...
- fileinput モジュール というのがあった…
getopt
どの言語でもこいつだけはテンプレート化する必要がある。。
import sys import getopt def usage(exit_code): out = (exit_code and sys.stderr) or sys.stdout print >> out, '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 ...