Python

インタラクティブシェルの強化版

ヘルプの使い方

  • Pythonは「電池付属」の哲学がある(らしい)
  • そのため、どのモジュールの説明もPythonインタプリタ上で調べることができるので便利

>>> help(os)
>>> help(os.system)

>>> dir(os)
>>> dir(os.system)

>>> dir(str) or dir('')
>>> dir(list) or dir([])
>>> dir(dict) or dir({})
>>> dir(tuple) or dir(())

>>> help('modules')     # importできるモジュール一覧を表示
>>> help('keywords')    # 予約語一覧を表示
>>> help('モジュール名')

基本操作

#! /usr/bin/env python
# -*- coding: utf-8 -*-
  • ファイルの1-2行目あたりに以下のどれかを書いておく
  • 保存するときのエンコーディングも同じにする
  • Emacsのautoinsertで指定しておくと便利

codingの部分は以下でもOK

# coding: utf-8
# coding = utf-8
type('オブジェクト')                      # --> オブジェクトの型を返す
isinstance('オブジェクト', 'クラスとか型')  # --> True or Falseで返す

>>> l = ['s', 'h', 'o', 't', 'a']    # リスト型
>>> type(l)
<type 'list'>
>>> isinstance(l, str)
False

モジュール操作

  • Pythonには便利なモジュールがたくさん用意されているので、それを使わない手はない
  • モジュールを使うことのメリットは、
    1. エラー処理などを簡単にやってくれちゃう
    2. 自分で書くよりバグがない
  • 生産性はあがるはずなので、とりあえずモジュールがないか確認してみる
    • 使ったことないモジュール、情報が少ないモジュールは苦労するけど、、、
  • まずはモジュールを使えるようにしないと始まらない
import ModuleName                     # モジュールをインポート
from ModuleName import Element        # モジュールからある要素をインポート
from PackageName import ModuleName    # パッケージからあるモジュールをインポート
from ModuleName import *              # あるモジュールの全要素をインポート

モジュールまでのパス

  • モジュールを使うには、モジュール検索パスの設定が必要
    • 現在設定されているパスを確認する方法は以下の通り
>>> import sys
>>> sys.path

注意点

  • 1モジュール / import文 にする(可読性をあげるため)
  • “import *” は極力使わない
  1. MacPortsを使う
  2. easy_installを使う
  3. ソースを落として来てビルドする
    • などの方法でモジュールをインストールすることができる
    • 私は基本的にMacPortsを使ってる

モジュールのインストールログ

パス操作

import os

filename = 'hoge/foo.txt'
if not os.path.exists(filename):
    print 'File "{0}" does not exist.'.format(filename)

ファイルが存在するか確認したい

os.path.isfile(filename)

ディレクトリが存在するか確認したい

os.path.isdir(dirname)

os.path.join('foo', 'bar', 'hoge')    # ==> foo/bar/hoge
os.path.join('foo', 'bar', 'hoge/')   # ==> foo/bar/hoge/
os.path.join('foo', '/bar', 'hoge/')  # ==> /bar/hoge/

os.path.split('foo/bar/hoge')   # ==> ('foo/bar', 'hoge')
os.path.split('foo/bar/hoge/')  # ==> ('foo/bar/hoge', '')

拡張子を知りたい

os.path.splitext('foo/bar/hoge.txt')  # ==> ('foo/bar/hoge', '.txt')
os.path.splitext('foo/bar/hoge.')     # ==> ('foo/bar/hoge', '.')
os.path.splitext('foo/bar/hoge')      # ==> ('foo/bar/hoge', '')
os.path.splitext('foo/bar/hoge/')     # ==> ('foo/bar/hoge/, ''))

スクリプト操作

import os

# 'ls -l'の実行結果を受け取って、その後の処理をしたいような場合
command = 'ls -l'
with os.popen(command) as fin:
    lines = fin.readlines()

  • 2.6で廃止。subprocessモジュールを使うことが推奨らしい。

import os

os.system('PROGRAM_YOU_WANT_TO_EXECUTE')

  • 既存のC++プログラムをループさせるスクリプトを書きたい場合に使える

import sys
argv = sys.argv    # 引数はリスト型で格納される

  • 引数を全部表示させてみる(後でC/C++と比較)

## _____ python版 _____
import sys
for i in len(sys.argv):
    print 'argv[%d]:%s' % (i, sys.argv[i])

// _____ C/C++版 _____
for(int i=0; i<argc; i++) {
    printf("argv[%d]:%s\n", i, argv[i])
}

a = raw_input('Enter character > ')
print a

オプション解析

from optparse import OptionParser

usage = '%prog [args]'
parser = OptionParser(usage)

import argparse

desc = 'プログラムの簡単な説明'
epi = 'エピローグ;ヘルプの最後に付ける説明'
parser = argparse.ArgumentParser(
        description=desc,
        epilog=epi,
        formatter_class=argparse.RawDescriptionHelpFormatter
        )

  • OptionParser → ArgumentParser に変更
  • usageは不要、代わりにdescriptionが必要
  • epilogが書き足せるようになった
    • 簡単な説明はdescriptionへ、サンプルなどはepilogへ、といった書き方が簡単にできる
  • ヘルプ表示の折り返し指定が可能になった

