#!/usr/bin/env python # coding: utf-8 # # 2015-05-20 資料 # # 力学系のシミュレーションをするのに最低限必要なこと # # + 関数を定義すること # + 関数を任意の回数繰り返し適用すること # # ## 関数定義 # # ポイント # + `def` # + 4つの空白 # In[1]: def f(x): return x ** 2 # ## 関数呼び出し # In[2]: f(10) # In[3]: def g(x): return x * 2 # In[6]: # Integer -> Integer g(10) # In[5]: # Float -> Float g(2.0) # In[7]: # List -> List (期待通りではない) g([1, 2, 3]) # ## `for` ループ # # リストに対する操作は `for`ループを使う (`numpy`を使わないならば ... ) # In[8]: x = [1, 2, 3] for i in x: print(i * 2) # リストを返すようにするにはこうする # In[11]: y = [] for i in x: y.append(i * 2) y # もっとよい方法 # In[12]: [i * 2 for i in x] # `for` は色々な局面で現れるのでマスターしておく。ただし数値計算をする場合には頼りすぎないこと # ## モジュール # # 自分で作った関数をファイルに保存しておく方法。IPythonから呼び出す場合は, IPython のカレントディレクトリをファイルがある場所に移動しておく。 # In[14]: # カレントディレクトリへのパスを表示 get_ipython().run_line_magic('pwd', '') # In[15]: # カレントディレクトリのファイルをリストアップ get_ipython().run_line_magic('ls', '') # In[18]: # ファイルの内容を表示 get_ipython().run_line_magic('cat', 'note.py') # In[19]: # ファイルを実行 get_ipython().run_line_magic('run', 'note.py') # In[20]: logistic(0.2) # In[21]: logistic_path(0.2, 5) # In[22]: for x in logistic_gen(0.2, 5): print(x) # ### ジェネレータ # # 上で定義されている `logistic_gen` はジェネレータ関数と呼ばれるもの. 関数定義の中で `return` の代わりに `yield` を使っている. ループの中で`yield` を使うと, `yield`文が実行されるたびに関数の実行が一時停止する. デザイン上の理由でたくさんのデータを返す関数を作るよりも必要なデータをひとつずつ出力するほうが望ましい場合に使う # In[36]: def pm_gen(maxnum): n = 0 while n < maxnum: if n % 2 == 0: yield 1 else: yield -1 n += 1 # In[37]: list(pm_gen(10)) # ## クラス # In[39]: get_ipython().run_line_magic('cat', 'klass.py') # In[41]: run klass # In[42]: A = np.array([[0.9, 0.0], [0.0, -0.5]]) # In[43]: ct = Linear(A) # In[44]: x = np.array([2, 3]) # In[45]: for y in run(ct, x, 10): print(y) # ### ダックタイピング # # 特定のクラスのインスタンスに対して動作する関数を定義したとする. 他のクラスのインスタンスが, その関数が正常に動作するのに必要な性質を備えていれば, クラスが違っても関数が正常に実行される # In[46]: nu = NoUse() # In[47]: list(run(nu, 1, 10)) # In[ ]: