1. 程式人生 > >Python成長之路(三)——詞典、文字檔案的輸入輸出、模組、函式的引數傳遞

Python成長之路(三)——詞典、文字檔案的輸入輸出、模組、函式的引數傳遞

詞典

可以儲存多個元素的物件成為容器,前面提到的list和tuple都屬於容器類,這裡介紹一個新的容器:詞典。

  • 基本概念
    常見的建立詞典的基本方法:

    dic={'鍵':值,'鍵':值,'鍵':值...}

    詞典包含兩部分,鍵和值,其中鍵一般為字串,也可以為數字或真值(不可變的物件可以作為鍵)。值可以是任意物件,鍵和值兩者一一對應。
    這裡寫圖片描述

    詞典特殊的地方是,與表相比,他當中的元素是無序的,因此就不能通過下標來訪問元素。詞典是通過鍵來引用的。
    這裡寫圖片描述

    構建一個新的空詞典:

    dic = {}

    這裡寫圖片描述

    在詞典中新增一個新的元素的方法:
    這裡寫圖片描述

  • 詞典元素的迴圈呼叫
    這裡寫圖片描述
    可以看到最後添加了一個”gcg”但是它卻並不在最後一個,也就是在詞典裡是沒有順序的。

  • 詞典的常用方法
    這裡寫圖片描述

    刪除其中的某一對:
    這裡寫圖片描述
    (說明:del是Python中保留的關鍵字,用於刪除物件。
    【 HIGH.__delitem__(鍵)】等價於【del HIGH[鍵]】)

    查詢詞典中的元素對總數:
    這裡寫圖片描述

文字檔案的輸入輸出

Python具有基本的文字檔案讀寫功能。Python的標準庫提供有更豐富的讀寫功能。文字檔案的讀寫主要通過open()所構建的檔案物件來實現。

  • 建立檔案物件
    我們開啟一個檔案,並使用一個物件來表示該檔案:

    物件名 = open(檔名,模式)

    最常用的模式有:

    • r 開啟只讀檔案,該檔案必須存在。
    • r+ 開啟可讀寫的檔案,該檔案必須存在。
    • w 開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。
    • w+ 開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。
    • a 以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。
    • a+ 以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。
    • 上述的形態字串都可以再加一個b字元,如rb、w+b或ab+等組合,加入b 字元用來告訴函式庫開啟的檔案為二進位制檔案,而非純文字檔案。
      這裡寫圖片描述
  • 檔案物件的方法

    • 讀取
      假如檔案裡已經有這麼兩行資料:
      這裡寫圖片描述

      這裡寫圖片描述

      這裡寫圖片描述

    • 寫入
      因為CONTENT是讀取的多行資料,其實Python將每一行當做一個元素儲存在了一個列表中,因此我們可以將讀出來的兩行再寫在檔案之後。
      這裡寫圖片描述
      結果:
      這裡寫圖片描述

模組

  • 引入模組
    我們之前看到了函式和物件。從本質上來說,它們都是為了更好的組織已經有的程式,以方便重複利用。模組(module)也是為了同樣的目的。在Python中,一個.py檔案就構成一個模組。通過模組,你可以呼叫其它檔案中的程式。
    我們先建立一個Move.py檔案,將它放在和main.py檔案同一個目錄中,然後在main.py中匯入Move.py檔案。
    這裡寫圖片描述

    然後在main.py匯入:
    這裡寫圖片描述
    引入模組之後,我們可以通過模組.物件的方式來呼叫模組中的物件,包括函式和全域性變數。
    Python還有一些其他的有用的匯入方式 :
    重新命名模組名:
    這裡寫圖片描述

    指定只匯入模組中的特定物件,而且可以直接訪問,就相當於main.py中的全域性物件那樣訪問:
    這裡寫圖片描述
    (因為只是匯入了函式move,因此CONTENT是訪問不了的。)

    從模組中匯入所有物件,並且可以直接當成全域性變數訪問:
    這裡寫圖片描述

  • 搜尋路徑
    上面的Move.py檔案能被main.py檔案找到是因為Move.py檔案和main.py檔案在相同的目錄下,那麼main.py還能在哪些路徑下尋找匯入的模組呢?

    • 程式所在的資料夾
    • 作業系統環境變數PYTHONPATH所包含的路徑
    • 標準庫的安裝路徑(windows系統是在python安裝目錄中的Lib資料夾中的site-packages目錄中,Linux系統是在/usr/local/lib/python2.7/dist-packages中)
  • 模組包
    模組包顧名思義就是一些模組的集合,它是一個資料夾,我們將上面的Move.py檔案放到一個叫module_bag的資料夾中,該資料夾和mian.py在同一個目錄中:
    這裡寫圖片描述

    這裡寫圖片描述

    需要注意的是在資料夾module_bag中必須包含一個__init__.py檔案,提醒Python該資料夾為一個模組包,__init__.py可以是一個空檔案
    這裡寫圖片描述

函式的引數傳遞

一般情況下,我們將引數傳遞給函式是都是根據函式中引數的位置,一一對應上去的,例如:
這裡寫圖片描述
這時實參與abc一一對應。

  • 關鍵字傳遞
    為了方便檢視,我們寫一個函式:
    這裡寫圖片描述
    上面是使用預設的位置對應的方法傳遞的。
    有時候覺得根據位置傳遞過於死板,因此想根據自己方便,按照引數名字來給每個引數傳遞引數:
    這裡寫圖片描述

    關鍵字傳遞可以和位置傳遞混用。但位置引數要出現在關鍵字引數之前:
    這裡寫圖片描述

  • 引數預設值
    在定義函式的時候,使用形如a=19的方式,可以給引數賦予預設值(default)。如果該引數最終沒有被傳遞值,將使用該預設值:
    這裡寫圖片描述

    看看下面這個例子:
    這裡寫圖片描述
    說明:並不是輸出2 4 10,因為如果某個引數賦了預設值,則其後面的引數也都必須有預設值,否則就會出錯。

  • 包裹傳遞
    在定義函式時,我們有時候並不知道呼叫的時候會傳遞多少個引數。這時候,包裹(packing)位置引數,或者包裹關鍵字引數,來進行引數傳遞,會非常有用。
    下面看一個例子:
    這裡寫圖片描述
    可以看到這個引數是一系列引數的集合,全部都傳遞給了parameters。兩次呼叫,儘管引數個數不同,都基於同一個func定義。在func的引數表中,所有的引數被parameters收集,根據位置合併成一個元組(tuple),這就是包裹位置傳遞。
    其實在parameters前面不加*也可以實現該功能:
    這裡寫圖片描述
    可以看到,前面*parameters是Python自動將那一些列引數轉化為一個元組賦個parameters,而後面這種方法是我們程式設計師在傳參時認為手動傳遞一個元組給parameter。

    通過包裹傳遞一個字典:
    這裡寫圖片描述
    注意到實參中的a b c是不帶引號的。

  • 解包裹
    * 和 **,也可以在呼叫的時候使用,即解包裹(unpacking),下面為例:
    這裡寫圖片描述

    相應的,也存在對詞典的解包裹,

    dict = {'a':1,'b':2,'c':3}
    func(**dict)
  • 混合
    在定義或者呼叫引數時,引數的幾種傳遞方式可以混合。但在過程中要小心前後順序。基本原則是:先位置,再關鍵字,再包裹位置,再包裹關鍵字,並且根據上面所說的原理細細分辨