Python

  • スクリプト言語の一つ
  • 関数や if 文などの {} をインデントで代用するため、可読性が高い
  • 2.x と 3.x で完全な互換性はない
  • Linux の主要ディストリビューションには、デフォルトでインストールされている
  • スクリプト言語の中では、高速に処理できるらしい
  • 科学計算などのライブラリが充実している
  • 対話的にプログラムができる (命令文のテストなどちょっと試したい時に最適)

ファイルの先頭

  • Python 2
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
  • Python 3
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
  • 1 行目は実行するプログラムを指定するシバン行
    • /usr/bin/env … の代わりに直接 Python のパスを指定しても良い
      • env は引数のプログラミング言語のパスを自動で拾ってきてくれる
      • 環境が違っても env があれば、対応できるプログラムになる
  • 2行目に文字コードを指定する (日本語などが含まれる場合、指定しないとエラーになる)

変数

  • 定義
    variable_name = value
    • Python では変数の型が動的に割り当てられるため、型定義は不要

配列 (リスト)

  • 定義
    array_name = [value1, value2, ...]
    • リストは角括弧で定義
  • 呼び出し
    print(array_name[index])
    • 配列名の後に角括弧で、0 から始まる配列番号を入れると個別に値を取り出すことができる
    • index が負数だと、後ろからの番号になる (-1: 末尾の配列番号、-2: 末尾から1つ前の配列番号、…)
  • スライスによる呼び出し
    print(array_name[start:end])
    • 連続する要素をリストとして呼び出すこともできる
    • start 及び end は片方、省略でき、start を省略すると「先頭から」、end を省略すると「末尾まで」を指定したことになる
    • start と end の数字は、要素の間の番号だと考えると良い
      要素名      :  val1 val2 val3 val4 val5
      開始/終了番号: 0    1    2    3    4    5
  • 値の追加
    array_name.append(value)
    • append を使って、末尾に挿入する

連想配列 (ハッシュ、ディクショナリ)

  • Python でハッシュ (キーと値のペアで情報を持つ配列) をディクショナリと呼ぶ
  • 定義
    dic_name = {key1:value1, key2:value2, ...}
    • dic_name にディクショナリ名
    • key1, key2 にキー名
    • value1, value2 に値
    • 波括弧で定義
  • 呼び出し
    dic_name[key]
    • 角括弧で呼び出す
  • キーをリストで取得する
    dic_name.key()
    • dic_name にディクショナリ名
    • for 文を使って hoge というディクショナリの値を取得する場合
      for i in hoge.keys():
      	print(hoge[i])
  • 値をリストで取得する
    dic_name.values()

関数の定義

def function_name(arg1, arg2, ...):
	...
  • def で始め、function_name に関数名を入れる
  • 引数は関数名の後の () に入れた変数名に、関数の呼び出しで入れた引数が代入される

関数の呼び出し

function_name(arg1, arg2, ...)
  • 関数名 function_name をそのまま入れるだけ
  • 引数 arg1, arg2 が引数として、関数に与えられる

無名関数 (ラムダ(lambda)式)

組み込み関数

map

  • リストの要素、全てに対し指定した関数を実行する (for 文で各要素に処理するのと同じ)
  • 構文
    array_result = map(function, array)
    • function にリストに対して処理したい関数を指定する
    • array に処理したいリストを指定する
    • 例: リストを浮動小数に変換する
      result = map(float, hoge)
  • 返り値は 2.x と 3.x で異なるため、 Python 2.x と 3.x の違い の map,filter,zip 関数を参照されたし

filter

  • 条件に合致する値を抽出する (perl の grep みたいな関数)
  • 構文
    filter(function, array)
    • function に条件判断する関数を指定する
    • array に処理したいリストを指定する
    • 例: 奇数のみ抽出する
      >>> hoge = [1,2,3,4,5]
      >>> filter(lambda n: n % 2 == 1, hoge)
      [1, 3, 5]
  • 返り値は 2.x と 3.x で異なるため、 Python 2.x と 3.x の違い の map,filter,zip 関数を参照されたし

