«

»

1月 15

初めてのPython(第二版)を読んだ(1)

いろいろ技術書買いましたが、とりあえず初めてのPythonで気になったところを備忘録ついでに書いていこうかなと思います。

>>> hoge = [2,3,4]
>>> hoge2 = hoge
>>> hoge[1] = 6
>>> hoge2
[2, 6, 4]

まずは有名どころから。Pythonの書き換え可能オブジェクト(リスト・ディクショナリとか)では、こういうふうに「深いコピー」をすると、参照先の場所がコピーされるのでこういうことになります。バグの元なので気をつけたいです。

hoge2 = hoge[:]

ちなみにこうするとスライスで中身が「浅いコピー」されるので影響がありません。

>>> hoge3 = 'foo'
>>> hoge4 = 'hoge'
>>> vars()
{ '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'hoge4': 'hoge', '__name__': '__main__', '__doc__': None, 'hoge3': 'foo'}
>>> print u'名前:%(hoge3)s ID:%(hoge4)s'%vars()
名前:foo ID:hoge

vars()で存在する変数のリストが帰ってくるので、それを参照させるとこういった静的な割り当ても可能。

>>> hoge5 = {'hoge3':'foo','hoge4':'vars'}
>>> print u'名前:%(hoge3)s ID:%(hoge4)s'%hoge5
名前:foo ID:vars

上の応用でこんなことも可能。

>>> import sys
>>> sys.stdout.write('hoge\n')
hoge

printって実はこうなってたんですね….(デフォルトでは改行記号が追加されていないことに注意)

>>> path = 'list.txt'
>>> sys.stdout = open(path,'a')
>>> print 'hogeeee'

こうすることで、printをファイルにリダイレクトできます。
もちろんlist.txtの中身は

lga128@PC-7:~$ cat list.txt
hogeeee

こうなります。こうしても改行記号は追加されます。
write()なら大丈夫なようで、おそらくmod_pythonのwrite()とかでもリダイレクトできるんじゃないかと。これは便利ですね。
#Facebook製のTornadoっていうフレームワークが気になってます。高速だし、充実した機能が良さそうです。

>>> log = open('list.txt','a')
>>> print >> log,'hoge'
>>> print 'hoge'
hoge

こうすると、指定した時だけリダイレクトされます。使い分けするときに良さそうです。

>>> password = {'bar':2982,'piyo':4229,'foo':3219}
>>> idname = raw_input()
foo
#書き方その一
>>> print password[idname]
3219
#書き方その二
>>> print password.get(idname,'No Such ID!')
3219
>>> idname = raw_input()
hoho
>>> print password.get(idname,'No Such ID!')
No Such ID!

1はスマート。2は例外処理もバッチリ。こういうスマートな書き方したいですね…

ショートサーキット評価がよく分かりませんでした。もっと勉強せねばw

これは思いついたんですが、

while True:
        try:
                print 'hoge'
        except:
                print 'hoge'

例外としてもprintするとCtrl+Cでも止まらないww
slとか書けそうですねw

#いつかカテゴリ整理したい

Permanent link to this article: http://lga128.nekobaka.net/2012/01/haji_py_part1/

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次の HTMLタグおよび属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Time limit is exhausted. Please reload the CAPTCHA.