1. 程式人生 > >Python3.6.3官方文件閱讀筆記

Python3.6.3官方文件閱讀筆記

Python3.6.4官方文件閱讀筆記

  這篇文章是我通過閱讀官方文件學習Python時寫的,不會對一些基礎概念進行過多的說明,預設至少熟悉一門程式語言。因此,有的地方可能過於囉嗦有些地方又顯得過於簡潔。因此有問題的可以通過部落格聯絡我,希望能給出改進的建議。

一、基本格式說明

  Python原始檔的格式和bash等指令碼檔案很類似,需要在頭部新增指令碼直譯器的說明和編碼規則,當然這些可選並不作為原始檔的一部分,主要是為了原始檔的閱讀者方便。具體格式如下:

    #!/usr/bin/python3
    #-*- coding:utf-8 -*-

  Python的註釋符號為 #,從#開始到行尾的所有字元都將被直譯器忽略作為註釋看待。
  Python中不存在{}來控制作用域,使用縮排來控制作用域。
  另外python互動模式是以三個’>’作為標誌,如下:
這裡寫圖片描述
  可以在互動模式下直接輸入相關程式碼進行相應的計算。並且在互動模式下輸入可列印字元或表示式回車便可以回顯,可列印字元或表示式一般為數字、字串、列表、元組以及返回值為數字、字串、列表、元組的表示式等。

二、基礎語法以及相關操作模式

(一) 基本資料型別以及操作符

