Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
ALPS チュートリアル: Python 
ALPS チュートリアル: Python 
CMSI ハンズオン 
ALPS Collaboration 
http://alps.comp-phys.org/ 
2014-10-16 
1 / 20
ALPS チュートリアル: Python 
Outline 
1 データ型 
2 制御フロー 
3 関数 
4 モジュール 
5 ファイルの読み書き 
6 参考文献 
2 / 20
ALPS チュートリアル: Python 
データ型 
基本的なデータ型 
このセクションではPython で使われる基本的なデータ型を紹介し 
ます. array はnumpy モジュールで定義されている型で,Python 
がもともと持っている型ではありませんが,科学計算では非常に便 
利な性質を持つので紹介します. 
数値int, (long), 
oat, complex 
文字列'hello,python' 
list a = [1, 2, 3] 
tuple b = (1, 2, 3) 
dictionary c = f'apple': 100, 'orange': 200, 'pear': 300g 
set set([1, 2, 3]) 
bool True, False 
array numpy array([1,2,3]) 
3 / 20
ALPS チュートリアル: Python 
データ型 
数値 
整数, 倍精度浮動小数, 複素数の3 種類あります.整数はPython 
のバージョンで扱いが変わります.単精度浮動小数はありません. 
int, (long) 
python3 ではint,long はint に統合されました. 
python2x とpython3x では整数同士の演算で計算結果がちがい 
ます! 
python2: -1/2 = -1, python3: -1/2 = -0.5 

