好奇心の横断歩道を創る!

自分の思考をラバーダック・デバッグするためのブログ

PythonでできてCythonでできなかった表記方法2つ

 

実行環境は、
・Windows10
・Python3.7.3
・Cython0.29.6
AnacondaでインストールしたJupyter-Notebook上で実行

 

 

PythonでできてCythonでできなかった表記①
N**(-n)は使えない (nは1以上の整数)

Pythonでいう

a = 10**(-2) # a == 0.01
b = 10**(-5) # b == 0.00001

をCythonで実行しようとして

cdef double a = 10**(-2) # a == 0.0
cdef double b
b = 10**(-5) # b == 0.0

 のように書いたところ、a, b ともに0.0が代入されている。どうやら
10**(-n) という書き方を、Cythonは受け付けてくれないらしい。

つまり、こう書けということ。

cdef double c = 0.01, d  # c == 0.01
d = 0.00001 # d == 0.00001

0であってはならない変数が0だったら、これを疑うのもアリ。自分はこれに気づかず、whileの無限ループにはまりました。


 

PythonでできてCythonでできなかった表記②
X, Y = A, B は使えない

Pythonでいう

x, y, z = 0, 0, 0    # x == y == z == 0

をCythonで書こうとして、

cdef double x, y, z
x, y, z = 0.0, 0.0, 0.0    # コンパイルエラーが発生。 もちろん、int でもダメ。

 とすると、コンパイルエラーが発生。C/C++でこういうタプルな書き方は、(少なくとも自分の知識の範囲では)できないから、そういうことと関係するのかもしれないと思う。
改めて書くまでもないかもしれないが、正しくは

cdef double x = 0.0, y = 0.0, z = 0.0   # x == 0.0, y == 0.0, z == 0.0

のように書けばよい。
なお、Cythonでタプルを扱うことは可能らしい。少し調べてみたところ、慣れてないと難しい書き方のようだ。

 

今回は以上。それではまたいつか。