本文主要介紹cython支援的三種函式定義的方式,def,cdef以及cpdef以求兩數的和為例
# 接收python物件作為輸入,返回python物件
# 可以像python中函式那樣使用
defsum_
(a, b)
:return a + b
# 如果是如下情形,這也是個python函式,首先把傳入的python型別的a,b轉成c型別,然後相加,再把結果轉成python型別返回
defsum_
(int a,
int b)
:return a + b
// 引數型別和返回值型別都被靜態宣告了,都為c型別
// cdef定義的函式不允許從定義的模組外部呼叫
// 如果cdef沒有指定返回值型別,返回相應的python型別
cdef long
sum_
(long a,
long b)
:return a + b
// 如果希望能夠實現外部的呼叫,可以使用python函式對其進行封裝
(a, b)
:return
sum_
(a, b)
# cpdef : cdef 和 def的混合
# 解決了上述的外部呼叫的問題,無需顯式的對sum_進行封裝
cpdef long sum_(
long a,
long b)
:return a + b
# 作用相當於
cdef long sum_(
long a,
long b)
:# (1)
return a + b
defsum_
(a, b)
:# (2)
return sum_(a, b)
如果我們用cython呼叫sum_,就是呼叫c版本的sum_,就是(1),如果用python呼叫,就相當於呼叫了python封裝版本的sum_,就是(2)。
所以也可以看出,因為cpdef的特點,它定義的函式的引數和返回值必須既可以是python型別的也可以是c型別的,所以像在c中的指標型別等就無法作為這類函式的引數了。
接下來還有乙個問題就是異常的處理
對於乙個pure python的版本來說,除法分母為0,會產生zerodivisionerror
可是對於cdef或者cpdef,雖然會出現zerodivisionerror,但是仍然會返回0
為了正確的處理這個異常,cython提供了一種語法來解決這個問題
# cpdef也一樣
# 如果except後面的數字是可能作為正確的返回值出現的,就需要加?
# 如果except後面的數字的出現肯定能夠說明有錯誤,就不需要加?
cdef int divide_(
int x,
int y)
except-1
cdef int divide_(
int x,
int y)
except? 0
參考資料《cython-a guide for python programmers》chapter3 cython in depth
js系列3 函式
函式的宣告有兩種方法 第一種方法 function sayhi 形參1 形參2,第二種方法 vart function t 函式後面加上括號就可以實現呼叫。vart function t sayhi 實參1 實參2,形參可以有,也可以沒有,數量不限。多個引數之間用逗號隔開。其實,js有一些預配置,可...
執行的Cython的3種方法
執行條件 python2.7 第一種 fib.pyx def fib long n returns the nth fibonacci number.cdef long a 0,b 1,i for i in range n a,b a b,a return a test.py import sys ...
Sql Server系列 自定義函式
使用者自定義函式可以像系統函式一樣在查詢或儲存過程中呼叫,可以接受引數 執行操作並將操作結果以值的形式返回。返回值可以是單個標量或結果集。1.標量函式 標量函式返回乙個確定型別的標量值,對於多語句的標量函式,定義在begin end塊中的函式體包含一系列返回單個值的t sql語句。建立標量函式語法結...