parser.add_option('-short, '--long',
                  dest='hoge',
                  action='piyo',
                  help='fuga')

parser.add_argument('filename',
                     type=str,
                     nargs='+',
                     help='input filename')
parser.add_argument('-short', '--long',
                    dest='hoge',
                    action='piyo,
                    help='fuga')

  • add_option → add_argument へ変更
  • オプション引数はこれまでどおり設定、引数もargumentとして設定する
  • 各引数(標準、オプション)が必要な数をnargsで指定できる
    • '?' : あってもなくてもよい
    • '*' : 可変長(0以上)
    • '+' : 可変長 (1以上)
  • actionやhelpなどはこれまでと同じ
  • 他にも便利になってるので、リファレンスを参照すること

parser.add_description('説明')

  • 改行が無視されるので、実行コマンド例などを載せるには向かない
    • usageは改行が聞くので、そこにだらだら書くことで対処している
  • きちんとした説明を書くためにあるのかもしれない
  • argparseではコンストラクタで必要。改めて設定する必要はない。

parser.set_defaults(dest='koko',
                    file='sore',
                    ...)

  • argparseでも同じ

日付・時間操作

短く書きたい

  • 多用は禁物
  • 「可読性」が大事

odds = [2 * i + 1 for i in range(10)]  # ==> [1, 3, 5, 7 ,9, 11, 13, 15, 17, 19]

  • 以下と同様

odds = []
for i in range(10):
    odd = 2 * i + 1
    odds.append(odd)

a = y if X else z

  • 以下と同等

if X:
    a = y
else:
    a = z

  • 順番を伴った複数の要素を抽象的に扱うための仕組み
  • for ループと組み合わせることが多い
    • 実際、組み込み型をforループさせる場合は、内部でイテレータとして処理してる
  • 処理:
    1. 次の要素を取り出す
    2. 要素が終わったかどうかを判別する
  • メリット:
    • 大きなサイズのファイルを読み込む場合や、ネットワーク越しにデータを取ってくる場合など、一度に大量のデータを読み込むことができない場合(うまく言葉にできていない気がする)

i = iter([1, 2, 3])
i.next()  # ==> 1
i.next()  # ==> 2
i.next()  # ==> 3
i.next()  # ==> 例外:StopIteration

  • iter()関数を使って、リストなどをiterableに変換する
  • next()メソッドを使って、要素を取り出す
  • 要素がない場合は、StopIteration例外が発生する
  • 内部にyeild文があればジェネレータ関数
    • yield文を使って何度も結果を返すことができる
  • メリット:
    • イテレータの処理を簡単に定義できる

XML解析をしたい

ROOTを使いたい

  • PyROOT参照
  • rootpyというのもあるらしいが、未体験

WEBアプリを作りたい

  1. /etc/apache2/httpd.conf を編集
  2. /etc/apache2/users/[username].conf を編集

#DirectoryIndex index.html <- デフォルト
DirectoryIndex index.html index.py    # index.pyを追加
...
# AddHandler cgi-script .cgi <- デフォルト(コメントアウトされてる)
AddHandler cgi-script .cgi py    # コメントアウトを外し、pyを追加
...

#Options Indexes MultiViews <- デフォルト
Options ExecCGI Indexes MultiViews    # ExecCGIを追加

参考にしたサイト

  • HTMLを表示させる
    • print文の最初2行が必要(これらはHTMLソースには出てこない)

import cgi

print 'Content-Type: text/html'
print
print '<!DOCTYPE html>'
print '...'

ログ出力したい

画像編集

  • 詳細はPILに移動

数学

  • math モジュール

import math
dir(math)
### 三角関数 ###
acos(x)   # arc cosine of x in radian
acosh(x)
asin(x)
asinh(x)
atan(x)
atan2(x, y)
atanh(x)
cos(x)
cosh(x)
sin(x)
sinh(x)
tan(x)
tanh(x)
degrees(x)    ## radian -> degree変換
radians(x)    ## degree -> radian変換

ceil(x)     ## 切り上げ
floor(x)    ## 切り捨て
copysign(x, y)


erf(x)    ## error function at x
erfc(x)   ## complementary error function at x

e
pi

'sqrt',
'pow',
exp(x)

expm1(x)    ## exp(x) - 1
fabs(x)    ## |float x|
factorial(x)   ## x!

fmod(x, y)
frexp(x)
fsum(iterable)    ## 高精度なsum
gamma(x)    ## ガンマ関数 Γ(x)
hypot(x, y)    ## 2点間の距離 (sqrt(x*x + y*y) )

isinf(x)
isnan(x)

ldexp(x, i)    ## x * (2**i)
lgamma(x)    ## ln{Γ(x)}
log(x[, base])    ## 自然対数
log10    ## 対数
log1p    ## ln(1 + x)
modf(x)





'trunc'
]