<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ## 1. weakref 1. 和許多其它的高級語言一樣,Python使用了**垃圾回收器來自動銷毀那些不再使用的對象**。每個對象都有一個引用計數,當這個引用計數為0時Python能夠安全地銷毀這個對象。 2. 使用weakref模塊,你可以創建到對象的弱引用,Python在對象的引用計數為0或只存在對象的弱引用時將回收這個對象。 ### 1.1 WeakValueDictionary, WeakKeyDictionary 弱引用mapping對象, 以WeakValueDictionary來說, 當鍵對應的值除了mapping本身引用之外沒有其他引用的情況下,會回收掉這個值,相應的這個鍵值對就不存在了 ~~~ import weakref class TestObject(object): value = 'hello weakref' d = weakref.WeakValueDictionary() d[1] = TestObject() ~~~ 除了 d[1] 引用這個對象之外沒有其他引用,立即被垃圾回收器收回了 ~~~ >> d[1] KeyError Traceback (most recent call last) <ipython-input-19-6ee4d8336f71> in <module>() ----> 1 d[1] C:\Python34\lib\weakref.py in __getitem__(self, key) 123 124 def __getitem__(self, key): --> 125 o = self.data[key]() 126 if o is None: 127 raise KeyError(key) KeyError: 1 ~~~ ~~~ >> d <WeakValueDictionary at 76992912> ~~~ ~~~ >> obj = TestObject() >> d[1] = obj ~~~ 由于obj還被main模塊所引用,因此可以訪問到這個鍵值對 ~~~ >> d[1] <__main__.TestObject at 0x944650> ~~~ 注: 對WeakValueDictionary對象使用valuerefs()方法進行遍歷時,并不能保證這個字典不會改變,可能存在遍歷過程中值被垃圾回收器收回的風險。 對于WeakKeyDictionary來說它類似于WeakValueDictionary, 只不過這時候弱引用作用于鍵上面。 ## 2.struct 數據格式轉換 > Python是一門非常簡潔的語言,對于數據類型的表示,不像其他語言預定義了許多類型(如:在C#中,光整型就定義了8種),它只定義了六種基本類型:字符串,整數,浮點數,元組,列表,字典。通過這六種數據類型,我們可以完成大部分工作。但當Python需要通過網絡與其他的平臺進行交互的時候,必須考慮到將這些數據類型與其他平臺或語言之間的類型進行互相轉換問題。打個比方:C++寫的客戶端發送一個int型(4字節)變量的數據到Python寫的服務器,Python接收到表示這個整數的4個字節數據,怎么解析成Python認識的整數呢? Python的標準模塊struct就用來解決這個問題。 > > 1. 按照指定格式將Python數據轉換為字符串,該字符串為字節流,如網絡傳輸時,不能傳輸int,此時先將int轉化為字節流,然后再發送; > 2. 按照指定格式將字節流轉換為Python指定的數據類型; > 3. 處理二進制數據,如果用struct來處理文件的話,需要用’wb’,’rb’以二進制(字節流)寫,讀的方式來處理文件; > 4. 處理c語言中的結構體; > ### 2.1 struct模塊中的函數 函數 return explain #### 2.1.1 pack(fmt,v1,v2…) > 按照給定的格式(fmt),把數據轉換成字符串(字節流),并將該字符串返回. ~~~ __author__ = 'dailin' import struct # 定義數據 a = b"hello" b = b"world!" c = 20 d = 42.56 # 打包 binStr = struct.pack("5s6sif", a, b, c, d) # 解包 e, f, g, h = struct.unpack("5s6sif", binStr) print (e, f, g, h) ~~~ 輸出 ~~~ b'hello' b'world!' 20 42.560001373291016 ~~~ ("5s6sif", a, b, c, d)代表:按照5字符,6個字符,一個整型,一個小數的形式編碼,詳見格式符 #### 2.1.2 pack_into(fmt,buffer,offset,v1,v2…) None > 按照給定的格式(fmt),將數據轉換成字符串(字節流),并將字節流寫入以offset開始的buffer中.(buffer為可寫的緩沖區,可用array模塊) #### 2.1.3 unpack(fmt,v1,v2…..) tuple 按照給定的格式(fmt)解析字節流,并返回解析結果 #### 2.1.4 pack_from(fmt,buffer,offset) tuple 按照給定的格式(fmt)解析以offset開始的緩沖區,并返回解析結果 #### 2.1.5 calcsize(fmt) size of fmt 計算給定的格式(fmt)占用多少字節的內存,注意對齊方式 格式化字符串 當打包或者解包的時,需要按照特定的方式來打包或者解包.該方式就是格式化字符串,它指定了數據類型,除此之外,還有用于控制字節順序、大小和對齊方式的特殊字符. #### 2.1.6 對齊方式 > 為了同c中的結構體交換數據,還要考慮c或c++編譯器使用了字節對齊,通常是以4個字節為單位的32位系統,故而struct根據本地機器字節順序轉換.可以用格式中的第一個字符來改變對齊方式.定義如下 ![](https://box.kancloud.cn/f16880a1855488ce6ff80a32fbd528a6_853x248.png) #### 2.17 格式符 ![](https://box.kancloud.cn/d828f1e83fec5dd5589a6b6bab8ceff2_852x818.png) ### 2.2 實例 ~~~ # -*- coding: utf-8 -*- ''' 數據格式為 姓名 年齡 性別 職業 lily 18 female teacher ''' import os import struct fp = open('test.bin','wb') # 按照上面的格式將數據寫入文件中 # 這里如果string類型的話,在pack函數中就需要encode('utf-8') name = b'lily' age = 18 sex = b'female' job = b'teacher' # int類型占4個字節 fp.write(struct.pack('4si6s7s', name,age,sex,job)) fp.flush() fp.close() # 將文件中寫入的數據按照格式讀取出來 fd = open('test.bin','rb') # 21 = 4 + 4 + 6 + 7 print(struct.unpack('4si6s7s',fd.read(21))) fd.close() ~~~ 結果: ~~~ (b'lily', 18, b'female', b'teacher') ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看