<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • python函數(shù)指針表 python的指針和c的指針

            python ctypes 怎么處理函數(shù)返回的一般指針

            test.c(動態(tài)庫源代碼)

            創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比太原網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式太原網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋太原地區(qū)。費用合理售后完善,十年實體公司更值得信賴。

            [cpp] view plain copy

            // 編譯生成動態(tài)庫: gcc -g -fPIC -shared -o libtest.so test.c

            #include stdio.h

            #include string.h

            #include stdlib.h

            typedef struct StructPointerTest

            {

            char name[20];

            int age;

            }StructPointerTest, *StructPointer;

            StructPointer test() // 返回結(jié)構(gòu)體指針

            {

            StructPointer p = (StructPointer)malloc(sizeof(StructPointerTest));

            strcpy(p-name, "Joe");

            p-age = 20;

            return p;

            }

            編譯:gcc -g -fPIC -shared -o libtest.so test.c

            call.py(python調(diào)用C語言生成的動態(tài)庫):

            [python] view plain copy

            #!/bin/env python

            # coding=UTF-8

            from ctypes import *

            #python中結(jié)構(gòu)體定義

            class StructPointer(Structure):

            _fields_ = [("name", c_char * 20), ("age", c_int)]

            if __name__ == "__main__":

            lib = cdll.LoadLibrary("./libtest.so")

            lib.test.restype = POINTER(StructPointer)

            p = lib.test()

            print "%s: %d" %(p.contents.name, p.contents.age)

            最后運行結(jié)果:

            [plain] view plain copy

            [zcm@c_py #112]$make clean

            rm -f *.o libtest.so

            [zcm@c_py #113]$make

            gcc -g -fPIC -shared -o libtest.so test.c

            [zcm@c_py #114]$./call.py

            Joe: 20

            [zcm@c_py #115]$

            python函數(shù)有哪些

            1、print()函數(shù):打印字符串;

            2、raw_input()函數(shù):從用戶鍵盤捕獲字符;

            3、len()函數(shù):計算字符長度;

            4、format()函數(shù):實現(xiàn)格式化輸出;

            5、type()函數(shù):查詢對象的類型;

            6、int()函數(shù)、float()函數(shù)、str()函數(shù)等:類型的轉(zhuǎn)化函數(shù);

            7、id()函數(shù):獲取對象的內(nèi)存地址;

            8、help()函數(shù):Python的幫助函數(shù);

            9、s.islower()函數(shù):判斷字符小寫;

            10、s.sppace()函數(shù):判斷是否為空格;

            11、str.replace()函數(shù):替換字符;

            12、import()函數(shù):引進(jìn)庫;

            13、math.sin()函數(shù):sin()函數(shù);

            14、math.pow()函數(shù):計算次方函數(shù);

            15、os.getcwd()函數(shù):獲取當(dāng)前工作目錄;

            16、listdir()函數(shù):顯示當(dāng)前目錄下的文件;

            17、time.sleep()函數(shù):停止一段時間;

            18、random.randint()函數(shù):產(chǎn)生隨機數(shù);

            19、range()函數(shù):返回一個列表,打印從1到100;

            20、file.read()函數(shù):讀取文件返回字符串;

            21、file.readlines()函數(shù):讀取文件返回列表;

            22、file.readline()函數(shù):讀取一行文件并返回字符串;

            23、split()函數(shù):用什么來間隔字符串;

            24、isalnum()函數(shù):判斷是否為有效數(shù)字或字符;

            25、isalpha()函數(shù):判斷是否全為字符;

            26、isdigit()函數(shù):判斷是否全為數(shù)字;

            27、 lower()函數(shù):將數(shù)據(jù)改成小寫;

            28、upper()函數(shù):將數(shù)據(jù)改成大寫;

            29、startswith(s)函數(shù):判斷字符串是否以s開始的;

            30、endwith(s)函數(shù):判斷字符串是否以s結(jié)尾的;

            31、file.write()函數(shù):寫入函數(shù);

            32、file.writeline()函數(shù):寫入文件;

            33、abs()函數(shù):得到某數(shù)的絕對值;

            34、file.sort()函數(shù):對書數(shù)據(jù)排序;

            35、tuple()函數(shù):創(chuàng)建一個元組;

            36、find()函數(shù):查找 返回的是索引;

            37、dict()函數(shù):創(chuàng)建字典;

            38、clear()函數(shù):清楚字典中的所有項;

            39、copy()函數(shù):復(fù)制一個字典,會修改所有的字典;

            40、 get()函數(shù):查詢字典中的元素。

            …………

            python中,能對函數(shù)傳遞文件指針類型的參數(shù)嗎

            如果你用C給Matlab寫過MEX程序,那么這個問題是很容易理解的(好像每次討論Python問題時我總是把Matlab搬了出來…… 《在Matlab中把struct當(dāng)成Python中的Dictionary使用》《Matlab和Python的幾種數(shù)據(jù)類型的比較》)。

            既然提到了MEX,就簡單說一下:

            一個Matlab可能形如

            function ret=add3(a,b,c)

            如果在C的層面實現(xiàn)這個函數(shù),就會看到另一種景象:

            void mexFunction(int nlhs,mxArray * plhs[],int nrhs,const mxArray * prhs[])

            a,b,c三個參數(shù)的地址放在一個指針數(shù)組里,然后把這個指針數(shù)組的首地址作為參數(shù)prhs傳遞給函數(shù),這說明Matlab函數(shù)的參數(shù)是傳遞指針的,而不是值傳遞。

            縱然是傳遞的指針,但是卻不能在函數(shù)里改變實參的值,因為標(biāo)記為“const”了。

            Python是開放源碼的,我沒有看。所以下面很多東西是猜的。

            Python在函數(shù)的參數(shù)傳遞時用的什么手法?實驗一下(使用ActivePython2.5):

            首先介紹一個重要的函數(shù):

            help(id)

            Help on built-in function id in module __builtin__:

            id(...)

            id(object) - integer

            Return the identity of an object. This is guaranteed to be unique among

            simultaneously existing objects. (Hint: it's the object's memory address.)

            看最后括號里那句:Hint:it's the object's address.(它是對象的地址)

            有了這個函數(shù),下面的事情就方便多了。

            a=0

            id(a)

            3630228

            a=1

            id(a)

            3630216

            可以看出,給a賦一次值,a的address就改變了。在C的層面看,(也許真實情況不是下面的樣子,但作為一個類比應(yīng)該還是可以的):

            void * pa;

            pa=malloc(sizeof(int));

            *(int *)pa=0;

            free(pa);

            pa=malloc(sizeof(int));

            *(int *)pa=1;

            Python中每次賦值會改變變量的address,分配新的內(nèi)存空間,所以Python中對于類型不像C那樣嚴(yán)格要求。

            下面看看Python函數(shù)參數(shù)傳遞時到底傳的什么:

            有一個函數(shù):

            def changeA(a):

            ... print id(a)

            ... a=100

            ... print id(a)

            設(shè)定一個變量var1:

            var1=10

            id(var1)

            3630108

            changeA(var1)

            3630108

            3631012

            var1

            10

            調(diào)用函數(shù)后,從兩次print的結(jié)果可以看出,傳遞確實是地址。但是即便如此,在函數(shù)內(nèi)對形參的修改不會對實參造成任何實質(zhì)的影響,因為對形參的重新賦值,只是改變了形參所指向的內(nèi)存單元(changeA里兩次調(diào)用print id(a)得到不同的結(jié)果),卻沒有改變實參的指向。在C的層面看也許類似下面的情節(jié):

            void changeA(void * pa)

            {

            pa=malloc(sizeof(int));

            *(int *)pa=100;

            free(pa);

            }

            精通C的你一眼就看出這個函數(shù)永遠(yuǎn)也改變不了它外面的世界。

            也就是說雖然傳遞的是地址,但像changeA這樣的函數(shù)改變不了實參的值。

            也許會感到困擾?不,我已經(jīng)在Matlab中習(xí)慣了。

            一個最典型的例子就是Matlab中刪除結(jié)構(gòu)體成員的rmfield函數(shù)(參見《Matlab筆記三則》),

            (Matlab版本7.0.1)

            如果想刪除結(jié)構(gòu)體patient的name成員,用

            rmfield(patient, 'name');

            是永遠(yuǎn)達(dá)不到目的的(就像試圖用雙手抓住自己的領(lǐng)子,把自己提到空中);

            迷途知返的做法是:

            patient = rmfield(patient, 'name');

            當(dāng)前標(biāo)題:python函數(shù)指針表 python的指針和c的指針
            文章位置:http://www.jbt999.com/article40/hhhheo.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google域名注冊、網(wǎng)站維護(hù)搜索引擎優(yōu)化、小程序開發(fā)、

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

            成都做網(wǎng)站

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 国产乱婬片A片AAAAPp地址 | 操操操操操操操操操逼 | se色综合网 | 扒开屁日本网视频 | 欧美性爱内射 |