python: personal memo



### .emacs

```elisp
(add-hook 'python-mode-hook
          '(lambda ()
           (outline-minor-mode)
           (setq outline-regexp " *\\(def \\|clas\\|#hea\\)")
           (hide-sublevels 1)))
```

`.emacs`に上記を記述しておくと，outline minor modeが使えて，`def`や`class`などが折り畳まれるので長いコードも見易い．


### import

```python
>>> import numpy as np
```

こうすることで，後々numpyをnpと省略することができる．

### help

```python
>>> help(numpy)
>>> help(np.arange)
```

などとして，numpyのヘルプや関数のヘルプを見ることができる．

ipythonを使えば，

```python
In [1]: np.arange?
```

として，`?`を末尾につけることでヘルプを見ることができる．この場合，そのソースファイルの場所も示してくれる．

### docstring
pythonでは，ファイルの先頭にあるコメントや，関数の先頭にあるコメントがdocstringとして扱われて，モジュールや関数のドキュメントとなる．`help`コマンドなどで呼び出される．

```python:hoge.py
u"""一行目はNAMEというブロック．

全体はDESCRIPTIONというブロックとなる．
先頭のuはutf-8を指定する文字列だよということ．
"""

def func():
	u"""これは関数の説明．
	関数宣言のすぐ後に書くべし．
	"""

class newClass:
	u"""これはnewClassの説明．
	class宣言のすぐ後に書くべし．
	"""

	def foo():
		u"""クラスnewClassの関数fooの説明
		コメントを，reStructuredText形式で書いておくと
   		ウェブ表示の際にキレイかもしれない．
		"""
```

### ファイル入力
```python
f=open('filename','r')
for line in f.readlines():
	data= line.split()
	x= data[0]
	...
f.close
```
みたいな感じで，`readlines()`関数や，`readline()`関数などで読み込む．
`readlines()`関数は，すべての行を読み込んでそれを配列として返す．
`readline()`関数は，一行づつ読み込む．

### ファイルの存在確認

```python
>>> import os
>>> os.path.exists('hogedir/hogefile')
```


### ファイル/フォルダの移動
`shutil`を利用する．
`src/hoge.txt`を，`dst/`以下に移動したい場合，

```python
>>> import shutil
>>> shutil.move('src/hoge.txt','dst/')
```



### 出力のフォーマット
古いフォーマット指定は，

```python
"pi is 15.7f" % math.pi
'pi is       3.1415927'
"pi is %15.7f, e is %15.7f" % (math.pi,math.e)
'pi is       3.1415927, e is       2.7182818'
```

のように`%`に続くタプルで値を代入する感じだった．
新しいフォーマット指定は，

```python
'pi is {0:15.7f}, e is {1:15.7f}'.format(math.pi,math.e)
'pi is       3.1415927, e is       2.7182818'
```

のように，文字列のformat関数で値を代入する．文字列内に`{}`でくくって，何番目の引数かとか，フォーマットとかを記述する．

```python
>>> "{:>20}".format('test')
'                test'
>>> "{:<20}".format('test')
'test                '
>>> "{:^20}".format('test')
'        test        '
>>> "{:*^20}".format('test')
'********test********'
```

上記のように，左右や中央寄せと文字詰めなどが指定できる．

0で埋めた数値を出力したい場合，

```python
>>> "{:05d}".format(123)
'00123'
```



### 文字列と数値の間の変換

```python
>>> int("12")
12
>>> int("12.3")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '12.3'
>>> float("12.3)
12.3
```

つまり，しっかりと整数を表す文字列を`int`で変換すれば整数になるが，整数を表していない文字列を整数に変換しようとするとエラーとなる．

逆に数値を文字列に変換したい場合は，以下．

```python
>>> str(math.pi)
'3.14159265359'
```

### シェルコマンドを実行する
#### os.system

```python
>>> import os
>>> os.system('ls')
main.py		main.py~	mod1.py		mod1.pyc
0
```

#### commands.getoutput

```python
>>> import commands
>>> commands.getoutput('ls')
'main.py\nmain.py~\nmod1.py\nmod1.pyc'
```


#### subprocess.Popen

```python
>>> import subprocess
>>> process.Popen(['sleep','10'])
>>> process.wait()
```

とすると，`sleep 10`が終了するまで待つ．上の例で，`process.pid`とすればプロセスIDを取得できる．


### 作業ディレクトリ関連

```python
>>> os.getcwd()
```

で現在の作業ディレクトリを取得でき，

```python
>>> os.chdir('hoge/foo/')
```

として，ディレクトリを移動できる．これは子プロセスでの話しなので，このpythonスクリプトを実行しても，そのプロセスが終了したら元のディレクトリに戻る．

### 時間計測

* 実経過時間の測定には`time.time()`関数．
* CPU時間の測定には`time.clock()`関数．

```python
import time
t0= time.time()
...
print time.time()-t0
```

などとして計測する．


### 配列の要素を消去する

```python
>>> a= range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del a[4]
>>> a
[0, 1, 2, 3, 5, 6, 7, 8, 9]
>>> a.pop(3)
3
>>> a
[0, 1, 2, 5, 6, 7, 8, 9]
>>> a.remove(9)
>>> a
[0, 1, 2, 5, 6, 7, 8]
```

上記ように，`del`と`pop`と`remove`がある．


やりだすとたくさんあるから，ここらでやめる．
あとは個別の投稿にすべきなんだろう．