プログラミング
概要 †
参考 †
目次 †
下位ページ †
概要 †
pip3について †
- グローバルに入れるには、必ず使うバージョンまで指定しないといけない
sudo python3.5 -m pip install numpy
環境構築 †
sudo apt-get -y install python3-dev
python -V
python3 -V #バージョンを確認。3.5だとする。
sudo apt-get install python3.5-dev #ここのバージョンとして3.5を入れる
sudo apt-get install python3-setuptools
sudo easy_install3 pip
pip -V # pipの場所がpython3になっていることを確認
sudo pip install virtualenv
開発を始める時 †
参考 †
文法 †
- ☆
- セミコロンなし,インデントが文法.
- 配列はmatlab式.[10, [20, 16], [32, u"太郎"], 18]など.スライス使える(a[1:2], a[:3], a[2:])が、スライス自体がリストにはならない.長さはlen(list),追記はlist.append(hoge).
- 数値配列の作成はrange(1, 5)など([1, 2, 3, 4])
- 文字列では、シングルとダブルクオートの区別がない
- ifに括弧なし.if, elif, elseはすべて行末に:
- forはmatlab式+行末に:.forのinに文字列は一文字ずつ取得.for, whileのあとにelseを入れることができる
- コメントは#comment, """comment"""
- 数字->文字はstr(num).文字→整数はint(str),文字→浮動はfloat(str),数値判定はstr.isdigit()
- 論理演算子はor, and, not.真偽はTrue, False
- 関数はdef function_name(arg1, ...):.行末に:が必要
- intも含め配列の関数渡しも、「すべて」参照渡し
- a={}でc++でいうmapになる
- pythonのdictは存在しないキーを出力しようとするとデフォルトエラーなので、そうじゃなくしたいならgetを使う。
- printf
- print aでprintf("%d\n",a);
- print a,でprintf("%d",a);
- for-else構文は、break「しなかったとき」に入るスペシャルステージ
- if 3>a>1<b<5: print(a, b)ができる!
- ☆☆
- 空オブジェクトはNone(Noneは予約語)
- 空白文字削除はstr.strip()
- Pythonは日本語がクソ
- 以下を一行目に入れる
# coding: UTF-8
バブルソート †
def bubblesort(a):
for i in range(len(a)-2):
for j in range(len(a)-1-i):
if a[j] < a[j+1]:
tmp = a[j]
a[j] = a[j+1]
a[j+1] = tmp
a=[2,4,5,1,2]
bubblesort(a)
for i in range(len(a)):
print a[i]
代表的なデータ型の操作 †
型の大まかな特徴 †
- pythonでは型が暗黙の了解となっている
- 型
- int, float
- iterativeな型:list, set(, str)。これらの間は自由に行き来できる(strはちょっと怪しい)
- tuple
- tupleは静的!(1, 3, 4)[2]などのアクセスが可能。
- dict
- ndarray
- map object
- このままでは使えないので、list, setに渡してやる必要がある(strはダメ)
- 変換
型の相互変換 †
| int | float | str | list | set | dict | ndarray | int | = | float(n) | str(n) | [n] | {n} | {n: m} | np.array([n]) | float | int(x) | = | str(x) | [x] | {x} | {f: x} | np.array([x]) | str | int(s), 失敗でRE, int('0.1')はRE。ord(s)でもOKで、ordは1文字以外だとRE | float(s), 失敗でRE | = | list(s) | set(s) | x | np.array(list(s)) | list | a[i] | a[i] | str(a)は、listのデバッグ出力が文字列として得られる。a: [char]なら"".join(a)、a: [int]なら"".join(list(map(lambda x: chr(x+ord('0')), [0, 3]))) | = | set(a) | ts = [(1, 2), (3, 4), (5, 6)]; dict(ts)。同じようにdict(zip(a, b))などが可能(zipはzip objectでlistを返すわけではないが、list(zip(a,b))で同様になる)。キーだけ指定する場合は、marks = {}.fromkeys(['Math','English','Science'], 0) | np.array(a) | set | for x in s: print(x) | for x in s: print(x) | str(s)、setのデバッグ出力が文字列として得られる | list(s) | = | x | np.array(list(s)) | dict | d[x], xがなければRE | d[x], xがなければRE | str(d)、dictのデバッグ出力が文字列として得られる | list(d)はdのkeys list。dd.keys()は実はdict_keysという型!ペアで欲しいならlist(zip(d.keys(), d.values())) | set(d)はdのkeys set。d.keys()は実はdict_keysという型! | = | np.array(list(d)) | ndarray | v[i] | v[i] | str(a)でデバッグ出力らしきもの(違う)が出る | list(a)かa.tolist() | set(a) | x | = |
二次元配列 †
- 変な作り方をすると、参照になって代入が独立じゃなくなる。毎回リスト内包で作成すること!
型ごとに可能な操作 †
- str以外全部に対してビルトイン関数: all(), any(), enumerate(), len(), max(), min(), sorted(), sum()などが使える
- sequence(list, string)には、reversedが使える。
- sortedはstrを突っ込んでもリストが帰ってくる
| サイズ | 要素追加 | 要素削除 | 反復 | 積 | 和 | 差分 | 検索 | ソート | 逆順 | list | len(a) | push_backがa.append(x), a.insert(i, x)はiの次にxを挿入する | push_backがa.pop()。a.pop(i)は#iを返して#iを消す。del a[i]で#iを消す。a.remove('a')でaを先頭1個削除(削除できないとRE) | [1] * 100 | なし | +, これは.extend(b)と同等 | なし | a.index('x'): xのfirst occurenceを取得 | a.sort() | a.reverse() | set | len(s) | s.add(x) | a.discard(x)がエラー無し。remove(x)はxがないとRE。s.pop()はなんか一個削除して値を返す(順序がない、ハッシュなので)。 | なし | and | or。論理排他和は^。包含関係はa <= b | s-t | x in s, x not in s | setはハッシュなのでソートしてくれない!sorted(s) | なし | dict | len(d) | d[i] = x | d.pop(i)でkeyがiの要素削除して値を返す。d.popitem()で何か一つ削除して値を返す。 | なし | d = {x:d1[x] for x in d1 if x in d2} | なし | なし | d[i]はiがなければRE。d.get(i)はなければNoneを返す。 | sorted(d)だが、これはキーしかソートしてくれないのでsorted(list(zip(d.keys(), d.values()))) | なし | str | len(s) | s + t, O(len(s)+len(t)) | 不可能 | s*3 | なし | なし | なし | 'ab' in s | ''.join(sorted(s)) | ''.list(reversed(s)) |
list †
- listには.countという出現回数を取得する関数がある
str †
- 静的データ構造!!途中で#iの変更をしたくなっても無理。変更にO(n)かかり、基本的に遅い。Javaみたいな感じ。
- 対策:動的文字列は、strではなくlistで管理する
- 'a'+1みたいなことをしたい場合は?めんどいが
chr(ord(s)+1)
- したがって+演算子は毎回新たなオブジェクトを生成するので、あまり行儀が良くない
s = s + "新たな文字列1"
s = s + "新たな文字列2"
. . .
とせずに、配列を使って、
L = []
L.append("新たな文字列1")
L.append("新たな文字列2")
. . .
s = ''.join(L)
とするのが定石イディオム
>>> 'I have a pen'.split()
['I', 'have', 'a', 'pen']
>>> 'aabbababbabbbb'.split('a')
['', '', 'bb', 'b', 'bb', 'bbbb']
>>> 'aabbababbabbbb'.split('aa')
['', 'bbababbabbbb']
- 文字列にはupper, lowerという関数がある
import string
string.ascii_lowercase
‘abcdefghijklmnopqrstuvwxyz’
その他のデータ構造 †
from collections import Counter
Counter([‘apple’,‘red’,‘apple’,‘red’,‘red’,‘pear’])
Counter({‘red’: 3, ‘apple’: 2, ‘pear’: 1})
ファイル †
for line in open("test.txt", "r")
line.strip()
print line
正規表現 †
import re
a = re.search(r'^[a-z]', line)
numpy †
Numpy
Transposeに同値な
Tというメンバ変数らしきものがあるhttps://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.T.html
pythonできれいな2次元グラフを書く
http://qiita.com/kenmatsu4/items/d282054ddedbd68fecb0
パラメータ分布を{coda}パッケージを使ってプロットするとこんな感じです。
ndarray †
- スライスアクセス
- ファンシーアクセス
- 要素アクセス
import numpy as np
ndarr = np.array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]])
indices = [1,1] # row,col
ndarr[tuple(indices)]
逆引き †
np.count_nonzero(v==-1)
np.vecorize(func)(v)
np.zeros(n)。
max(v), min(v)
np.where(a>1)
コーディングイディオム †
便利なビルトイン関数 †
- pow(x, y[, z])
- x^y%zの高速実装
- 競プロのために作られたとしか思えないがRSA暗号で使う
C++ではできないような実装速度が早いアルゴリズム †
- 気軽にsplitとかを前提にしたアルゴリズムを組めるのはいい
- setの|や&
- reversed(range(10))はrange(10)[::-1]でもできる。
内包表記 †
- 内包表記には後置if条件を複数つけることができる。
- [x for x in range(100) if x % 2 if x % 3]
- if-elseもできる。前置になる
- [ i if i%2==0 else str(i) for i in range(10)]
- 速度的にも3倍程度早い
- gotoモジュールはデフォルトではなく、頑張ってインストールしなければならないので残念。多重ループ抜け出しは基本for-elseかフラグしか方法がなさそう。あとは関数化
一括比較・一括処理 †
# long
# 最初の文字と最後の文字両方が一致する
a[1] == b[1] and a[-1] == b[-1]
# short
a[1] + a[-1] == b[1] + b[-1]
# long
t = a % 3
if t == 0:
a = a * 2
elif t == 1:
a = 0
elif t == 2:
a = t * 2
# short
a = [a * 2, 0, t * 2][a % 3]
- if-elseの代わりにand orを使うワンライナー
条件 and True時 or False時
- forのワンライナー。:は一行一個だが、それ以内のものはセミコロンでくっつけられる。
for x in[None]*10:print(a);a+=1
- forでループ変数は絶対に参照しないぞという気構え(range書くより短い)
for _ in [1]*10:
mapオブジェクト、filterオブジェクトなど †
- ジェネレータと呼ばれるらしい
- 評価するには、for文なのでgenerateするか、明示的にlist(map_object)などとする([map_object]はだめ)
参照・ポインタ †
まず †
>>> a = [1,2,3]
>>> b=a
>>> b[0]=3
>>> a
[3, 2, 3]
>>> b
[3, 2, 3]
>>> b += [4]
>>> a
[3, 2, 3, 4]
>>> b
[3, 2, 3, 4]
概要 †
- pythonの代入は全て参照!
- 変数に新たなオブジェクトそのものが代入されるときには、これまでの参照先から変わって新たなオブジェクトが作られた場所を参照するようになる。
- [[]]*nで実装するとダメだったり、クラスの初期値を[]にするとダメになる理由
pythonのポインタのようなもの †
a = 1
id(a)
リストのdeep copy †
>>> a = [1,2,3]
>>> b = a[:] # b = list(a)とか、b = copy.copy(a)でも大丈夫
>>> a
[1, 2, 3]
>>> b
[3, 2, 3]
関数わたし †
- 重要:list, dict, set, bytearrayは、問答無用で参照になる
- 関数に渡された値を変更した際に元の値自体も変更されてしまうかどうかは,オブジェクトの型に依存
- 変更不可(Immutable)な型
- int, float, str, tuple, bytes, frozenset 等
- 変更可能(Mutable)な型
- list, dict, set, bytearray 等
bitwise op. †
その他 †
- 数学変数
- pi, e, infなどは、math.pi, math.e, math.infなどでアクセスす
- pythonのfor内部で添字をいじっても意味ないので注意!!!
- C++ではたまにfor内部でiを加速するが、pythonは毎回代入される。
注意 †
- {}はどっち?
- dictであり、setではない
- s = set()とする
闇魔法 †
メモ †
|