)

NomoLog

Log of my life and program

俺的Python気になった所まとめ3

Posted in Python Tagged as Python

俺的Python気になった所まとめ2の続きです。

with文

ファイル入出力のときはとりあえずこいつ使っとけって感じらしい。

1
2
3
with open('/tmp/workfile/, 'r') as f:
  read_data = f.read()
  ...

with文中で例外が発生してもf.closeしてくれる。try-except-finallyより簡単に書ける。

pickleモジュール

複雑なpythonのデータ型(リスト、辞書、クラスのインスタンス)を文字列表現に直してファイルへリード・ライトしてくれるいかしたモジュール

1
2
3
pickle.dump(x, f)

x = pickle.load(f)

みたいに使う。

プライベート変数

Pythonでは定義されていない。しかし、アンダースコアで始まる名前(ex. _spam)はプライベートな変数、関数、メソッドとして扱う慣習があるらしい。

pythonのイテレータ

リストや辞書など複数のデータがひとまとめにするデータ構造に対して、for文などで各要素にアクセスできる仕組み。こんな感じ。

1
2
3
4
5
6
7
8
9
10
for element in [1, 2, 3]:
  print element
for element in (1, 2, 3):
  print element
for key in {'one':1, 'two':2}:
  print key
for char in "123":
  print char
for line in open("myfile.txt"):
  print line

クラスに対して独自にイテレータを実装してみる。PersonクラスをまとめるGroupクラスを作り、for文で各Personクラスにアクセスできるようにする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Person:
  def __init__(self,nm):
    self.name = nm

class Group:
  index = 0
  def __init__(self):
    self.persons = []
  def add(self,person):
    self.index += 1
    self.persons.append(person)

  def __iter__(self):
    return self

  def next(self):
    if self.index == 0:
      raise StopIteration
    self.index = self.index -1
    return self.persons[self.index]

group = Group()
person1 = Person("a")
person2 = Person("b")
person3 = Person("c")
group.add(person1)
group.add(person2)
group.add(person3)

for i in group:
  print i.name

出力は以下

1
2
3
>> c
>> b
>> a

pythonのgenerator

generatorを使うことで上記のiteratorを簡単に実装できる。

以下のソースは上記iteratorの実装と同値

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Person:
  def __init__(self,nm):
    self.name = nm

class Group:
  index = 0
  def __init__(self):
    self.persons = []
  def add(self,person):
    self.index += 1
    self.persons.append(person)

  def iter(self):
    for person in self.persons:
      yield person
group = Group()
person1 = Person("a")
person2 = Person("b")
person3 = Person("c")
group.add(person1)
group.add(person2)
group.add(person3)

for i in group.iter():
  print i.name

return文のかわりにyieldを使うとgenerator関数になるらしい。

python仮想実行環境の構築

古い記事を見てえらい目にあった。 とりあえずこの辺を入れればいいらしい。

  1. Setuptools(Pythonのパッケージ管理ツール)
  2. pip(これまたパッケージ管理ツール)

pipが公式推奨らしいけどpipがSetuptoolsに依存しているので入れなきゃダメらしい。 SetupToolsの導入に関しては公式を参照しよう。

setuptoolsが入ったら

1
easy_install pip

でpipを入れる。easy_installはuninstallコマンドが無いらしくpipがパッケージ管理ツールとして推奨されているらしい。

(*Python3.4以降ではpipを自動インストールするためのensurepipという公式ライブラリがあるらしい。これ使えばよかった。くそう。ensurepip)

次に

1
pip install virtualenv virtualenvwrapper

でvirtualenvとvirtualenvwrapperを入れる。

virtualenvwrapperはvirtualenvを使いやすくするためのツール。

こちらに従って導入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1. Create a directory to hold the virtual environments.
 (mkdir $HOME/.virtualenvs).
2. Add a line like "export WORKON_HOME=$HOME/.virtualenvs"
     to your .bashrc.
3. Add a line like "source /path/to/this/file/virtualenvwrapper.sh"
 to your .bashrc.
4. Run: source ~/.bashrc
5. Run: workon
6. A list of environments, empty, is printed.
7. Run: mkvirtualenv temp
8. Run: workon
9. This time, the "temp" environment is included.
10. Run: workon temp
11. The virtual environment is activated.

基本的にはmkvirtualenv <env_name> で新しい仮想環境が構築される。

workonで現在使用できるpython環境を一覧表示、

workon <env_name>で環境の切り替えができる。

mkvirtualenv <env_name> -p path/to/python でどのpythonを仮想環境で使うか指定できる。

mkvirtualenv <env_name> --no-site-packages で元環境のsite-packagesを使わずにすむ。

ていうかこのオプションがないと元環境のpythonの方のライブラリを参照・追加してしまう。 これはデフォルトでこうなってるべきじゃないのか…

python3.3以降ではvenvっていうvirtualenv的なものが公式でサポートされたみたいだけど、virtualenvwrapperがある分まだvirtualenvのが使いやすそうな印象を受けた。

Pythonのバージョン管理でPythonzってのがあるらしいけど、今のところはバージョン管理必要ないのでHomeBrewで元環境に直接2系と3系入れてそれをvirtualenvで指定して使うことにする。

終わりに

こんな感じです!!これからPythonistとして精進していきます!!

Comments