reduce

  • リストを集約する関数 (リストの値を for 分を使って取り出し、最終的に返り値を出す関数)
    • 合計値を求める関数が reduce で代用できる
  • 構文
    reduce(function, array)
    • function に集約する関数を指定する
    • array に処理したいリストを指定する
    • 例: 合計を算出する
      >>> hoge = [1,2,3,4,5]
      >>> reduce(lambda x,y: x+y, hoge)
      15
  • 3.x では functools モジュールに取り込まれたので、import してから使う
    from functools import reduce
  • print: 画面上に文字を表示する
  • sys: システムパラメータを扱うモジュール (標準入出力やシグナルなど)
  • os: オペレーティングシステムインターフェースを扱うモジュール (ファイルの移動など)
  • argparse: コマンドライン引数を解析するモジュール
  • re: 正規表現を扱うモジュール
  • subprocess: サブプロセスを扱うモジュール (外部コマンドを使うなど)
  • textwrap: 行の長さなどを自動調整するモジュール
  • tqdm: 進捗表示モジュール (別途導入が必要)
  • joblib: 並列処理モジュール (別途導入が必要)
  • math: 数学モジュール
  • numpy: 数値計算モジュール
  • scipy: 科学技術計算モジュール
  • operator-itemgetter: 多次元配列を特定のキーで抽出するモジュール (ソートに使う)
  • Notify: 通知バルーンモジュール (Linux のデスクトップ環境で通知する際に使う)
  • parmed: Gromacs や AMBER の構造やトポロジーファイルを扱うモジュール
  • pandas: データフレームを扱うモジュール
  • Biopython: アメリカの国立生物工学情報センターのデータベースにアクセスできる API モジュール
  • itertools: イテレータ作成モジュール (順列や組み合わせ、直積、階乗で使える)
  • 自作モジュールの作成手順 (実行する python ファイルを main.py、モジュールファイルを module.py とする)
    1. 関数やクラスを列挙したモジュールファイル (module.py) を作成
    2. モジュールファイルがあるディレクトリに __init__.py というファイル名の空ファイルを配置する (モジュールファイルがあることを示すファイル)
    3. モジュールパスの追加
      • main.py と同じディレクトリにモジュールがある場合
        ./main.py
        ./module.py
        • main.py に import module を追加する (import の後は .py を抜いたファイル名を指定)
      • main.py と同じディレクトリにモジュールを含んだディレクトリ (module_dir) がある場合
        ./main.py
        ./module_dir/module.py
        • main.py に import module_dir.module を追加する (module_dir と module.py の間はスラッシュではなく、ピリオドで区切る)
        • main.py に from module_dir import module を追加する (ディレクトリとモジュールファイルを分ける場合)
      • main.py とは別の階層にモジュールを含んだディレクトリがある場合
        ./main.py
        /path/to/module_dir/module.py
        • 環境変数に追記する場合
          1. 環境変数 PYTHONPATH にモジュールディレクトリを追加 (ここでは端末上での表記だが、.bashrc や .zshrc などに記述すると恒久的に利用可)
            $ export PYTHONPATH=$PYTHONPATH:/path/to/module_dir/
          2. main.py に import module を追加する (環境変数に追加したディレクトリから階層になっている場合は from. を使って階層を示す)
        • スクリプト内部で環境変数を追加する場合
          1. main.py に以下を追記
            import sys
            sys.path.append("/path/to/module_dir")
          2. main.py に import module を追加する (環境変数に追加したディレクトリから階層になっている場合は from. を使って階層を示す)
  • 参考サイト:
  • 2.x 以下のバージョンでは、完全な互換性があったようだが、3.x で一部機能について互換性がなくなった
  • その違いをメモしてみた

Print

map,filter,zip 関数

  • 2.x はリストで返す
    >>> array = [1,2,3,4,5]
    >>> print array
    [1, 2, 3, 4, 5]
    >>> print map(float, array) # 値をすべて浮動小数に変換して出力する
    [1.0, 2.0, 3.0, 4.0, 5.0]
  • 3.x はイテレータ (オブジェクト) で返す
    >>> array = [1,2,3,4,5]
    >>> print(array)
    [1, 2, 3, 4, 5]
    >>> print(map(float, array)) # 値をすべて浮動小数に変換して出力する
    <map object at 0x7f8f0e82ab00>
    • 2.x のようにリストで返すには list 関数を用いる
      >>> array = [1,2,3,4,5]
      >>> print(list(map(float, array)))
      [1.0, 2.0, 3.0, 4.0, 5.0]
  • 2.x ではリストを処理する際に一度にのメモリを確保していたが、3.x (イテレータ) では、効率的にメモリを使うことができるらしい (巨大なリストを扱う際の負荷が少なくなる?)

端末出力文字列に色を付ける

  • エスケープシーケンスを使う
    • 色を変える文字の前にエスケープシーケンスを挿入する
    • \033 (エスケープシーケンス) + [ + 制御コード + m
分類 制御コード 意味
修飾 0リセット
4太字
5点滅(使用環境により使えない場合あり)
7反転
文字色 30黒 (文字色)
31
32
33黄土色
34
35赤紫 (マゼンタ)
36水色 (シアン)
37灰色 (暗めの白)
90暗めの灰色 (明るい黒)
31明るい赤
32明るい緑 (黄緑)
33黄色
34明るい青
35明るい赤紫 (マゼンタ)
36明るい水色 (シアン)
37
背景色 40
41
42
43黄土色
44
45赤紫 (マゼンタ)
46水色 (シアン)
47