naobe @ ウィキ
python
最終更新:
Bot(ページ名リンク)
-
view
言語に戻る
対象バージョン
3.3
インストール
- http://www.python.org/download/からPython 3.3.1 bzipped source tarball (for Linux, Unix or Mac OS X)を選択しダウンロード
- 解凍
- configure, make, make install
- tkinterが動かない。さんざん悩んで、原因はtcl/tkのdevelがないこととわかる。yumを使ってdevelをインストール
- sudo python setup.py install
tkinterは、pythonとは別にインストールしなければならないと思い込み、tkinterのダウンロードサイトを探し続けていた。python3.3の中にあるとは知らなかった。
比較操作
比較操作間に優先順位はない。比較演算子は算術演算子、ビット演算子、シフト演算子より優先順位は低い。
要素が数値なら大小を比較する。要素がバイトなら数値に変換して大小を比較する。要素が文字ならUTFコードを数値に変換して大小を比較する。
要素の型が異なると、例外を発生する場合がある。int型と文字型の比較はNG。
要素が数値なら大小を比較する。要素がバイトなら数値に変換して大小を比較する。要素が文字ならUTFコードを数値に変換して大小を比較する。
要素の型が異なると、例外を発生する場合がある。int型と文字型の比較はNG。
項目 | 説明 |
---|---|
a < b | |
a > b | |
a < b < c | |
a == b | |
a >= b | |
a <= b | |
a != b | |
a is [not] b | notなしのとき、aとbが同じオブジェクトのときTrue |
a [not] in b | notなしのとき、aがbの要素ならTrue。 |
フロー制御
if
条件がTrueなら行を実行する。
if 条件: 行 (elif 条件: 行)* [else 行]
while
条件がTrueの間、行を実行する。
while 条件: 行 [break] [continue] [else: 行]
- 条件がfalseになると、elseを実行して終了する。
- breakを実行すると、elseを実行しないでループを抜ける。
- continueを実行すると、ループの先頭に戻る
for
リストの項目をターゲットリストに順次、代入して行を処理する。
for ターゲットリスト in リスト: 行 [break] [continue] [else: 行]
- リストがなくなると、elseを実行する
- breakを実行すると、elseを実行しないでループを抜ける。
- continueを実行すると、ループの先頭に戻る
ステートメント
ver.3から関数に移行。()が必要
書式 | 説明 |
---|---|
print x,y | x,yを標準出力に出力する。xとyの間には空白が入る。改行を出力する。 |
print x,y, | x,yを標準出力に出力する。xとyの間には空白が入る。改行を出力しない。 |
print フォーマット文字列 % タプル | C言語のprintf文と同じ。【例】print "%s...%s" % (x,y) |
print >> f,x,y | ファイルfに、x,yを出力する |
組込オブジェクト
importしないで使えるオブジェクト
組込オブジェクトの型
オブジェクトの型 | 例 |
---|---|
数値 | 23,3.14,999L,3+4j,Decimal |
文字列 | 'abcd',"efgh" |
リスト | [1,[2,3],4] |
ディクショナリ | {'k1':'v1', 'k2':'v2} |
タプル | (1,'a', 2,'b') |
ファイル | myfile = open('f1', 'r') |
その他 | set, type, None, bool |
文字列(stringオブジェクト)
シーケンスオブジェクト。不変オブジェクト(値を変えることができない)
項目 | 説明 |
---|---|
結合 | 文字列+文字列【例】a='aaa';b='bbb';c=a+b。cは'aaabbb'になる。 |
splice | 位置を指定して部分を抽出する。a[n:m]でnからm-1までを抽出する。【例】a = 'abcde';print a[1:3]は、'bc'を出力する。 |
分割 | a.split(sep)でsepを元に分割した配列を作成する。 |
トリム | a.rstrip().lstrip() |
トリプルクォーテーション
シングルクォートまたはダブルクォート3個使って文字列を囲む。複数の行にまたがって文字列を指定できる。内部の改行は、文字列に含まれる。内部にシングルクォート、ダブルクォートを書いても良い(\を追加する必要がない)。
リスト
配列と同等のもの。可変オブジェクト。
項目 | 説明 |
---|---|
作成 | a = [1,2,3,4,5]でリストaを作成する。要素はオブジェクト。a = []で空リスト作成。 |
要素の追加 | a[5] = 6 or a.append(6)。 |
要素の挿入 | a.insert(位置,要素) 【例】a.insert(0,0)。aは[0,1,2,3,4,5,6]になる。 |
抽出 | s[i:j:k] iからjまでステップkで抽出。 |
削除と抽出 | a.pop(位置)。位置を指定しないと、最後尾を指定したことになる。 |
削除 | del s[i:j] iからj-1までの要素を削除 |
ソート | a.sort() a.reverse()。sortは昇順。reverseは逆順。 |
splice | 文字列と同様 |
要素の個数 | len(list) |
要素のインデックス | a.index(要素) |
インデックス配列の作成 | range(配列) |
インデックスと要素配列の作成 | enumerate(配列)。【例】for i, t in enumerate(arry) |
内包
演算結果を配列の要素に設定する。記述がシンプルになる。
a = "a b c d e f" b = [t for t in a.split(" ") if t]
ファイルオブジェクト
組み込み関数openによって返されるファイルを表すオブジェクト。
メソッド | 説明 |
---|---|
read([size]) | ファイルからsizeバイト読み込んで文字列オブジェクトを返す。sizeがないときはファイルの最後まで読み込む。EOFを読み込むと空の文字列を返す。バイナリモードのときは空のbytesオブジェクト(if len(data) == 0で判定)。 |
ディクショナリ
perlのハッシュ。
項目 | 説明 |
---|---|
作成 | a = {'key1':'val1', 'key2':'val2'}でディクショナリaを作成する。a = []で空リスト作成。 |
要素の追加 | a['key3'] = 6 |
要素の削除 | del d[key] |
要素の個数 | len(a) |
要素の存在確認 | if key in dict:存在。if not key in dict:存在しない |
関数
定義
defを使って定義する。
def func(a,b): return a *b print func(2,10)
【実行結果】
20
オブジェクトの参照渡し
引数にオブジェクトを渡すと参照が渡される。関数内でオブジェクトを操作すると、関数から戻った後も操作の結果は残る。
def func2(a): a.pop() a = [0,1,2,3,4,5] func2(a) print a
【実行結果】
[0, 1, 2, 3, 4]
オブジェクトとの関係
関数はオブジェクトとして扱われる。関数を変数(オブジェクト)に代入すると、関数の参照が渡され、変数を使って関数を実行できる。また関数の引数に関数を使用できる。
def func(a,b): return a *b a = func print a(10,20)
【実行結果】
200
組込関数
モジュールを指定しないで使える関数のこと。
項目 | 書式 | 説明 |
---|---|---|
help | help(target)。 | ヘルプを表示する。targetには、取り込んでいるオブジェクトを指定する。 |
クラス
class クラス名でクラスを定義する。クラス(親クラス)とすると親クラスを継承したクラスを記述する。__init__はコンストラクタ。メソッドの最初の引数は、selfを指定する。クラス変数は、前もって定義しない。
class Person: BASE_SALARY = 10000 def __init__(self, name): self.name = name def getSalary(self): return self.BASE_SALARY class Engineer(Person): def getSalary(self): return self.BASE_SALARY * 2 john = Person("john") print john.name print john.getSalary() print tom = Engineer('tom') print tom.name print tom.getSalary()
【実行結果】
john
10000
john
10000
tom
20000
20000
モジュール
.pyという拡張子を持ったファイル。
importを使ってモジュールをロードする。モジュールの属性を使うには、モジュール.属性とする。ファイルの拡張子は使わない。モジュールの中にクラス、関数、変数がある。
from モジュール import 属性とすると、モジュールを指定しなくて良い。
【例】
otherモジュールをロードして、bという変数を使用する。
importを使ってモジュールをロードする。モジュールの属性を使うには、モジュール.属性とする。ファイルの拡張子は使わない。モジュールの中にクラス、関数、変数がある。
from モジュール import 属性とすると、モジュールを指定しなくて良い。
【例】
otherモジュールをロードして、bという変数を使用する。
import other a = other.b from other import b a = b
モジュールは、モジュールサーチパスにあればロード可能。モジュールサーチパスは、sys.pathを参照する。環境変数PYTHONPATHを設定するとモジュールサーチパスにPYTHONPATHを追加する。
[suna@athlon4 python]$ export PYTHONPATH=~suna/language/python [suna@athlon4 python]$ python Python 2.4.3 (#1, Jan 9 2013, 06:49:54) [GCC 4.1.2 20080704 (Red Hat 4.1.2-54)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path ['', '/home/suna/language/python', '/usr/lib/python24.zip', '/usr/lib/python2.4', '/usr/lib/python2.4/plat-linux2', '/ usr/lib/python2.4/lib-tk', '/usr/lib/python2.4/lib-dynload', '/usr/lib/python2.4/site-packages', '/usr/lib/python2.4/s ite-packages/Numeric', '/usr/lib/python2.4/site-packages/gtk-2.0'] >>>
パッケージ
ディレクトリがパッケージ。モジュールを整理するために使用する。パッケージディレクトリには、__init__.pyを作成する。__init__.pyは空でかまわない。__init__.pyにはパッケージに関連する初期処理(ファイル作成、DB接続等)を記述する。モジュールをimportしたときに__init__.pyを実行する。
__name__属性
モジュールファイルを実行したときに__main__が設定される。ファイルの最後に以下の記述をすれば、importモジュールとしても実行モジュールとしても使用できる。
if __name__ == '__main__': 実行するステートメント
モジュールとメソッド
モジュール | オブジェクト | メソッド | 説明 |
---|---|---|---|
commands | 関数オブジェクト | getoutput(command) | コマンドを実行し、結果を返す。 |
(status, output) = getstatusoutput(command) | コマンドを実行し、ステータスと結果を返す。 | ||
re | 関数オブジェクト | compile(pattern[,flags]) | 正規表現パターンを使って正規表現オブジェクトを作成する。pattern:正規表現パターン。flags:re.I(大文字、小文字を区別しない),re.L(\w,\W,\b\Bを現在のロケールに合わせる。)、他はリファレンス参照。複数のフラグを適用するときは、ビット論理和(|)を使う |
正規表現オブジェクト | match(string) | stringが正規表現パターンにマッチしているときはマッチオブジェクトを返す。マッチしない場合は、Noneを返す | |
sub(repl, str) | マッチしたパターンを使って対象文字列を書き換える。repl:書き換える文字列。後方参照文字(\1,\2,..)を使用できる。str:対象文字列 | ||
io | ファイルオブジェクト | ||
用語
項目 | 内容 |
---|---|
シーケンス | 要素が順番に並んだオブジェクト。【例】文字列、リスト、タプル |
タプル | 不変なリスト。a = (0,1,2)とすると、a[1] = 2とするとエラー。 |
正規表現
文字列が正規表現パターンに一致するか判定する
#!/bin/env python # -*- coding:utf-8 -*- import re m = re.compile('a{3}b{3}') if m.match('aaabbb') : print "match" else: print "unmatch"
matchを出力する。
一致する部分を使って書き換える
#!/bin/env python # -*- coding:utf-8 -*- import re m = re.compile(r'key1:([0-9]+)\skey2:([0-9]+)') print m.sub(r'val2:\2, val1:\1', 'key1:100 key2:200') [foo@athlon4 python]$ ./t1.py val2:200, val1:100
エンコーディング
項目 | 説明 |
---|---|
utf-8 | |
cp932 |
その他
項目 | 内容 |
---|---|
pydoc | pydoc target。オンラインヘルプ。UNIXのmanコマンドのようなもの。 |
標準入力 | |
ドキュメンテーション文字列 | |
モジュールサーチパス | sys.pathがモジュールサーチパス。import sys; print sys.path |
引数の取得 | sys.argvが引数のリスト |
python2からpython3への変換 | 2to3.py -w スクリプトファイル。元のファイルは.bak。 |
サンプルプログラム
ファイルを読んで出力
""" CSVファイルを読み込み、項目に分解する """ # ディレクトリ DIR = "C:/Users/suna/Dropbox/programs/python/" """ 行を項目に分解 @param line 行 @return 項目のリスト """ def parseLine(line): # カンマで分解 terms = line.split(",") # 返却するリスト list = [] for term in terms: # 先頭と、最後の空白を削除 term = term.strip() term = term.rstrip() list.append(term) return list """ main """ f = open(DIR+"a.csv", "r") while True: # ファイルから1行読み込み line = f.readline() # コメントは飛ばす if line[0:1] == "#": continue # EOFに到達したら終了 if not line: break; # 改行を削除 line = line[:-1] # 項目に分解 terms = parseLine(line) # リストのサイズ size = len(terms) # リストからインデックス、項目を順次取得 for i, t in enumerate(terms): # 改行なし出力 if i == size - 1: print("%s" % (t), end='') else: print("%s," % (t), end='') print() f.close()
ディレクトリを巡回してサイズの大きいファイルを取得する
#!/usr/local/bin/python3 # -*- coding:utf-8 -*- from os import walk from os.path import getsize, islink, join """ 指定したディレクトリ下のファイルを順次求め、 サイズの大きい順にファイルを格納する """ def findBigFile(topdir, size): MAX_FILE = size filelist = [] for dirpath, dirs, files in walk(topdir): for dir in dirs: # シンボリックリンクなら削除 abspath = join(dirpath, dir) if islink(abspath): dirs.remove(dir) # procは削除 if dir == 'proc': dirs.remove(dir) for file in files: abspath = join(dirpath, file) # リンクでないならファイルリストに保管 if not islink(abspath): filelist.append((getsize(abspath), abspath)) # サイズが大きいものを最大10個保管 if len(filelist) > MAX_FILE: filelist.sort(key=lambda file: file[0], reverse=True) filelist = filelist[:MAX_FILE] return filelist if __name__ == '__main__': filelist = findBigFile('/', 20) """ 求めたファイルを出力する """ for size, filename in filelist: print("file name: %s, size: %d" % (filename, size/1000))
ファイルの16進ダンプ出力
#!/usr/local/bin/python3 """ ファイル16進ダンプ """ from sys import argv from struct import unpack import sys write = sys.stdout.write """ blockバイトを16進で出力する """ def printBlock(block): # HEXAでデータ表示 for b in block: write( "%02x " % b) # データがブロックサイズ以下なら空白を表示 for i in range(BLOCK_NUM - len(block)): write( " " ) # ASCIIで表示 for b in block: if 32 <= b <= 126 : byte = chr(b) else: byte = '.' write( "%s" % byte) # 定数 BLOCK_NUM = 16 # ファイル名 fname = argv[1] f = open(fname, 'rb') write("\n") addr = 0 while True: block = f.read(BLOCK_NUM) if len(block) == 0: break # アドレス出力 write( "%07d " % addr) # データ出力 printBlock(block) write("\n") addr += BLOCK_NUM
ファイル書き込み
f = open("aaa.txt", "w") print("aaa", file=f) print("bbb", file=f) print("ccc", file=f) f.close()