今日も5分間のPython
前回のBLOG の説明 RNAの配列からタンパク質に翻訳される開始コドン(AUG)を大文字にしようなんてアホなこと考えてしまった.単なる置換と勘違いしたんですね.
今日はファイルオープン! どでかいファイルをオープンしてみちゃう.ということで昨日はRNAだったので今日はDNA!DNAの塩基配列が並ぶ1G以上あるファイルをオープン!
In [1]: fp = open('dna.seq', 'r')
In [2]: for l in fp.readlines():
...: print l
...:
何も表示されず止まってしまった.PCごとフリーズ状態. ということで,下記で挑戦.
In [1]: fp = open('dna.seq', 'r')
In [2]: for l in fp:
...: print l
...:
TCAGGTACCCTAAT...
ATCCTGATTATATA... (省略)
ちゃんと出力された. readlinesはファイルが物理メモリの中に収まる場合にのみ有効とのこと. (Pythonクックブック)
「5分です」 ではおやすみ! (実はDNA配列をダウンロードするのに5分以上かかった...
DSUを5分で試す
DSU(decorate-sort-undecorate)修飾ーソートー脱修飾という流れを試す. たいした内容じゃない.こんな言葉を知らなかったのでー試す.
□ リストの中身を文字列が長い順にソートする.
In [1]: l = ['augcaugcau', 'ggcauaugg', 'aaccgaugauggc']
In [2]: _l = [(len(x), x) for x in l] # 修飾
In [3]: _l.sort() # ソート
In [4]: l[:] = [y for x, y in _l] # 脱修飾
In [5]: l
Out[5]: ['ggcauaugg', 'augcaugcau', 'aaccgaugauggc']
ってこと, しかーし,Python2.4以降ではDSUがサポートされているので下記のようになる.
In [6]: l = ['augcaugcau', 'ggcauaugg', 'aaccgaugauggc']
In [7]: l[:] = sorted(l, len)
In [8]: l
Out[8]: ['ggcauaugg', 'augcaugcau', 'aaccgaugauggc']
おっ!楽ちんですね.
実は,こんな感じなモノをディクショナリで色々やろうと思ったんですがー5分間でできなかった..あはは☆
休憩5分でSingleton@Python
PythonでSingleton. 必要か必要じゃないかはさておき,クックブックに載っていたのを思い出して書く!!
In [1]: class Singleton(object):
...: def __new__(cls, *args, **kargs):
...: if '_instance' not in vars(cls):
...: cls._instance = super(Singleton, cls).__new__(cls, *args, **kargs)
...: return cls._instance
...:
In [2]: class Hoge(Singleton):
...: pass
...:
In [3]: h1 = Hoge()
In [4]: h2 = Hoge()
In [5]: id(h1)
Out[5]: 18992176
In [6]: id(h2)
Out[6]: 18992176 // 同じだ!
In [7]: class Hige(Hoge):
...: pass
...:
In [8]: h3 = Hige()
In [9]: id(h3)
Out[9]: 18992976
In [10]: h1 is h3
Out[10]: False
In [11]: isinstance(h1, Hoge)
Out[11]: True
In [12]: isinstance(h3, Hige)
Out[12]: True
In [13]: isinstance(h3, Hoge)
Out[13]: True
できたっぽいんじゃない. ただ,11~13のチェックの議論は特にしない.なぜならよくわかっていない. たしか,Singletonの間に親クラス(Hoge)があったとしてもー子クラス(Hige)のインスタンスとして返してほしいとかなんとか... あちゃ〜5分こえちゃった..
メモ:Python Ruby
PythonでいうこれをRubyでやろうとしたらー探してしまったのでメモっとく(実は前にやっているのに忘れたからメモる!)
In [10]: def Hoge(val):
....: def Hige(val2):
....: print val
....: print val2
....: return Hige
....:
In [11]: Hoge('HOGE')('HIGE')
HOGE
HIGE
Rubyでは,
>> def Hoge(val)
>> return Proc.new do |val2|
>> p val
>> p val2
>> end
>> end
=> nil
>> Hoge('HOGE').call('HIGE')
"HOGE"
"HIGE"
でいいのかな!? どちらかと言うとーPythonの方がちょっと変な気もしなくもないかも!?
_md5エラー
帰宅する前にBLOG更新.
Google App Engineのアカウントが取得できなく寂しい僕…
ということで,SDKをMacにインストールしてDjangoでも動かしてみようと思ったらーわけのわからんエラーがでたのでメモ.
dev_appserver.py を実行すると,no module named _md5 とエラー調べてみるとこんな情報がありました.
http://code.google.com/p/googleappengine/issues/detail?id=83
記事に従ってdev_appserver.pyを修正したら起動した!
# 1140
#if (file_type != self._imp.C_BUILTIN and not FakeFile.IsFileAccessible(pathname)):
# を下記に変更
if (file_type != self._imp.C_BUILTIN and file_type != self._imp.C_EXTENSION and not FakeFile.IsFileAccessible(pathname)):
まだ,納得いかないところもあるんですがとりあえず動いた.