oat は倍精度のみです.単精度はありません. 
complex 
'j' もしくは'J' で虚数部を表す2 + 3j 
実部real(2+3j) = 2, 虚部imag(2+3j) = 3 
型変換を行えます. 
>>> a = 1.8 
>>> int(a) 
1 
>>> a = 3 
>>> float(a) 
3.0 
4 / 20
ALPS チュートリアル: Python 
データ型 
文字列 
>>> s = 'ab:cd:ef' # 文字列の定義 
>>> s = s.split(':') # 指定した文字で文字列を分割 
>>> print s 
['ab', 'cd', 'ef'] 
>>> '-'.join(s) # 指定した文字で文字列同士を結合 
'ab-cd-ef' 
>>> 'a' + 'b' + 'c' # 文字列を結合 
'abc' 
シングルクォートもしくはダブルクォートで囲った文字列で定 
義できます. 
複数行の文字列は"'..."' もしくは"""...""" で囲む 
5 / 20
ALPS チュートリアル: Python 
データ型 
list, tuple 
>>>a = [1,2,3,4,5] # list 
>>>a[0] # インデックスは0 スタート 
1 # 要素1 個だけなら返り値はスカラー 
>>>a[2:4] # 2<=,<4 番目のの要素が返される. 
[3,4] # 複数の要素なら返り値はリスト. 
>>>b = (1,2,3,4,5) # tuple 
>>>b[1:] # ':' の値を省くこともできる 
(2, 3, 4, 5) 
ここではリストの要素として数値のみを扱ったが,python オ 
ブジェクトなら何でもリストの要素として扱える 
6 / 20
ALPS チュートリアル: Python 
データ型 
list のメソッド 
>>>a.reverse() # 要素の並びを逆にする 
>>>a # a そのものが変更されるので注意! 
[5, 4, 3, 2, 1] 
>>>a.pop() # リストの最後尾の要素を取り出す. 
1 # 返り値は取り出された要素 
>>>a 
[5, 4, 3, 2] 
>>>a.sort() 
>>>a 
[2, 3, 4, 5] 
ここではリストの要素として数値のみを扱ったが,python オ 
ブジェクトなら何でもリストの要素として扱える 
7 / 20
ALPS チュートリアル: Python 
データ型 
list とtuple の違う点(1) 
>>>b = (1) # これはtuple にならない! 
>>>type(b) 
int # 整数扱いになる 
>>>b = (1,) # 要素1 個のtuple を定義する 
>>>type(b) 
tuple # これはちゃんとtuple になっている 
>>>a = [1] # これはlist 
>>>type(a) 
list 
8 / 20
ALPS チュートリアル: Python 
データ型 
list とtuple の違う点(2) 
>>>b += (2, 3, 3) # 要素を付け加えることはできる 
>>>b 
(1, 2, 3, 3) 
>>>b[3] = 5 # 要素を変更することはできない 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: 'tuple' object does not support item assignment 
要素1 個の場合の扱いが違う 
tuple の要素の値は変更できない. 
tuple は辞書のキーに登録できる.list は不可. 
9 / 20
ALPS チュートリアル: Python 
データ型 
list のコピー 
浅いコピーと深いコピーの2 種類ある 
浅いコピーではオブジェ 
クトのアドレスをコピー 
する 
深いコピーではオブジェ 
クトの値をコピーする 
a 
アドレス値 
0x7fff5fbffae8 101 
b 
アドレス値 
0x6aff5fbff128 0x7fff5fbffae8 
a 
アドレス値 
0x7fff5fbffae8 101 
b 
アドレス値 
0x6aff5fbff128 101 
>>>a = [101, 102, 103] 
>>>b = a # アドレスをコピー 
>>>a[1] = 333 
>>>print a, b 
[101, 333, 103] [101, 333, 103] 
>>>b = a[:] # 値をコピー 
>>>a[1] = 444 
>>>print a, b 
[101, 444, 103] [101, 333, 103] 
10 / 20
ALPS チュートリアル: Python 
データ型 
ネストされたlist のコピー 
浅いコピーになってしまう例 
>>>a = [1, [2, 3]] 
>>>b = a[:] 
>>>a[0] = 4 
>>>a[1][0] = 5 
>>>print a, b 
[4, [5, 3]] [1, [5, 3]] 
>>> 
深いコピー 
>>>import copy 
>>>a = [1, [2, 3]] 
>>>b = copy.deepcopy(a) 
>>>a[0] = 101 
>>>a[1][0] = 102 
>>>print a, b 
[101, [102, 3]] [1, [2, 3]] 
ネストされているとスライス':' で返されるのがアドレスに 
なってしまう 
ネストされたlist で深いコピーをするにはcopy モジュールの 
deepcopy を使う 
11 / 20
ALPS チュートリアル: Python 
データ型 
辞書型の使い方 
>>>dic = {'key0': 0, 'key1': 1} # key:value の組を登録 
>>>dic['key2'] = 2 # key2:2 を登録 
>>>dic.keys() # 辞書に登録されている全てのkey 
['key2', 'key1', 'key0'] 
>>>dic.values() # 全てのval 
[2, 1, 0] 
>>>dic.items() # 全てのkey:val の組を表示 
[('key2', 2), ('key1', 1), ('key0', 0)] 
>>>del dic['key0'] # 辞書からkey を削除 
>>>dic.items() 
[('key2', 2), ('key1', 1)] 
辞書の要素はソートされていない.登録順なども関係ない. 
12 / 20
ALPS チュートリアル: Python 
制御フロー 
if-elif-else 文の使い方 
if-elif-else で条件分岐を作れる. 
>>>if a > 0: 
>>> print '0' 
>>>elif a == 0: 
>>> print '1' 
>>>else: 
>>> print '2' 
>>> 
>>> 
三項演算子 
>>>val = val1 if cond1 else val2 
13 / 20
ALPS チュートリアル: Python 
制御フロー 
for 文の使い方 
>>>for i in ('a', 'b', 'c', 'd'): 
>>> print i, # コンマで改行を抑制している 
a b c d 
アンパック代入とenumerate() 
>>>for i,j in enumerate(('a', 'b', 'c', 'd')): 
>>> print i, j 
0 a 
1 b 
... 
アンパック代入はpython で使える一般的なテクニックです. 
>>>i,j,k = ['a', 'b', 'c'] 
14 / 20
ALPS チュートリアル: Python 
制御フロー 
while 文の使い方 
a = 0 
while a in range(10): 
a += 1 
if a < 3: 
continue 
elif a == 8: 
break 
print a 
カレントディレクトリに上の内容でexWhile.py というファイ 
ルを作ってimport してみましょう 
"val in シークエンス:" というフレーズはwhile だけでなくif, 
for など至る所で使えます 
continue, break も同じくif, for などでも使えます 
15 / 20
ALPS チュートリアル: Python 
関数 
関数 
>>> def f(x, y): 
>>> ....z = x * y # 空白4 つのインデント! 
>>> ....for i in [1, 2, 3]: 
>>> .... z += i 
>>> ....return z 
>>> 
>>> f(2,3) 
12 
def 関数名(変数,...): で関数が定義できます 
Python ではインデント(ここの例では空白4 つ) によりスコー 
プを制御します 
16 / 20
ALPS チュートリアル: Python 
モジュール 
Python プログラムの階層構造 
プログラムファイルのディレクトリ構成== 名前空間 
モジュール 
1 つの"hoge.py" ファイルが1 つのモジュール 
パッケージ 
ファイルの階層構造 
pyalps/ 
alea.py 
dataset.py 
モジュールの階層構造 
pyalps.alea.class.method 
pyalps.dataset.class.method 
17 / 20
ALPS チュートリアル: Python 
モジュール 
モジュールの読み込み 
>>> import fff as f # 別名をつけてインポート 
>>> f.ggg(x, y) 
... 
>>> from fff import * # fff 以下のすべてをインポート 
>>> ggg(x, y) # 名前空間fff が外れる 
... 
>>> from fff import ggg as g # ggg のみを指定してインポート 
>>> g(x, y) 
fff モジュール中のggg 関数を呼び出しています. 
呼び出し方により名前空間の階層が変わっています. 
18 / 20
ALPS チュートリアル: Python 
ファイルの読み書き 
ファイルの読み書き 
ファイルから1行ごとにデータを読み込む方法 
for line in open('dat.txt', 'r'): 
items = line.split('') 
print items[0], float(items[1]) 
入力データ(dat.txt) 
a 3.432 
b 1.42 
c 2.159 
open でdat.txt ファイルをreadonly で読み込む 
読み込んだファイルを1 行毎に処理する.読み込まれた行は1 
つのストリングとして扱われるので区切り文字(今の場合空 
白)で分割している. 
読み込んだストリングを浮動小数点にキャストしている. 
上の例ではfor 文の終了とともにファイルは自動で閉じられる.し 
かし,一般的には 
f = open('dat.txt', 'r') として読み込んだ場合,ファイルを読 
み終えたらf.close() で閉じなければならない. 
19 / 20
ALPS チュートリアル: Python 
参考文献 
参考文献 
科学技術計算のためにpython を始めよう 
http://www.ike-dyn.ritsumei.ac.jp/~uchida/ 
scipy-lecture-notes/intro/index.html 
初心者のはまりどころhttp://webtech-walker.com/ 
archive/2010/10/13191417.html 
Doug Hellmann さんhttp://doughellmann.com 
標準モジュールなどの使い方が例とともに書いてあり分かりや 
すい 
20 / 20