1、數字類資料型別

  Python支援C語言中的大部分型別以及操作符比如int,float等,當然Python也定義了一些類似的資料型別比如Demical,Fraction。
  這些資料的操作基本和C語言相同,基本運算子,加(+)、減(-)、乘(*)、除(/)以及除餘(%)。但注意這裡的除(/)不是地板除法而是正常的除法操作,結果個小數。同時還定義了地板除法(//),以及冪(**)。還有其他一些比較操作符後序描述。
  另外,Python中變數的定義不需要型別。在互動模式下,Python還定義了一個行為就是用’_’來指代上一個未被賦值的表示式的值。
  下圖為上述內容的演示結果:
這裡寫圖片描述
  當輸入的表示式出錯時會列印相應的出錯資訊,如圖中的Traceback…可以根據出錯資訊進行修改,另外這裡的輸入表示式計算並回顯只是在互動模式下的狀態,指令碼檔案中需要利用變數來暫存資料值並進行相應的顯示與處理。

2、字串

(1) 字串列印

  Python中的字串是用”“或者”包裹的,左右引號必須匹配,’ “或” ‘都是錯誤的。
  注:Python中可以使用print列印可列印字元和表示式,具體用法下面描述。

  字串的一般列印形式即直接使用print列印print("string")或者使用字串變數print(str)
  在使用print列印需要注意的問題:
  1. 字串中’\’作為轉義字元後面接部分字元比如n,a,r,t等等都會與原來的意思不符合顯示出來的是另外一種形式,比如\n是換行,\t是製表符。為了避免這種現象可以使用r來規避,如print(r"string\nstring");
  2.要想分多行輸入與列印字串可以使用"""string"""'''string'''的格式,具體結果見下圖:
這裡寫圖片描述
  注:可以看到#在行中作為註釋的規則在”’string”’中不適應,他被解釋為字串的一部分。

(2) 字串拼接與訪問

  字串拼接類似於C++和java中的string類,可以使用"string""string""string"+"string"將兩個字串連線在一起,也可以使用類似於3 * "str" + "str"的方式。前面提到的方式對於字串變數也適用,但是不能將字串和其他型別的變數相連線。
  字串的訪問類似於C語言中的陣列,但同時又添加了多種訪問方式,如最常見的,這裡str="string",str[0],str[1],字串是從0開始計數,以及str[-1],str[-2],意思分別是倒數第一個字元和倒數第二個字元。注意:訪問都不能越界否則會報錯。

  還有一種範圍訪問方式,格式為str[n1:n2],意思是從n1到n2的字串,不包括下標為n2的字元,比如str="string",str[1:3]tri。n1和n2可以預設,n1預設為0,n2預設為字串長度;n1,n2也可以是負值含義如上所述,並且n1和n2沒有界限的限定。(如果理解困難可以將n1,n2理解為C++中的迭代器,n1為開始迭代器,n2為尾迭代器)
  不可以通過範圍和下標來替換字串。
  獲取字串的長度len(str)
  演示如下圖:
這裡寫圖片描述

3、列表

  列表就是多個元素的序列,用中括號[]包裹起來,元素內容可以相同,也可以不同,如:ls=[1,2,3,4],也可以是ls1=[1,'a','b',2]。列表的訪問和字串的訪問相同,比如ls1[0],ls[-3],ls[1:2]之類的規則和字串是相同的,即左閉右開。列表也可以通過+進行合併。
  列表和字串不同之處是列表可以通過下標訪問並且賦值,而且賦值沒有限制,可以原位置元素不同。並且如果需要賦值的是一個範圍內的資料,賦值的值可以和列表指定範圍大小不同。另外也可以通過append方法將元素新增到列表的最後,比如cu=[1,2],cu.append(3)
  同時,要說一下列表元素中有列表的情況,比如cube=[[1,2,3],2,3,[4,5]],需要通過多次訪問,訪問過程和其他高階語言中的多維陣列類似,例如cube[0][1]意思是列表中下標為0的元素也就是[1,2,3]的下標為1的元素即2。當然列表可以多級巢狀訪問方法和上面所說的類似。
  也可以使用len方法來取得列表的長度。
  演示如下圖:
這裡寫圖片描述

4、補充

  Python提供一種特殊的賦值方式,如a,b=1,2等號兩邊的值是一一對應的,左右兩邊必須能夠對應起來不可多也不可少。
  Python還定義了高階語言基本都會支援的的比較操作符,如大於()、小於(<)、等於(==)、大於等於(>=)、小於等於(<=)、不等於(!=)。返回值是布林型別即True或False。
  列印時可以使用將表示式隔開結果用一個空格作為分隔符將結果顯示。並且可以通過print(string,end='ch')指定結束符,預設是換行。
  表示式中-3**2的意思是-(3**2)要想計算-3的平方使用括號括起來即可,(-3)**2
  因為”等特殊符號被Python用作一些結束符無法在相應的表示式中使用該字元,可以用轉移字元\如”是\",#\#等。
  以下為演示結果:
這裡寫圖片描述
注意:使用a,b=a,a+b格式進行賦值,如果之前a和b已經定義過可能就會正常執行,說是有可能是因為我自己實驗結果不一樣,所以儘量自己實驗以下

(二) 控制流程

  Python中的控制流程和大部分的高階語言類似都包含if,for,while等流程控制操作符,只是在格式上有細微的不同。同時Python還定義了一些其他方便運算的關鍵字,下面進行簡單的描述。

1、if…elif語句

  if控制流程的基本格式是:

    if [expression]:
        [expresion]
    elif [expresion]:
        [expresion]
    else:
        [expresion]

  if和elif可以多層巢狀,需要注意的是每個判斷表示式後要接冒號(:)。判斷條件中的表示式和C語言中相同要求能夠進行布林運算,如果表示式為真則執行相應的表示式,為假則跳轉到else或elif語句進行執行或判斷。
  演示圖:
這裡寫圖片描述

2、for迴圈語句

  for語句在C語言中需要指定初始值,判斷條件,步進的大小,但Python中的for更為簡單些。for語句的格式是:

    for [expresion1] in [expresion2]:
        [expresion3]

  expresion2應該是一個類似於列表的變數或表示式比如字串,列表,序列等等,expresion1應該是一個變數用於接收從expresion2取出來的值。for語句執行的結果是從expresion中依次取出一個值賦給expresion1然後執行expresion3。(這塊感覺講的很模糊)可以理解為C++中迭代器如下程式碼,python中只有it,str和expresion其他比較和自增的步驟Python替你做了:

    for(auto it = str.begin(); it != str.end(); it ++)
        expresion;

這裡寫圖片描述

3、while迴圈

  while語句和for也是迴圈語句不同之處是while只有一個判別式,格式為:

    while [expresion1]:
        [expresion2]

  expresion1中的表示式需要能夠進行布林運算,True就執行迴圈體,False就退出迴圈。
這裡寫圖片描述

4、range()函式

  如果你想獲得一個數字序列可以使用range()來獲得,range可以指定範圍的起點,終點,步進。一般起點和步進可以省略,如果起點省略則預設為0,步進省略預設為1。range(begin,end,step)的意思是[begin,end)中以begin為起點step作為步進的所有元素,注意不包括end。
  另外要顯示range中元素可以使用list函式列印。
  需要注意的是range返回的是一個物件不是列表,因此可以使用其他成員方法進行修飾,具體檢視官方文件。
  range演示圖:
這裡寫圖片描述

5、countinue、break和else關鍵字

  break和continue關鍵字和C語言相同,break是跳出迴圈,continue是跳過本次迴圈執行下一個迴圈。for和while中的else是可選的,意思就是可寫可不寫,如果寫了在for或while正常結束的時候會執行else中的語句,如果執行不正常退出迴圈則不執行(如通過break跳出迴圈)。
  演示圖片:
這裡寫圖片描述

6、pass關鍵字

  pass關鍵字的本意是什麼都不做,類似於彙編中的nop,一般用作三個用途:
  1、建立最小類;(類在後面講)程式碼是

    class classname:
        pass

  2、作為佔位符,比如你定義了一個函式但又沒有想好具體實現方法,可以新增pass作為佔位符以後在回來修補,程式碼如下:

    def functionname():
        pass

  3、什麼都不做的空位,迴圈中可以用到

(三) 函式相關

1、函式定義

  Python中的函式和C語言中的函式一樣可以理解未可供呼叫的程式碼塊,Python中函式定義的一般格式是:

    def function-name(parameters-list):
        [expresion]
        return [result]         #可有可無

  function-name是函式名可以自定義,符合一般命名規則即可;parameterslist是引數列表可有可無,看你的需求;[expresion]應該是你需要執行的程式碼,return用來返回值給外部呼叫者,如果沒有預設返回None可以用print檢視。
  Python中的函式也是物件,因此可以通過賦值的方式將函式賦值給其他變數。
  演示圖:
這裡寫圖片描述

2、函式中的預設引數

  Python的函式可以指定預設引數,當引數未指定具體值時使用預設引數,若指定使用指定值。函式格式為:

    def function-name(para1,para2=def2):
        [expression]

  需要注意引數列表中有預設引數的引數必須在無預設引數的引數的右邊,因為引數匹配是從左到右的;如果有預設引數的引數可以在無預設引數的引數的左邊,除非全部提供引數否則無法為有預設引數的引數之後的無預設引數的引數匹配引數。
  有預設引數的函式呼叫時必須為無預設引數的引數提供值,其他引數看你的需求。
  演示圖:
這裡寫圖片描述
  另外,需要注意的是,引數的傳遞發生在函式的呼叫時期,預設引數只在第一次呼叫時進行賦值,也就類似與C語言中的靜態變數。對於一些可變物件如列表,字典,大多數類等物件來說可能會出現不同函式共享同意變數的情況。如下圖所示:
這裡寫圖片描述
  要想解決這個問題可以用下圖所示程式碼:
這裡寫圖片描述

3、關鍵字引數

  上面說道預設函式引數是從左到右進行引數匹配的,不能跨關鍵字傳參,但Python也提供了另一種方法進行精確的函式傳參。格式如下:

    def function-name(para1,para2=p2,para3=p3,para4=p4,para5=p5):
        [expression]
    function-name(p1,para3=t3)

  函式呼叫時指定引數對應的形參就可以精確的進行引數傳遞,但是引數的傳遞時不能在關鍵字引數後面插入普通的傳參方式,即便引數的位置是對的也不行,也就意味著普通傳參需在關鍵字傳參的前面。演示如下圖:
這裡寫圖片描述
  有一種例外,函式定義中*表示接受一個tuple,**表示接受一個字典即便引數列表中沒有該引數也可以接受,但是*必須在**的前面*必須在末尾,函式格式與呼叫格式如下:

    def function-name(par1,*par2,**par3)
    function_name(1,2,3,4,5,a=4,b=5,h=9)

  該呼叫形式中1會傳參給par1,2,3,4,5,會傳參給par2,剩餘的會傳參給par3。如下圖:
這裡寫圖片描述

4、任意引數列表

  任意引數列表和上一節最後提到的有關,使用*接收引數,*接受的是一個元組,前面引數列表匹配剩下的引數就會傳遞個*對應的變數,也就意味著*之後的變數無法獲得引數,因此其只能通過關鍵字引數獲得引數值。演示圖如下:
這裡寫圖片描述

5、拆包

  *可以對列表類的物件進行拆包,**可以對字典累的物件進行拆包,拆包的意思可以理解為講物件內的元素裸露出來,對於列表,[1,2,3]拆包之後就是1,2,3,對於字典{a=1,b=2,c=3}拆包之後就是講關鍵字對應的值裸露也就是{1,2,3},拆包之後的值可以傳遞給函式引數,只需與引數位置或關鍵字對應即可。
  演示如下:
這裡寫圖片描述
  如圖所示c因為關鍵字不對應因此無法傳遞引數給func。

6、lambda表示式

  lambda表示式就是用一句表示式來定義一個函式,一般用來定義一些輕量級的簡單的函式,就可以不去定義真正的函數了,lambda的格式是:

    lambda [引數列表]:[表示式]

  lambda定義的函式可以作為普通函式使用。
這裡寫圖片描述

7、文件規範

  這裡提及的只是一部分並沒有完全的文件說明規範,可能之後補充。
  第一行應該是類或者方法的簡單說明,不應過長
  第二行為空白行
  第三行開始對類或者函式進行完全的說明
  可以使用print(function_name.__doc__)檢視文件說明
這裡寫圖片描述

8、函式註釋

  Python為每個物件提供了方法__annotations__獲取函式的註釋,自定義的方法的格式是:

    def function-name(par1:comm1=tar1,par2:comm2=tar2)->comm3:
        [expresion]

  解釋一下comm1,comm2,comm3全是註釋分別是引數1引數2和返回值的註釋,而par1,par2分別為引數名,tar1,tar2分別未引數1和引數2的預設引數。
  演示結果:
這裡寫圖片描述
  解釋一下列印的結果的意思是函式引數n和name的型別為int,返回值為字串。

9、程式碼風格

  程式碼風格是為了別人方便閱讀程式碼而自我約束的規範,並不要求任何人遵守該規範,但是為了方便程式碼的維護與管理好的程式碼風格很必要,一般性的要求如下:
  1、使用四個空格縮排。4個空格縮排是為了避免tab在不同環境下的差異引起的不必要的程式碼閱讀障礙。
  2、一行的字元量儘量不要超過79個字元。過長的表示式很難閱讀,儘量是程式碼保持可閱讀性。
  3、使用空白行,空白塊來分隔類、函式和區域性函式的定義。這樣可以很快分清類的結構,因為Python沒有{}之類的分界符,完全是由縮排和空白行區分,因此插入空白行是好的習慣。
  4、可能的話,把註釋和程式碼放在一行上。
  5、使用文件字串。
  6、在操作符和逗號後面使用空格,但不要直接在包圍結構中使用空格。
  7、讓你的類名和函式名看起來更有意義,儘量讓別人看到你的函式名或類名便可以明白他的作用,一般採取駝峰命名法或者用下劃線將單詞隔開。
  8、如果您的程式碼旨在用於國際環境,請不要使用國語酷炫的編碼。Python的預設,UTF-8甚至純ASCII在任何情況下都是最好的。
  9、同樣,不要在識別符號中使用非ASCII字元儘管可以,即使只有很小的機會,但說不同的語言會讀取或維護程式碼。

三、Python標準庫

1、資料結構

(1)、列表詳解

  之前我們已經熟悉了list的基本用法,下面在具體說一下列表的其他方法:

成員函式名 功能說明
append(x) 將x新增到list的末尾
extend(iter) 通過迭代器iter將元素新增到列表末尾
insert(i,x) 將元素x插入到指定的位置i,i可取0-len(list)
remove(x) 刪除list中第一個值為x的元素,如果沒找到報錯
pop(i) 從列表中彈出下標未i的元素並返回,i可以不寫,則彈出返回最後一個值
clear 移除列表的所有元素
index(x,start,end) 返回從列表中start開始到end之間第一個元素值為x的下標,start和end可選,預設在整個列表中搜索,若沒找到返回值錯誤
count(x) 返回list中值為x的元素出現的次數
sort(key=None,reverse=False) 在本地對列表進行排序,key為用來排比較的函式,reverse指定排序為正序還是逆序
reverse 本地翻轉列表
copy 返回list的一個副本

這裡寫圖片描述

(2)、將列表作為棧

  利用list實現棧的操作,棧即先進後出的序列,利用list中的append和pop方法即可實現。append相當於棧中的push,pop就是pop。演示如下:
這裡寫圖片描述

(3)、將列表作為佇列

  利用list實現佇列,佇列即先進先出的序列,可利用append和pop來實現,append相當於佇列的endeque,pop相當於佇列的dequeue。但是使用list有個問題是出隊時太過耗時,因為要把出第一個元素外的所有元素移動一遍。因此可以使用collections.deque中定義的佇列進行操作。
  演示如下:
這裡寫圖片描述

(4)、遞推式構造列表

  通常我們構造列表除了直接賦值外就是通過迴圈進行構造,Python還提供了一種比較方便的構造方式遞推式構造列表(List Comprehensions),遞推式構造列表的基本格式是:

    [(x1,x2,x3) [expresion1] [expresion2] [expresion3]]

  上面的表示式返回的就是一個列表,其中x1,x2,x3可以數量沒有限制,當只有一個x1時可以省略括號,後面的表示式可以有多個,但只能是for或者if語句,並且前面的引數列表x1,x2等必須在後面的表示式中出現過,並且引數列表也可以用一些函式進行修飾。遞推式構造可以解析為:

    expresion1
        expresion2
            expresion3
                list.append(x1,x2,x3)

  演示圖片如下:
這裡寫圖片描述

(5)、巢狀列表構造

  對於構造巢狀列表,官方文件中是以矩陣開始的,我這裡說一下我自己的理解。巢狀列表構造的仍然符合上一節所說的遞推式列表構造表示式中可以包含if和for數量不限。基本格式為:

    [[(x1,x2) [expression1] [expression2]] [expression3] [expresion4]]

  可以看到前版本部分[(x1,x2)[expresion1] [expresion2]和上面提到的遞推式構造相同也就意味著這種方式基本可以無限巢狀下去當然一般不會這麼做,另一個層面來說所說的巢狀列表構造本身也是遞推式構造的變體而已,因此遞推式的要求和解析方式同樣適合巢狀式。

    expression2
        expression3
            list.append([(x1,x2) [expression1] [expression2]])

  對於巢狀式構造文件中還提到了內建方法zip,可以理解為將不同列表的元素進行一一對應的構造成元組,返回的是迭代器
  演示圖:
這裡寫圖片描述

(6)、del關鍵字

  Python定義了del關鍵字,del可以用來刪除列表中的單個元素,也可以用來刪除列表中一個範圍的元素,甚至於刪除整個列表。和pop和clear不同使用pop刪除隊後一個元素後或者clear之後列表都被置空,但是使用del列表就不復存在了。演示圖如下:
這裡寫圖片描述

(7)、元組

  元組是和列表很相似的順序資料結構。元組和列表的不同之處是元組的元素是不可修改的,列表的元素是可修改的,當元組包含可修改序列時比如列表,該可修改序列中的元素是可修改的。元組和列表 另一個不同是,元組一般用來存放不同型別的元素,列表存放相同型別的元素(雖然可以存放不同元素)。元組通常通過解包或索引訪問元素,列表通過迭代訪問。
  注意,如果想定義一個只有一個元素的元組需在末尾加逗號,否則會被解釋成定義一個該值型別的變數。
  元組的解包有兩種方式一種是通過*進行解包,另一種是使用p1,p2=t的方式將元組中的元素傳遞給每個變數,元組的數目必須和左邊變數的數目相同。
  演示:
這裡寫圖片描述

(8)、set集合

  Python還定義了無序的資料集合set,set中的資料是獨一無二的是無序的類似與C++標準庫中的set。建立集合可以使用set或者{}進行建立,但如果要建立空集合只能使用set,因為使用{}建立的是字典。
  set支援基本的數學操作與,或,異或。並且set也支援遞推式構造和list相同。演示如下:
這裡寫圖片描述

(9)、字典

  Python還提供了一種利用關鍵字進行索引的集合——字典,和前面提到的序列list,tuple等通過下標索引不同,字典是通過關鍵字索引的。字典的關鍵字只能是不可改變的型別,比如字串,數字,元組,列表就不行,列表可以通過一些成員函式進行修改。
  字典是一個無序的鍵值對key:value的集合。在一個字典中關鍵字是獨一無二的,可以通過關鍵字索引對應的值,如果給一個不存在的關鍵字賦值該字典就會在字典中新增對應的鍵值對,如果給一個已經存在的關鍵字賦值,舊的值會被覆蓋,並且索引一個不存在的值是錯誤的。可以使用del刪除字典中的鍵值對,也可以使用類似於list(a.keys())獲得關鍵字的列表。
  另外可以使用dict構造字典,可以使用以下三種形式進行構造:

    dict([(key1,val1),(key2,val2)])
    dict(key1=val1,key2=val2)

  也可以使用遞推式構造。

    {x:y expresion}

  演示圖片:
這裡寫圖片描述

(10)、迴圈技術

  1.迴圈時,對於字典可以使用items成員方法同時獲得關鍵字和值;
  2.迴圈時,對於一個序列,可以通過enumerate方法同時獲得索引和值;
  3.迴圈時,當有多個序列,可以使用zip解包同時獲得不同序列的值;
  4.迴圈時,可使用reversed逆置序列反向遍歷;
  5.迴圈時,可以通過sorted方法排序序列後訪問
  6、迴圈時,如果需要修改一個列表的值,新建一個列表接受其值是一個明智的選擇。
這裡寫圖片描述

(11)、更多的條件語句

  Python提供瞭如下for while if等判斷條件語句中所用到的操作符或關鍵字:
  1、in,not in。分別表示元素在,不在對應的序列中,符合條件為真,不符合為假;
  2、is,not is。比較兩個物件是否相同,只適應於可變物件,如list;
  3、Python中比較運算子是可以相互連結的。如a==b>c指的是a等於b,並且b大於c;
  4、and,or,not布林操作運算子。分別對應C語言中的與或非
  5、布林操作和C語言中一樣是可短路的,如果已經可以確定表示式的結果,後面的表示式將不再計算。如a==b or c==d,如果a已經等於b則後面的c==d的表示式則不再進行即便語法錯誤也忽略;
  6、Python中不能在表示式中間對變數進行賦值。
  7、優先順序。所有的比較操作符優先順序相同,且低於算數運算子。or,and,not三者優先順序低於比較操作符,且三者中not最高,or最低。
注意:比較序列時採用類似字串比較的字典序比較,即先比較第一個元素,如果第一個序列元素1大於或小於另一序列元素1,則序列1大於或小於序列2,如果相等則比較下一個元素以此類推,如若全部相等則相等

2、模組

(1)、模組簡介

  直接介紹的都是在互動模式下執行Python命令,Python也支援類似於指令碼檔案的將一些功能寫入一個檔案,然後讓Python直譯器對檔案中的功能進行解釋,這個檔案就是模組。模組檔案的副檔名為.py,執行方式是Python module-name,前面的Python根據你選擇的版本不同可以進行變更比如Python3,Python2.7等。不同模組之間功能的引用可以通過import module的方式將模組功能匯入到當前計算環境,需要呼叫其中的方法時只需module-name.function-name即可。Python還定義了全域性變數__name__來獲取模組名。
  模組使用演示:
  下圖為模組程式:
這裡寫圖片描述
  使用方式:
這裡寫圖片描述

(2)、模組的使用和注意事項

  模組中可以包含函式定義也可以包含執行語句,這些執行語句只在模組第一次被呼叫時執行。每個模組有自己的符號表,這些符號表對於模組內的成員和方法是全域性的。模組之間可以互相呼叫,可以通過import module-name的形式匯入模組然後用格式module-name.function-name使用模組中的方法。如果只想匯入模組的部分方法或者變數只需使用from module-name import function-name匯入對應的方法即可,執行這條語句後該方法的名字被加到當前模組的符號表中;其中function-name可以是*表示匯入模組中的所有變數和方法,除了以下劃線_開頭的方法或變數。
  在每個Python直譯器執行環境下,模組只會被匯入一次,使用importlib.reload(module-name)即可重新匯入。
  下面是檔案內容:
這裡寫圖片描述
  使用演示:
這裡寫圖片描述

(3)、執行模組

  上面提到了可以使用python module-name [args]的方式執行python指令碼,可以通過在指令碼中插入下面這句話保證只有指令碼直接被執行時才執行內部的呼叫方法,如果只是匯入則不執行。

    if __name__ == "__main__":
        #TODO:your code

如圖:
這裡寫圖片描述

(4)模組名字查詢

  匯入一個模組時,python名字查詢順序是:
  1.內建模組。也就是python本身擁有的模組;
  2.根據sys.path目錄進行查詢,分別為
    +當前執行模組的執行目錄;
    +Python環境變數中的目錄:
    +安裝的依賴目錄。
  初始化完成後,Python程式能夠修改sys.path,指令碼的執行目錄在標準庫目錄前方,也就意味著本地的模組會覆蓋標準庫中的同名模組。
  注意:符號連結(類似windows快捷方式)的目錄不會被納入查詢範圍。
  注意:這塊好像沒懂!

(5)Python模組載入問題

  Python為了加快模組載入速度,會將編譯過的模組快取在當前目錄下的__pycache__目錄下,對應的模組在該目錄下以module-name.python-version,pyc的格式存放,module-name是模組名,python-version是python版本如python3,python35等。Python是通過檢查原始檔修改時間和編譯過的檔案時間來判斷是否重新編譯。另外這些編譯模組是平臺獨立的。
  Python只有在兩種情況下不檢查快取目錄:
  1、經常重新編譯而不快取編譯結果;
  2、沒有原始檔的模組,也就是隻存在編譯後的結果檔案的模組。
  notes:
  +可以使用-0或者-00減小模組編譯後的尺寸,-0移除assert語句,-00移除assert語句和__doc__說明。在使用該開關時必須明確你要做什麼。
  +快取編譯模組只會加快載入速度不會改變執行速度
  +模組compileall可以為目錄中的所有模組建立.pyc檔案

(6)標準庫模組

  Python定義了標準庫模組,標準庫模組文件在一個單獨的說明文件中。標準庫模組中的一些模組是內嵌在直譯器中一方面為了提供系統支援,另一方面為了效率。標準庫模組中有些是平臺相關的如:winreg只支援Windows系統。標準庫中還定義了一些變數如ps1,ps2,’path’,ps1的值是>>>,ps2的值是’…’,path是Python目錄。

(7)dir

  dir函式的功能是返回一個指定模組內定義的所有名字,除了’_’開始的名字的列表。若dir不提供引數則返回當前環境已經定義的變數,函式,模組等。dir不會包含內建的函式和變數,可以使用dir(builtins)檢視。
這裡寫圖片描述

3、包(Packages)

(1)、包簡介

  包是一種用來組織Python中的模組的方式。包可以用來隔離不同開發人員在不同平臺不同環境下的模組,不然命名衝突將影響開發。包其實就是一個含有檔案__init__.py的資料夾,該檔案可以為空,也可以設定一些初始化工作。包提供了一種方便的層次性模組管理方式。Python匯入包是根據sys.path目錄進行檢索的。
  下圖就是一個層級的報結構目錄:
這裡寫圖片描述
  包的使用和模組有一些相似的地方,如上圖中匯入包可以使用下面的語句:

    import game.sound

  或者:

    from game import sprite

  當使用import package.package.item,item可為包名或者模組名,進行載入模組或者匯入包時必須指出完整的路徑名,比如package.package.module.function()。使用from package import item,item可為包名,模組名,函式名或變數名,就可以省略前面的內容直接使用module.funciton()進行呼叫。
  當匯入包時,直譯器會先尋找該包進行匯入,如果不存在則判定為一個模組,試圖載入模組,如果失敗則返回ImportError錯誤。
  上述表達格式可以歸納為import package1.subpack.item,item可以是包或者模組。
  from package.package import item,item可以為包名,模組名,函式名或變數名。
  演示圖片:
這裡寫圖片描述

(2)匯入包內所有內容(import *)

  語句from package.subpackage import *,預設情況下(__init__.py為空)並不如我們所想會遞迴的匯入包和模組,而是隻匯入該包內的模組等不包含子目錄中的資訊。如果希望能夠匯入子目錄中的資訊,必須明確的在__init__.py中定義變數__all__指明要包含的子包或模組的名稱。__all__是一個列表包含你需要包含的包的名稱。
  演示圖片:
這裡寫圖片描述

(3)包內引用(Intra-package References)

  __path__定義本模組搜尋路徑。
  可以通過.,..來相對於當前路徑進行包的匯入,.表示當前目錄,..表示上級目錄和linux下的目錄關係類似。
  這種方式我自己沒有執行成功,很尷尬!!!!

4、輸入與輸出

(1)、更多的輸出格式

  有三種輸出格式:1、[expresion]直接輸出,2、使用print函式;3、使用write寫檔案函式,將輸出物件定向到標準輸出sys.stdout
  Python提供了兩種將其它型別的變數轉換為字串的方法,一個是str,str返回一個可讀的字串,另一個repr函式返回一個能夠被Python直譯器解釋的字串,當字串並不具備特殊含義時str和repr返回值相同。
  Python還提供了其他方法,如rjust,ljust,center,都可接受一個整形引數,分別表示右對齊,左對齊,居中。str.zfill()函式將字串擴充套件到指定位數多餘的位數用0填充,如果原字串大於指定長度,則不作處理。
  str.format()市一中比較自由的字串格式化方式。第一種方式類似於下面這種方式:

    'we can {} something in the {}'.format('str1','str2')

  {}作為佔位符,輸出時會自動按順序匹配format中的值。
  第二種是指定引數順序,類似與:

    'we can {0} something in the {1}'.format('str1','str2')

  {}中的數值用於索引format中的值,0表示第一個值,1表示第二個值,{}中的數值索引沒有順序要求,0,1可以互換但對應的值還是format中第i+1個值。
  第三種是通過關鍵字索引:

    'we can {name} something in the {age}'.format(age='str1',name='str2')

  並且關鍵字索引和數值索引可以組合起來。
  還可以使用具體的格式對字串值進行修飾,如{!a},{!s},{!r}分別表示輸出獲取ascii的返回值,獲取str的返回值,獲取repr的返回值。
  使用{i:n}表示format中第i+1個值的輸出寬度是n。還可以用類似的方式修飾數值,{i:.nf}表示format中第i+1個值小數點後保留n位。
  對於字典也可以使用類似的方式輸出

    table={'name'=12,'age'=23,'addr'=120}
    print('{0[name]d} is {0[age]d} and live in {0[addr]d}'.format(table)) #d表示輸出數字

  也可以使用解包的方式獲取關鍵字對應的值。

    print('name {name:d} age {age:d} address {addr:d}'.format(table))

  Python也相容C中的字串格式化方式使用方式類似於'string %d' % data
  上述演示圖如下:
這裡寫圖片描述

(2)、讀寫檔案

  使用open函式獲得一個檔案物件,可以通過操作這個檔案物件可以完成相應的檔案操作。open函式接受兩個引數,第一個是檔名,第二個是開啟方式