投稿者「admin」のアーカイブ

例外処理(try, except, finally)

例外の捕捉

try:
  # 例外が発生する可能性のある処理
except: #例外すべて
  # 例外発生時の処理

例外オブジェクトの指定

try:
  # 例外が発生する可能性のある処理
except HogeError as e: #HogeErrorの捕捉
  # 例外発生時の処理

例外に捕捉されなかったら else

try:
  # 例外が発生する可能性のある処理
except:
  # 例外発生時の処理
else:
  # 例外発生しなかったら

tryの後ろに書くのとほぼ同等だが、try~exceptで保護したいコードを間違って捕捉するということを避けられるので、保護したいコードと明示的に分離するのにelse節に書くほうがよい。

例えば、

try:
  処理A
  # 処理B?
except:
  例外処理X
else:
  処理B

と書いた場合に、処理Aの次の行に処理Bを書けば、例外が発生したときは処理A→例外処理Xとなり、例外が発生しなかったときは処理A→処理Bとなり同じような動作になると考えられる。しかし処理Bで例外が発生した場合に違いがでる。上記の例では処理Bで例外が発生した場合、捕捉されていない例外としてジャンプすることになるが、処理Aの次の行に書いた場合は例外処理Xが動いてしまう。処理Aの例外処理をするつもりが処理Bの例外処理をすることになる。

コードによる例外の発生 raise