More Related Content

ALPSチュートリアル(4) Python入門

  • 1. ALPS チュートリアル: Python ALPS チュートリアル: Python CMSI ハンズオン ALPS Collaboration http://alps.comp-phys.org/ 2014-10-16 1 / 20
  • 2. ALPS チュートリアル: Python Outline 1 データ型 2 制御フロー 3 関数 4 モジュール 5 ファイルの読み書き 6 参考文献 2 / 20
  • 3. ALPS チュートリアル: Python データ型 基本的なデータ型 このセクションではPython で使われる基本的なデータ型を紹介し ます. array はnumpy モジュールで定義されている型で,Python がもともと持っている型ではありませんが,科学計算では非常に便 利な性質を持つので紹介します. 数値int, (long), oat, complex 文字列'hello,python' list a = [1, 2, 3] tuple b = (1, 2, 3) dictionary c = f'apple': 100, 'orange': 200, 'pear': 300g set set([1, 2, 3]) bool True, False array numpy array([1,2,3]) 3 / 20
  • 4. ALPS チュートリアル: Python データ型 数値 整数, 倍精度浮動小数, 複素数の3 種類あります.整数はPython のバージョンで扱いが変わります.単精度浮動小数はありません. int, (long) python3 ではint,long はint に統合されました. python2x とpython3x では整数同士の演算で計算結果がちがい ます! python2: -1/2 = -1, python3: -1/2 = -0.5 oat は倍精度のみです.単精度はありません. complex 'j' もしくは'J' で虚数部を表す2 + 3j 実部real(2+3j) = 2, 虚部imag(2+3j) = 3 型変換を行えます. >>> a = 1.8 >>> int(a) 1 >>> a = 3 >>> float(a) 3.0 4 / 20
  • 5. ALPS チュートリアル: Python データ型 文字列 >>> s = 'ab:cd:ef' # 文字列の定義 >>> s = s.split(':') # 指定した文字で文字列を分割 >>> print s ['ab', 'cd', 'ef'] >>> '-'.join(s) # 指定した文字で文字列同士を結合 'ab-cd-ef' >>> 'a' + 'b' + 'c' # 文字列を結合 'abc' シングルクォートもしくはダブルクォートで囲った文字列で定 義できます. 複数行の文字列は"'..."' もしくは"""...""" で囲む 5 / 20
  • 6. ALPS チュートリアル: Python データ型 list, tuple >>>a = [1,2,3,4,5] # list >>>a[0] # インデックスは0 スタート 1 # 要素1 個だけなら返り値はスカラー >>>a[2:4] # 2<=,<4 番目のの要素が返される. [3,4] # 複数の要素なら返り値はリスト. >>>b = (1,2,3,4,5) # tuple >>>b[1:] # ':' の値を省くこともできる (2, 3, 4, 5) ここではリストの要素として数値のみを扱ったが,python オ ブジェクトなら何でもリストの要素として扱える 6 / 20
  • 7. ALPS チュートリアル: Python データ型 list のメソッド >>>a.reverse() # 要素の並びを逆にする >>>a # a そのものが変更されるので注意! [5, 4, 3, 2, 1] >>>a.pop() # リストの最後尾の要素を取り出す. 1 # 返り値は取り出された要素 >>>a [5, 4, 3, 2] >>>a.sort() >>>a [2, 3, 4, 5] ここではリストの要素として数値のみを扱ったが,python オ ブジェクトなら何でもリストの要素として扱える 7 / 20
  • 8. ALPS チュートリアル: Python データ型 list とtuple の違う点(1) >>>b = (1) # これはtuple にならない! >>>type(b) int # 整数扱いになる >>>b = (1,) # 要素1 個のtuple を定義する >>>type(b) tuple # これはちゃんとtuple になっている >>>a = [1] # これはlist >>>type(a) list 8 / 20
  • 9. ALPS チュートリアル: Python データ型 list とtuple の違う点(2) >>>b += (2, 3, 3) # 要素を付け加えることはできる >>>b (1, 2, 3, 3) >>>b[3] = 5 # 要素を変更することはできない Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment 要素1 個の場合の扱いが違う tuple の要素の値は変更できない. tuple は辞書のキーに登録できる.list は不可. 9 / 20
  • 10. ALPS チュートリアル: Python データ型 list のコピー 浅いコピーと深いコピーの2 種類ある 浅いコピーではオブジェ クトのアドレスをコピー する 深いコピーではオブジェ クトの値をコピーする a アドレス値 0x7fff5fbffae8 101 b アドレス値 0x6aff5fbff128 0x7fff5fbffae8 a アドレス値 0x7fff5fbffae8 101 b アドレス値 0x6aff5fbff128 101 >>>a = [101, 102, 103] >>>b = a # アドレスをコピー >>>a[1] = 333 >>>print a, b [101, 333, 103] [101, 333, 103] >>>b = a[:] # 値をコピー >>>a[1] = 444 >>>print a, b [101, 444, 103] [101, 333, 103] 10 / 20
  • 11. ALPS チュートリアル: Python データ型 ネストされたlist のコピー 浅いコピーになってしまう例 >>>a = [1, [2, 3]] >>>b = a[:] >>>a[0] = 4 >>>a[1][0] = 5 >>>print a, b [4, [5, 3]] [1, [5, 3]] >>> 深いコピー >>>import copy >>>a = [1, [2, 3]] >>>b = copy.deepcopy(a) >>>a[0] = 101 >>>a[1][0] = 102 >>>print a, b [101, [102, 3]] [1, [2, 3]] ネストされているとスライス':' で返されるのがアドレスに なってしまう ネストされたlist で深いコピーをするにはcopy モジュールの deepcopy を使う 11 / 20
  • 12. ALPS チュートリアル: Python データ型 辞書型の使い方 >>>dic = {'key0': 0, 'key1': 1} # key:value の組を登録 >>>dic['key2'] = 2 # key2:2 を登録 >>>dic.keys() # 辞書に登録されている全てのkey ['key2', 'key1', 'key0'] >>>dic.values() # 全てのval [2, 1, 0] >>>dic.items() # 全てのkey:val の組を表示 [('key2', 2), ('key1', 1), ('key0', 0)] >>>del dic['key0'] # 辞書からkey を削除 >>>dic.items() [('key2', 2), ('key1', 1)] 辞書の要素はソートされていない.登録順なども関係ない. 12 / 20
  • 13. ALPS チュートリアル: Python 制御フロー if-elif-else 文の使い方 if-elif-else で条件分岐を作れる. >>>if a > 0: >>> print '0' >>>elif a == 0: >>> print '1' >>>else: >>> print '2' >>> >>> 三項演算子 >>>val = val1 if cond1 else val2 13 / 20
  • 14. ALPS チュートリアル: Python 制御フロー for 文の使い方 >>>for i in ('a', 'b', 'c', 'd'): >>> print i, # コンマで改行を抑制している a b c d アンパック代入とenumerate() >>>for i,j in enumerate(('a', 'b', 'c', 'd')): >>> print i, j 0 a 1 b ... アンパック代入はpython で使える一般的なテクニックです. >>>i,j,k = ['a', 'b', 'c'] 14 / 20
  • 15. ALPS チュートリアル: Python 制御フロー while 文の使い方 a = 0 while a in range(10): a += 1 if a < 3: continue elif a == 8: break print a カレントディレクトリに上の内容でexWhile.py というファイ ルを作ってimport してみましょう "val in シークエンス:" というフレーズはwhile だけでなくif, for など至る所で使えます continue, break も同じくif, for などでも使えます 15 / 20
  • 16. ALPS チュートリアル: Python 関数 関数 >>> def f(x, y): >>> ....z = x * y # 空白4 つのインデント! >>> ....for i in [1, 2, 3]: >>> .... z += i >>> ....return z >>> >>> f(2,3) 12 def 関数名(変数,...): で関数が定義できます Python ではインデント(ここの例では空白4 つ) によりスコー プを制御します 16 / 20
  • 17. ALPS チュートリアル: Python モジュール Python プログラムの階層構造 プログラムファイルのディレクトリ構成== 名前空間 モジュール 1 つの"hoge.py" ファイルが1 つのモジュール パッケージ ファイルの階層構造 pyalps/ alea.py dataset.py モジュールの階層構造 pyalps.alea.class.method pyalps.dataset.class.method 17 / 20
  • 18. ALPS チュートリアル: Python モジュール モジュールの読み込み >>> import fff as f # 別名をつけてインポート >>> f.ggg(x, y) ... >>> from fff import * # fff 以下のすべてをインポート >>> ggg(x, y) # 名前空間fff が外れる ... >>> from fff import ggg as g # ggg のみを指定してインポート >>> g(x, y) fff モジュール中のggg 関数を呼び出しています. 呼び出し方により名前空間の階層が変わっています. 18 / 20
  • 19. ALPS チュートリアル: Python ファイルの読み書き ファイルの読み書き ファイルから1行ごとにデータを読み込む方法 for line in open('dat.txt', 'r'): items = line.split('') print items[0], float(items[1]) 入力データ(dat.txt) a 3.432 b 1.42 c 2.159 open でdat.txt ファイルをreadonly で読み込む 読み込んだファイルを1 行毎に処理する.読み込まれた行は1 つのストリングとして扱われるので区切り文字(今の場合空 白)で分割している. 読み込んだストリングを浮動小数点にキャストしている. 上の例ではfor 文の終了とともにファイルは自動で閉じられる.し かし,一般的には f = open('dat.txt', 'r') として読み込んだ場合,ファイルを読 み終えたらf.close() で閉じなければならない. 19 / 20
  • 20. ALPS チュートリアル: Python 参考文献 参考文献 科学技術計算のためにpython を始めよう http://www.ike-dyn.ritsumei.ac.jp/~uchida/ scipy-lecture-notes/intro/index.html 初心者のはまりどころhttp://webtech-walker.com/ archive/2010/10/13191417.html Doug Hellmann さんhttp://doughellmann.com 標準モジュールなどの使い方が例とともに書いてあり分かりや すい 20 / 20