Cython系列3 函式定義

2021-10-05 02:04:28 字數 1889 閱讀 9233

本文主要介紹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語句。建立標量函式語法結...