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。

項目 説明
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を実行すると、ループの先頭に戻る

ステートメント

print

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

tom
20000

モジュール

.pyという拡張子を持ったファイル。
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()
人気記事ランキング
ウィキ募集バナー