try:
  raise NameError('Foo'(  #NameErrorを引数'Foo'で創出
except NameError as ne:
  print "Name Error! " + ne.args[0]

発生してもしなくて必ず通る処理 finally

try:
  #例外発生するかもしれない処理
finally:
  #例外発生してもしなくても通る処理

改行せずにprint

python3の場合

print関数のendを指定すればよい。

#python3
print("aaa", end="")
print("bbb", end="")

=> aaabbb

python2の場合

print “”の後にカンマをつけると改行はつかないが空白が入る。

#python2
print "aaa",
print "bbb",

=> aaa bbb

__future__モジュールのprint_functionをインポートする。
__future__モジュールはpython3の機能を使用できる。print_functionでprint文ではなくpython3相当のprint関数が使える。

#python2
from __future__ import print_function

print("aaa", end="")
print("bbb", end="")

=> aaabbb

sys.stdout標準出力ファイルオブジェクトを使用する。

#python2
import sys

sys.stdout.write("aaa")
sys.stdout.write("bbb")

=> aaabbb

システム時間 エポック秒 UNIX時間 をミリ秒で取得 javaのSystem.currentTimeMillisのように

現在時間をJavaのSystem.currentTimeMillis()と同様に取得する方法。

Pythonはミリ秒ではなく浮動小数点ので返すのでミリ秒を得たい場合は1000倍する。


>>> import time
>>> int(time.time() * 1000)
1331006361272

逆にJavaのnew Date(millisec)のようにDatetime型に戻すのは、


>>> import datetime
>>> datetime.datetime.fromtimestamp(millisec/1000)
datetime.datetime(2012, 3, 3, 22, 0, 57)

特定のdatetimeオブジェクトからエポック秒 (unix時間)を取得する方法


>>> impot time
>>> int(time.mktime(datetimeobj.timetuple()))

2014/01/10追記:
エポックミリ秒 (unix時間msec)を取得するには、秒の桁までのものと microsecondで得られた結果を加算します。


>>> impot time
>>> int(time.mktime(datetimeobj.timetuple()) * 1000
     + datetimeobj.microsecond / 1000)

オブジェクトの型チェック isinstance types

あるオブジェクトがどの型・インスタンスであるかをチェックする。

isinstance関数を使う

>>> import types
>>> isinstance("", types.StringType)
True
>>> isinstance([], types.ListType)
True
>>> isinstance(10, types.IntType)
True

組み込み関数type()はオブジェクトのtypeオブジェクトを返すが、これをチェックするよりもisinstance関数を使うほうが推奨される。

>>> type("hello")
<type 'str'>
>>> type("hello") == types.StringType
True

オブジェクトが属性をもつかどうか hasattr

あるオブジェクトが属性をもつかどうかをチェックする。
オブジェクトの認識のために使用したりする。

>>> bar = [1,2]
>>> hasattr(bar, "__iter__")  #__iter__メソッドを持つ=iterable
>>> True

ディクショナリ操作 dict

キーと値を持つ辞書オブジェクト。

生成

キーは文字列に限らずほぼ任意のオブジェクトが指定できる。(変更可能なオブジェクトはキーに使うことができない除く)

>>> d = {}  #空の辞書作成
>>> d2 = {"foo": 10, "bar": 20} #要素を指定して作成
>>> d2["foo"]
10

要素の追加

>>> d = {"foo": 10} 
>>> d["bar"] = 200
>>> d["bar"]
200

要素の取得

>>> d = {"foo": 10, "bar": 20} 
>>> d["foo"]
10
>>> d["hoge"]   #存在しないキーを指定するとKeyError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'hoge'
>>> d.get("hoge") == None  #getメソッドではKeyErrorは起きず、Noneがかえる
True
>>> d.get("hoge", -1)   #getの第2引数で存在しない時の値を指定
-1

キーの存在チェック

>>> d = {"foo": 10, "bar": 20} 
>>> "hoge" in d
False
>>> "foo" in d
True

キーの一覧

>>> d = {"foo": 10, "bar": 20}
>>> d.keys()
['foo', 'bar']
>>> for k in d.iterkeys():  #イテレータとして取得
...   print k
foo
bar

valueの一覧

>>> d.values()  #itervalues()イテレータとして取得
[10, 20]

要素の一覧

>>> d.items()  #(key, value)のタプルのリスト
[('foo', 10), ('bar', 20)]

>>> d.iteritems()  #itemsをイテレータとして取得
<dictionary-itemiterator object at 0xfff3b2fc>
>>> [e for e in d.iteritems()]   #リスト内包表記でイテレートしてリスト化
[('foo', 10), ('bar', 20)]

比較 (==, is)

同じ内容を持つ値の比較は、==。
同じオブジェクトを指すかどうかは、is。

>>> L1 = [1, 2, 3]
>>> L2 = [1, 2, 3]
>>> L1 == L2
True
>>> L1 is L2
False

シーケンス操作 list

シーケンスは、リスト、タプル、文字列などのスーパークラス。
どれも以下の操作が可能

インデクシング

インデックスを指定して1つの要素を取得

S = "spam"
>> S[0]
s

負の値を指定することで、後ろからのインデックスで指定

>> S[-1]   
m

スライシング

範囲を指定することで、部分的なリストを新たに生成して返す。
インデックスの1は含むが3は含まない。

>> S[1:3]
"pa"

インデックスの開始のみ指定し、終わりは最後まで

>> S[1:]
"pam"

インデックスの開始は省略すると0から。

>> S[:-1]
"spa"

シーケンスのコピーを新たに作る場合によく行う方法
コピーを生成したので、同値ではあるが、同一オブジェクト(is)ではない

>>> l = [1,2,3]
>>> l == l[:]
True
>>> l is l[:]
False

文字列フォーマット操作 (%形式)

文字列を書式化して埋め込み。

ここで説明する%形式の文字列フォーマットよりも、Python2.6から使用可能な、新しい形式のformat関数フォーマット済み文字列リテラルも参考にしてください。

>>> "%d %s %d" % (1, "spam", 4)
'1 spam 4'

桁数などの指定。

>>> "[%-6.2f][%05.2f][%+06.1f]" % (1.2345, 1.2345, 1.2345)
'[1.23  ][01.23][+001.2]'

%-6は右にスペースを埋める形で6桁に。
%05は左に0を埋める形で5桁に
%+は符号

ディクショナリで指定。

>>> "%(n)d %(x)02X" % {"x": 15, "n": 1}
'1 0F'

printf 形式の文字列書式化