python學習筆記(二)

来源:http://www.cnblogs.com/lpworkstudyspace1992/archive/2016/11/17/6074895.html
-Advertisement-
Play Games

note eight 使用元類 動態語言和靜態語言最大的不同,就是函數和類的定義,不是編譯時定義的,而是運行時動態創建的。 程式的調試用logging 模塊 import logging 單元測試 為了編寫單元測試,我們需要引入pytho... ...


note eight
      使用元類
          動態語言和靜態語言最大的不同,就是函數和類的定義,不是編譯時定義的,而是運行時動態創建的。
          程式的調試用logging 模塊
              import logging
          單元測試
              為了編寫單元測試,我們需要引入python自帶的unittest模塊

      文件讀寫
          讀寫文件是最常見的IO操作,python內置了讀寫文件的函數。讀寫文件就是請求操作系統打開一個文件對象,然後通過操作系統提供的介面從這個文件對象中讀取數據,或者把數據寫入這個文件對象。
          step1:打開文件
              使用python內置的open()函數
          step2:對文件對象進行讀或寫
              read(),write()
          step3:關閉文件
              close(),文件使用完後必須關閉,因為文件對象會占用操作系統的資源,並且操作系統同一時間能打開的文件數量也是有限的
          但每次都這麼寫實在太繁瑣,所以PYthon引入了with語句來自動幫我們調用close()方法
          with open() as f

          二進位文件
              前面講的預設都是讀取文本文件,並且是ASCII編碼的文本文件。要讀取二進位文件,比如圖片、視頻等等,用"rb"模式打開文件
          字元編碼
              要讀取非ASCII編碼的文本文件,就必須以二進位模式打開,再解碼。如GBK編碼的文件
                   f = open('/Users/michael/gbk.txt', 'rb')
                >>> u = f.read().decode('gbk')
                >>> u
                u'\u6d4b\u8bd5'
                >>> print u
                測試
              如果每次手動轉換嫌麻煩,python還提供了一個codecs模塊幫我們在讀文件時自動轉換編碼,直接讀出unicode
              import codecs
            with codecs.open('/Users/michael/gbk.txt', 'r', 'gbk') as f:
                f.read() # u'\u6d4b\u8bd5'


    序列化
        在程式運行的過程中,所有的變數都是在記憶體中,可以隨時修改變數,但是一旦程式結束,,變數所占的記憶體就被操作系統全部收回。
        我們把變數從記憶體中變成可存儲或傳輸的過程稱為序列化,在python中叫picking。序列化後,就可以把序列化之後的內容寫入磁碟,或通過網路傳輸到別的機器上。
        反過來,把變數內容從序列化的對象重新讀到記憶體里稱為反序列化。
        python提供兩個模塊來實現序列化
            cPickle, pickle

        導入模塊
        : d
        Out[11]: {'age': 20, 'name': 'Jack', 'score': 88}

        In [12]: try :
           ....:     import cPickle as pickle
           ....: except ImportError:
           ....:     import pickle
           ....:

        In [13]: pickle.dumps(d)
        Out[13]: "(dp1\nS'age'\np2\nI20\nsS'score'\np3\nI88\nsS'name'\np4\nS'Jack'\np5\ns."
        pickle.dumps()方法把任意對象序列化成一個str,然後就可以把這個str寫入文件、或者用另一個方法pickle.dump()直接把對象序列化後寫入一個file-like Object

            In [15]: f= open(r"C:\Users\MyHome\Desktop\dumps.txt","wb")

            In [16]: pickle.dump(d,f)

            In [17]: f.close()
        當我們要把對象從磁碟讀到記憶體時,可以先把內容讀到一個str,然後用pickle.loads()方法反序列化對象,也可以直接用pickle.load()方法從一個file-like Object 中直接反序列化對象。
       
        In [18]: f= open(r"C:\Users\MyHome\Desktop\dumps.txt","rb")

        In [19]: d = pickle.load(f)

        In [20]: f.close()

        In [21]: d
        Out[21]: {'age': 20, 'name': 'Jack', 'score': 88}

    JSON進階
        如果我們要在不同的編程語言之間傳遞對象,就必須把對象序列化為標準格式,比如XML,但更好的方法是序列化為JSON,因為JSON表示出來就是一個字元串,可以被所有語言讀取,也可以方便地存儲到磁碟或者通過網路傳輸。JSON不僅是標準格式,並且比XML更快,而且可以直接在Web頁面中讀取,非常方便。
        python中內置的json模塊提供了非常完善的Python對象到JSON格式的轉換。我們先看看如何把python對象變成一個JSON

 

            In [22]: import json

            In [23]: d = dict(name = "Jack",age = 24,score = 96)

            In [24]: json.dumps(d)
            Out[24]: '{"age": 24, "score": 96, "name": "Jack"}'

            dumps()方法返回一個str,內容就是標準的JSON,類似的,dump()方法可以直接把JSON寫入一個file-like Object
            要把JSON反序列化為python對象,用loads()或者對應的load()方法,前者把JSON的字元串反序列化,後者從file-like Object 中讀取字元串並反序列化
            In [25]: json_str =  '{"age": 24, "score": 96, "name": "Jack"}'

            In [26]: json.loads(json_str)
            Out[26]: {u'age': 24, u'name': u'Jack', u'score': 96}


        Python的dict對象可以直接序列化為JSON的{},不過,很多時候,我們更喜歡用class表示對象,比如定義Student類,然後序列化:

            import json

            class Student(object):
                def __init__(self, name, age, score):
                    self.name = name
                    self.age = age
                    self.score = score

            s = Student('Bob', 20, 88)
            print(json.dumps(s))
            運行代碼,毫不留情地得到一個TypeError:

            Traceback (most recent call last):
              ...
            TypeError: <__main__.Student object at 0x

        錯誤的原因是Student對象不是一個可序列化為JSON的對象。

    如果連class的實例對象都無法序列化為JSON,這肯定不合理!

    別急,我們仔細看看dumps()方法的參數列表,可以發現,除了第一個必須的obj參數外,dumps()方法還提供了一大堆的可選參數:

    https://docs.python.org/2/library/json.html#json.dumps

    這些可選參數就是讓我們來定製JSON序列化。前面的代碼之所以無法把Student類實例序列化為JSON,是因為預設情況下,dumps()方法不知道如何將Student實例變為一個JSON的{}對象。

    可選參數default就是把任意一個對象變成一個可序列為JSON的對象,我們只需要為Student專門寫一個轉換函數,再把函數傳進去即可:


        def studentdict(std):
            return {"name":std.name,"age":std.age,"score":std.score}

        print (json.dumps(s,default=studentdict))

    不過,下次如果遇到一個Teacher類的實例,照樣無法序列化為JSON。我們可以偷個懶,把任意class的實例變為dict:

        print(json.dumps(s, default=lambda obj: obj.__dict__))


    同樣的道理,如果我們要把JSON反序列化為一個Student對象實例,loads()方法首先轉換出一個dict對象,然後,我們傳入的object_hook函數負責把dict轉換為Student實例:

        def dict2student(d):
            return Student(d['name'], d['age'], d['score'])

        json_str = '{"age": 20, "score": 88, "name": "Bob"}'
        print(json.loads(json_str, object_hook=dict2student))
        運行結果如下:

        <__main__.Student object at 0x10cd3c190>
    列印出的是反序列化的Student實例對象。


    解析
        如果我們要編寫一個搜索引擎,第一步是用爬蟲把目標網站的頁面抓取下來,第二部就是解析該HTML頁面,看看裡面的內容到底是新聞、圖片還是視頻。
        如何解析HTML呢,python提供了HTMLParser來非常方便地解析HTML


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 包裝類 基本類型 包裝類 + byte Byte + short Short + int Integer + long Long + char Character + float Float + double Double + boolean Boolean 基本類型轉為包裝類型: + 自動裝箱Au ...
  • byte tt=(byte)130 等於 -126 。 byte 占一個位元組,8bit 。第一位是符號位,0 表示正數,1 表示負數。因此byte 的取值範圍 [-128, 127] 。 130的二進位是00000000000000000000000010000010,截取成byte類型只保留後8位 ...
  • Django開髮網站需要遵循Django的一套開發流程。本節通過建立一個消息錄入頁面演示Django的開發流程及相關技術。 ...
  • 1 問題描述 利用Java EE相關技術實現一個簡單的Web聊天室系統,具體要求如下。 (1)編寫一個登錄頁面,登錄信息中有用戶名和密碼,分別用兩個按鈕來提交和重置登錄信息。 (2)編寫一個Servlet程式Main.java通過請求指派來處理用戶提交的登錄信息,如果用戶名為本小組成員的名字且密碼為 ...
  • python flask+gunicorn+nginx部署應用 ...
  • 1.添加Python群組 運行EditPlus,選擇工具→配置用戶工具進入參數設置框。 單擊添加工具→應用程式。菜單文字輸入python,命令為Python的安裝路徑,參數輸入 $(FileName),初始目錄輸入 $(FileDir),動作選擇 捕捉輸出。然後點擊確定。 2.設置Python高亮和 ...
  • 1. 在https://www.python.org/downloads/release/python-352/網站上下載python版本 2. 配置環境 右擊電腦屬性,然後選擇高級系統設置 3. 選擇環境變數,配置Path 輸入;C:\Users\小紅\AppData\Roaming\Micro ...
  • 兩者區別與作用: 普通任務:總調度(SchedulerFactoryBean)--> 定時調度器(CronTriggerFactoryBean) --> 調度明細自定義執行方法bean(MethodInvokingJobDetailFactoryBean) -->調度bean(我們定義的job類) ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...