プログラミング

概要

  • つらいけどpython3の勉強

目次

下位ページ

概要

  • 最近流行ってるので習得しなければならない…

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

開発を始める時

  • はじめて
    virtualenv envname
    pip3 install numpy
  • 二回目以降
    . envname/bin/activate
    pip list # envname環境でのパッケージ
  • 開発を終える時
    deactivate

参考

文法

    • セミコロンなし,インデントが文法.
    • 配列は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, ...):.行末に:が必要
      • *でargs, **でパラメータを渡せる(参照
    • intも含め配列の関数渡しも、「すべて」参照渡し
    • a={}でc++でいうmapになる
      • pythonのdictは存在しないキーを出力しようとするとデフォルトエラーなので、そうじゃなくしたいならgetを使う。
    • printf
      • print aでprintf("%d\n",a);
      • print a,でprintf("%d",a);
  • ☆☆
    • 空オブジェクトは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はちょっと怪しい)
      • strは静的!
    • tuple
      • tupleは静的!(1, 3, 4)[2]などのアクセスが可能。
    • dict
    • ndarray
      • listしか突っ込めない
    • map object
      • このままでは使えないので、list, setに渡してやる必要がある(strはダメ)
  • 変換

型の相互変換

intfloatstrlistsetdictndarray
int=float(n)str(n)[n]{n}{n: m}np.array([n])
floatint(x)=str(x)[x]{x}{f: x}np.array([x])
strint(s), 失敗でRE, int('0.1')はRE。ord(s)でもOKで、ordは1文字以外だとREfloat(s), 失敗でRE=list(s)set(s)xnp.array(list(s))
lista[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))で同様になる)np.array(a)
setfor x in s: print(x)for x in s: print(x)str(s)、setのデバッグ出力が文字列として得られるlist(s)=xnp.array(list(s))
dictd[x], xがなければREd[x], xがなければREstr(d)、dictのデバッグ出力が文字列として得られるlist(d)はdのkeys list。dd.keys()は実はdict_keysという型!set(d)はdのkeys set。d.keys()は実はdict_keysという型!=np.array(list(d))
ndarrayv[i]v[i]str(a)でデバッグ出力らしきもの(違う)が出るlist(a)かa.tolist()set(a)x=

二次元配列

  • 変な作り方をすると、参照になって代入が独立じゃなくなる。毎回リスト内包で作成すること!

型ごとに可能な操作

サイズ要素追加要素削除反復差分検索ソート逆順
listlen(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の始めを取得a.sort()a.reverse()
setlen(s)s.add(x)a.discard(x)がエラー無し。remove(x)はxがないとRE。s.pop()は何でもいいから一個削除して値を返す。なしandor(「違うの」=論理排他和は^)s-t

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)

とするのが定石イディオム
  • split
    • これは便利
    • 複数文字delimiterもできる
>>> 'I have a pen'.split()
['I', 'have', 'a', 'pen']
>>> 'aabbababbabbbb'.split('a')
['', '', 'bb', 'b', 'bb', 'bbbb']
>>> 'aabbababbabbbb'.split('aa')
['', 'bbababbabbbb']

ファイル

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)]

コーディングイディオム

  • swap
a, b = b, a

メモ


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS