こんにちは。よっしーです。
この1年ぐらい Python をちょいちょいとさわってきたのですが、
つまづいたところがいくつかあったので、備忘録としてまとめたいと思います。
・Pythonバージョンの 2.x系 と 3.x系 でコードの記法が違う。
# 2.x 系の標準出力コード
print 'hogehoge'
# 3.x 系の標準出力コード
print('hogehoge')
2.x系 で書かれたコードを、3.x環境で実行すると、実行時にエラーとなる。逆もまたしかり。
せめて下位verの互換ぐらいはして欲しかった。。。
conda(コンダ)などを使って、2.x系 と 3.x系 の環境切り替えも可能ですが、
2.x系 のサポートは2020年までなので、私は新しい 3.x系 でコードを組むことにしています。
・Ubuntu14.04/16.04 は 2.x系 がデフォルト設定となっている。
# pythonのパスを表示
$ which python
/usr/bin/python
# python のリンク先を表示(ver2.7を指している)
$ ls -la /usr/bin/python
lrwxrwxrwx 1 root root 9 12月 21 2013 /usr/bin/python -> python2.7
これ。ミソなのは、3.x系 も存在しているということ。
$ ls -la /usr/bin/python*
lrwxrwxrwx 1 root root 9 12月 21 2013 /usr/bin/python -> python2.7
lrwxrwxrwx 1 root root 9 12月 21 2013 /usr/bin/python2 -> python2.7
-rwxr-xr-x 1 root root 3341384 10月 27 2016 /usr/bin/python2.7
lrwxrwxrwx 1 root root 9 3月 23 2014 /usr/bin/python3 -> python3.4
-rwxr-xr-x 2 root root 3693624 11月 17 2016 /usr/bin/python3.4
-rwxr-xr-x 2 root root 3693624 11月 17 2016 /usr/bin/python3.4m
/usr/bin/python のリンクを 3.x系 張り替えるとこで、3.x系 を使うことも可能です。
ただ、/usr/bin/python のリンクが 2.x なのか 3.x なのかに依存したくないので、
私は、実行する際のコマンドを明示的に python3 にするようにしています。
# この指定だと、python の指しているリンクが 2.x なのか 3.x なのかによって実行エラーとなってしまう。
python hoge.py
# この指定だと、必ず 3.x で実行される
python3 hoge.py
・辞書はとても便利。でも 3.6 以前だと入れた順にソートしてくれない。
# 辞書に対して、
dict = {}
# 値を入れていく
dict['one'] = 1
dict['two'] = 2
dict['three'] = 3
dict['four'] = 4
dict['five'] = 5
# でも表示すると入れた順に並んでいない。
print(dict)
{'four': 4, 'three': 3, 'five': 5, 'two': 2, 'one': 1}
これ、3.6以降だと入れた順に並んでいるので、
自分の環境(3.7)では正しく動いているのに、
実環境(3.4)ではおかしな動きになる。ということがありました。
気付くまでにかなり時間がかかりました。
対応としては、OrderedDict(順序付辞書)を用いて回避しました。
# 順序付辞書に対して、
from collections import OrderedDict
dict = OrderedDict()
# 値を入れていく
dict['one'] = 1
dict['two'] = 2
dict['three'] = 3
dict['four'] = 4
dict['five'] = 5
# きちんと入れた順に並んでいる。
print(dict)
OrderedDict([('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)])
Python は Ver依存でいろいろと問題があるなぁ~。
というのが正直な感想ですね。。。
ではまた~。
0 件のコメント:
コメントを投稿