Python3 モジュール化 (相対パスに注意)
pythonに関わらず、アプリを開発しているときに独自のモジュールを作ることはよくあると思います。
そこで注意するべき点について紹介します。
ファイル構造をこのようにします。
work/ |--mymodule.py `--call.py
各ファイルを次のように編集します。
def greet(): print("hello")
from mymodule import greet def call(): greet() if __name__ == "__main__": call()
call.pyを実行すると、
$ python3 call.py hello
となります。
では、さらに上の階層から、call.pyを呼び出す場合を考えましょう。
top/ |--main.py `--work/ |--mymodule.py `--call.py
from work.call import call call()
$ python3 main.py Traceback (most recent call last): File "main.py", line 1, in <module> from work.call import call File "~/top/work/call.py", line 1, in <module> from mymodule import greet ModuleNotFoundError: No module named 'mymodule'
このように実行に失敗します。
なぜこうなったか
pythonではプログラムを実行すると、実行されたディレクトリ + sys.pathに保存されたパス の中から名前解決を行おうとします。
一つ目の例では、実行されたディレクトリ(work)内にmymodule.pyがあったため、問題なく実行できました。 しかし、二つ目の例では実行されたディレクトリ(top)内にmymodule.pyがなく、sys.pathにもworkディレクトリが登録されていなかったため、実行できませんでした。
これを動作させるためには、workディレクトリをsys.pathに登録すればよいです。
import sys sys.path.append("work/") from work.call import call call()
ペル方程式
x2-dy2=1 という形で書ける方程式をペル方程式と呼びます。
(x,y) = (1,0)は自明な解となっていますが,ペル方程式には非自明な解が存在することが保証されています。
この方程式の一つの解を見つけたとしましょう。 ここで,
という数を考えます。
この数を2乗してみます。
ここで得られる, もペル方程式の解になるらしいです。
代入して調べてみると確かにそうなっています。
つまり,一つの解が分かれば連鎖的に他の解も求まるということ。
とても面白い。
平方根は3つで1セット??
python3 文字列操作:分割
python3での文字列の分割にはsplit関数を使います。 使い方は以下の通りです。
string = "abc.def.ghi" splist = string.split(".") print(splist) # => ['abc', 'def', 'ghi']
split関数の引数に分割文字を指定することで、文字列を分割することができます。
結構使えますので、覚えておきたいですね。
python3 アノテーションについて
アノテーションとは要は注釈のことです。
コメントでつけてもいいんですが、関数の引数と戻り値に関しては正式な書き方があるので、そちらを使ったほうが良いでしょう。
以下のように使います。
def multi(x :int , y :int) -> str: return f'{x*y}'
このようにすることで、一目で入出力が分かりますね!
可読性を高めるためにも積極的に使っていきましょう〜