2018年10月19日金曜日

Pythonでつまづいたことを細々とまとめてみる



こんにちは。よっしーです。

この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 件のコメント:

コメントを投稿