大廠賣8800都買不到的Python資料,竟然能夠白嫖到?這還不看看?

Windmove3發表於2020-12-01

前言

大家好 我是你們的笨蛋程式設計師灰南。一直立志成長為牛逼程式設計師的我,
在最近學習發展的時候也遇到了很多問題。最近在學python,但由於接觸時間不是很長。經過向五湖四海的廣大大神程式設計師取經之後。
多方取證之後,我才總結出來了這篇我自認為很牛的Python自動化的部分解析和梗概

這裡也是給大夥準備了一些極其給力的資料 如果有需要的夥伴可以進群領取CSDN資料
Python自動化測試學習群

在這裡插入圖片描述

在這裡插入圖片描述


一、 Python物件

Python使用物件模型來儲存資料。構造任何型別的值都是一個物件。儘管 Python通常當成一種“物件導向的程式語言”,但你完全能夠寫出不使用任何類和例項的實用指令碼。

不過Python的物件語法和架構鼓勵我們使用這些特性,下面讓我們仔細研究一下Python物件。

所有的Python對像都擁有三個特性:身份型別

身份:

每一個物件都有一個唯一的身份標識自己,任何物件的身份可以使用內建函式id()來得到。這個值可以被認為是該物件的記憶體地址。您極少會用到這個值,也不用太關心它究竟是什麼。

型別:

物件的型別決定了該物件可以儲存什麼型別的值,可以進行什麼樣的操作,以及遵循什麼樣的規則。您可以用內建函式type()檢視Python物件的型別。

因為在Python 中型別也是物件(還記得我們提到 Python是物件導向的這句話嗎?),所以 type()返回的是物件而不是簡單的字串。

如果物件支援更新操作,那麼它的值就可以改變,否則它的值也是隻讀的。物件的值是否可以更改被稱為物件的可改變性(mutability),我們會在後面討論這個問題。只要一個物件還沒有被銷燬,這些特性就一直存在。

值:

物件表示的資料項

上面三個特性在物件建立的時候就被賦值,除了值之外,其它兩個特性都是隻讀的。對於新風格的型別和類,物件的型別也是可以改變的,不過對於初學者並不推薦這樣做。

如果物件支援更新操作,那麼它的值就可以改變,否則它的值也是隻讀的。物件的值是否可以更改被稱為物件的可改變性(mutability),我們會在後面的小節中討論這個問題。只要一個物件還沒有被銷燬,這些特性就一直存在。

Python有一系列的基本(內建)資料型別,必要時也可以建立自定義型別來滿足你的應用程式的需求。絕大多數應用程式通常使用標準型別,對特定的資料儲存則通過建立和例項化類來實現。

在這裡插入圖片描述

1.物件屬性

某些Python物件有屬性、值或相關聯的可執行程式碼,比如方法(method )。

Python用點(.)標記法來訪問屬性。屬性包括相應物件的名字等等。最常用的屬性是函式和方法,不過有一些Python型別也有資料屬性。含有資料屬性的物件包括(但不限於):類、類例項、模組、複數和檔案。

2.標準型別

  • 數字(分為幾個子型別,其中有三個是整型)
  • 整型
  • 布林型
  • 長整型
  • 浮點型
  • 複數型
  • 字串
  • 列表
  • 元組
  • 字典

在本文中,我們把標準型別也稱作“基本資料型別”,因為這些型別是 Python 內建的基本資料型別。

2.其他內建型別

  • 型別
  • Null物件(None)
  • 檔案
  • 集合/固定集合
  • 函式/方法
  • 模組

  • 這些是當你做Python開發時可能會用到的一些資料型別。我們在這裡討論Type和 None型別的使用,除此之外的其他型別將在其他章節中討論。

3.型別物件和 type型別物件

在本章我們要討論所有的Python型別,雖然看上去把型別本身也當成物件有點特別,我們還是要在這裡提一提。你一定還記得,物件的一系列固有行為和特性(比如支援哪些運算,具有哪些方法)必須事先定義好。從這個角度看,型別正是儲存這些資訊的最佳位置。描述一種型別所需要的資訊不可能用一個字串來搞定,所以型別不能是一個簡單的字串,這些資訊不能也不應該和資料儲存在一起,所以我們將型別定義成物件。

下面我們來正式介紹內建函式type()。通過呼叫type()函式你能夠得到特定物件的型別資訊:

type(42)<type 'int’>

我們仔細研究一下這個例子,請注意看type函式有趣的返回值。我們得到一個簡潔的輸出結果<type ‘int’>。不過你應當意識到它並不是一個簡簡單單的告訴你42是個整數這樣的字串。
您看到的<type ‘int’>實際上是一個型別物件,碰巧它輸出了一個字串來告訴你它是個int型物件。

現在你該問自己了,那麼型別物件的型別是什麼?來,我們試驗一下:

type(type(42))
<type ‘type’>

沒錯,所有型別物件的型別都是type,它也是所有Python型別的根和所有Python標準類的預設元類(metaclass)。你現在有點搞不明白,沒關係,隨著我們逐步深入的學習類和型別,你就會慢慢理解。

隨著Python 2.2中型別和類的統一,型別物件在物件導向程式設計和日常物件使用中扮演著更加重要的角色。從現在起,類就是型別,例項是對應型別的物件。

4.None,Python的Null物件

Python有一個特殊的型別,被稱作Null物件或者NoneType,它只有一個值,那就是None。

它不支援任何運算也沒有任何內建方法。如果非常熟悉C語言,和 None型別最接近的C型別就是void,None型別的值和C的NULL值非常相似(其他類似的物件和值包括Perl 的undef和Java 的void型別與null值)。

None沒有什麼有用的屬性,它的布林值總是False。

核心筆記:布林值
所有標準物件均可用於布林測試,同型別的物件之間可以比較大小。每個物件天生具有布林True或False值。空物件、值為零的任何數字或者Null物件None的布林值都是False。
下列物件的布林值是False。

  • None
  • False(布林型別)
  • 所有的值為零的數:
  • 0(整型)
  • (浮點型)
  • OL(長整型)
  • 0.0
  • 0.0j(複數)
  • ‘’ ‘’(空字串)
  • [](空列表)
  • ()(空元組)
  • {}(空字典)

值不是上面列出來的任何值的物件的布林值都是True,例如non-empty、non-zero等等。

使用者建立的類例項如果定義了nonzero(nonzero())或length (len())且值為0,那麼它們的布林值就是False。

5. 內部型別

  • 程式碼
  • 跟蹤記錄
  • 切片
    省略
    Xrange

我們在這裡簡要介紹一下這些內部型別,一般的程式設計師通常不會直接和這些物件打交道。不過為了這一章的完整性,我們還是在這裡介紹一下它們。請參閱原始碼或者Python 的內部文件和線上文件獲得更詳盡的資訊。

你如果對異常感到迷惑的話,可以告訴你它們是用類來實現的,在老版本的Python中,異常是用字串來實現的。

6.程式碼物件

程式碼物件是編譯過的Python原始碼片段,它是可執行物件。通過呼叫內建函式compile()可以得到程式碼物件。程式碼物件可以被exec命令或eval()內建函式來執行。

程式碼物件本身不包含任何執行環境資訊,它是使用者自定義函式的核心,在被執行時動態獲得上下文。(事實上程式碼物件是函式的一個屬性)一個函式除了有程式碼物件屬性以外,還有一些其它函式必須的屬性,包括函式名,文件字串,預設引數,及全域性名稱空間等等。

7.幀物件

幀物件表示 Python的執行棧幀。
幀物件包含Python直譯器在執行時所需要知道的所有資訊。

它的屬性包括指向上一幀的連結,正在被執行的程式碼物件,本地及全域性名字空間字典以及當前指令等。每次函式呼叫產生一個新的幀,每一個幀物件都會相應建立一個C棧幀。

用到幀物件的一個地方是跟蹤記錄物件。

8. 跟蹤記錄 物件

當你的程式碼出錯時,Python就會引發一個異常。如果異常未被捕獲和處理,直譯器就會退出指令碼執行,顯示類似下面的診斷資訊:

Traceback (innermost last):
File “stdin>”, line N?, in ???
ErrorName: error reason

當異常發生時,一個包含針對異常的棧跟蹤資訊的跟蹤記錄物件被建立。如果一個異常有自己的處理程式,處理程式就可以訪問這個跟蹤記錄物件。

9.切片物件

當使用Python擴充套件的切片語法時,就會建立切片物件。

擴充套件的切片語法允許對不同的索引切片操作,包括步進切片,多維切片,及省略切片。多維切片語法是sequence[startl : endl,start2 : end2],或使用省略號,sequence[… . , startl : endl ].

切片物件也可以由內建函式slice()來生成。步進切片允許利用第三個切片元素進行步進切片,它的語法為sequence[起始索引∶結束索引︰步進值]。

Python 很早就支援擴充套件步進切片語法了,但直到Python2.3以前都必須依靠CAPI或Jython才能工作。下面是幾個步進切片的例子:
當使用Python擴充套件的切片語法時,就會建立切片物件。擴充套件的切片語法允許對不同的索引切片操作,包括步進切片,多維切片,及省略切片。多維切片語法是sequence[startl : endl,start2 : end2],或使用省略號,sequence[… . , startl : endl ].切片物件也可以由內建函式slice()來生成。步進切片允許利用第三個切片元素進行步進切片,它的語法為sequence[起始索引∶結束索引︰步進值]。Python 很早就支援擴充套件步進切片語法了,但直到Python2.3以前都必須依靠CAPI或Jython才能工作。下面是幾個步進切片的例子:

foostr = ‘abede’
foostr[::-1]‘edcba’
foostr[::-2]
‘eca’

foolist = [123, 'xba ',342.23, 'abc’]>>>foolist[::-1]
[ 'abe ',342.23, 'xba ', 123]
在這裡插入圖片描述

10.省略物件

省略物件用於擴充套件切片語法中,起記號作用。這個物件在切片語法中表示省略號。類似Null物件None,省略物件有一個唯一的名字Ellipsis,它的布林值始終為True.

11.XRange物件

呼叫內建函式 xrange()會生成一個Xrange物件,xrange()是內建函式range()的兄弟版本,用於需要節省記憶體使用或range()無法完成的超大資料集場合。

標準型別運算子

1.物件值的比較

比較運算子用來判斷同型別物件是否相等,所有的內建型別均支援比較運算,比較運算返回布林值 True或False。
如果你正在使用的是早於 Python2.3的版本,因為這些版本還沒有布林型別,所以會看到比較結果為整型值1(代表True)或0(代表False)。

注意,實際進行的比較運算因型別而異。換言之,數字型別根據數值的大小和符號比較,字串按照字元序列值進行比較,等等。

注意,實際進行的比較運算因型別而異。換言之,數字型別根據數值的大小和符號比較,字串按照字元序列值進行比較,等等。

2 == 2
True

2.46<= 8.33True
5+4j >= 2-3jTrue
'abe’ == 'xyz’False
'abc’> 'xyz’False
'abc’< 'xyz’True
[3, ‘abc’] == ['abc ',3]False
[3, ‘abc’] == [3, ‘abc’]True
不同於很多其它語言,多個比較操作可以在同一行上進行,求值順序為從左到右。

3<4< 7# same as ( 3< 4 ) and ( 4< 7)
True

4 > 3 == 3 # same as ( 4 > 3 ) and ( 3 == 3 )True
4 < 3 < 5 != 2 < 7False

  • 表 標準型別值比較運算子
    exprl < expr2 exprl 小於expr2
    exprl > expr2 exprl 大於expr2
    exprl <= expr2 expr1 小於等於expr2
    exprl >= expr2 expr1 大於等於expr2
    expr1 == expr2 expr1 等於expr2
    expr1 != expr2 expr1不等於expr2 (C風格)
    exprl <expr2 expr1不等於expr2(ABC/Pascal風格)

注:未來很有可能不再支援〈>運算子,建議您一直使用!=運算子。

我們會注意到比較操作是針對物件的值進行的,也就是說比較的是物件的數值而不是物件本身。在後面的部分我們會研究物件身份的比較。


2.物件身份比較

作為對值比較的補充,Python也支援物件本身的比較。

物件可以被賦值到另一個變數(通過引用)。因為每個變數都指向同一個(共享的)資料物件,只要任何一個引用發生改變,該物件的其它引用也會隨之改變。

為了方便大家理解,最好先別考慮變數的值,而是將變數名看作物件的一個連結。讓我們來看以下三個例子:

例1:fool和foo2指向相同的物件

foo1 = foo2 = 4.3

當你從值的觀點看這條語句時,它表現的只是一個多重賦值,將4.3這個值賦給了fool和foo2這兩個變數。

這當然是對的,不過它還有另一層含義。

事實是一個值為4.3的數字物件被建立,然後這個物件的引用被賦值給fool和foo2,結果就是fool和 foo2指向同一個物件。圖4—1演示了一個物件兩個引用。

在這裡插入圖片描述

這個例子非常類似上一個,一個值為4.3的數值物件被建立,然後賦給一個變數,當執行foo2 = fool時,foo2被指向fool所指向的同一個物件,這是因為 Python 通過傳遞引用來處理物件。
foo2就成為原始值4.3的一個新的引用。這樣fool和foo2就都指向了同一個物件。

foo1 = 4.3
foo2 = 1.3 + 3.0

這個例子有所不同。

首先一個數字物件被建立,然後賦值給fool.然後第二個數值物件被建立並賦值給foo2.儘管兩個物件儲存的是同樣大小的值,但事實上系統中儲存的都是兩個獨立的物件,其中 fool是第一個物件的引用,foo2則是第二個物件的引用。

演示給我們這裡有兩個不同的物件,儘管這兩個物件有同樣大小的數值。我們為什麼在示意圖中使用盒子?沒錯,物件就象一個裝著內容的盒子。當一個物件被賦值到一個變數,就象在這個盒子上貼了一個標籤,表示建立了一個引用。

每當這個物件有了一個新的引用,就會在盒子上新貼一張標籤。當一個引用被銷燬時,這個標籤就會被撕掉。當所有的標籤都被撕掉時,這個盒子就會被回收。

那麼,Python是怎麼知道這個盒子有多少個標籤呢?

在這裡插入圖片描述

每個物件都天生具有一個計數器,記錄它自己的引用次數。這個數目表示有多少個變數指向該物件。這也就是我們在提到的引用計數.Python提供了is和is not運算子來測試兩個變數是否指向同一個物件。象下面這樣執行一個測試

a is b
這個表示式等價於下面的表示式id(a) == id(b)

物件身份比較運算子擁有同樣的優先順序,表列出了這些運算子。

在下面這個例子裡,我們建立了一個變數,然後將第二個變數指向同一個物件。

a =- [ 5, ‘hat’, -9.3]
b = a
a is bTrue
a is not bFalse

b = 2.5e-5>>> b
2.5e-005>>>a
[5, ‘hat’, -9.3]>>a is b
False

a is not b
True

is與not識別符號都是Python關鍵字在這裡插入圖片描述

核心提示:實踐
在上面的例子中,您會注意到我們使用的是浮點數而不是整數。

為什麼這樣?整數物件和字串物件是不可變物件,所以Python 會很高效的快取它們。這會造成我們認為Python應該建立新物件時,它卻沒有建立新物件的假象。看下面的例子:

a = 1

id(a)
8402824

b = 1id(b)
8402824

c = 1.0
id©8651220
d = 1.0>
id(d)
8651204

在上面的例子中,a和 b 指向了相同的整數物件,但是c和d並沒有指向相同的浮點數物件。如果我們是純粹主義者,我們會希望a 與b 能和c 與d一樣,因為我們本意就是為了建立兩個整數物件,而不是像b = a 這樣的結果。

Python僅快取簡單整數,因為它認為在 Python應用程式中這些小整數會經常被用到。當我們在寫作本書的時候,Python快取的整數範圍是(-1,100),不過這個範圍是會改變的,所以請不要在你的應用程式使用這個特性。

Python 2.3中決定,在預定義快取字串表之外的字串,如果不再有任何引用指向它,那這個字串將不會被快取。也就是說,被快取的字串將不會象以前那樣永生不滅,物件回收器一樣可以回收不再被使用的字串。從 Python 1.5起提供的用於快取字元的內建函式intern() 也已經不再推薦使用,即將被廢棄。

3.布林型別

布林邏輯運算子and,or 和 not都是Python關鍵字,這些運算子的優先順序按從高到低的順序列於表4.3. not運算子擁有最高優先順序,只比所有比較運算子低一級。and和 or運算子則相應的再低一級。

表 標準型別布林運算子

前面我們提到過Python支援一個表示式進行多種比較操作,其實這個表示式本質上是由多個隱式的and 連線起來的多個表示式。

3 <4 <7#same as "( 3 < 4 ) and ( 4< 7)”True

4.標準型別內建函式

除了這些運算子我們剛才也看到,Python提供了一些內建函式用於這些基本物件型別:
cmp(),repr(),str()type(),和等同於repr()函式的單反引號(’’)運算子。

5.type

我們現在來正式介紹type()。在 Python2.2以前,type()是內建函式。不過從那時起,它變成了一個“工廠函式”。在本章的後面部分我們會討論工廠函式,現在你仍然可以將type()僅僅當成一個內建函式來看。type() 的用法如下:

type (object)

type()接受一個物件做為引數,並返回它的型別。它的返回值是一個型別物件。

type (4)#int type
<type ‘int’>

type (’ Hello World ! ') # string type
<type ‘string’>

type (type(4)) #type type
<type ‘type’>

在上面的例子裡,我們通過內建函式type()得到了一個整數和一個字串的型別;為了確認一下型別本身也是型別,我們對type()的返回值再次呼叫type().一注意type()有趣的輸出,它看上去不象一個典型的Python資料型別,比如一個整數或一個字串,一些東西被一個大於號和一個小號包裹著。

這種語法是為了告訴你它是一個物件。每個物件都可以實現一個可列印的字串表示。

不過並不總是這樣,對那些不容易顯示的物件來說,Python 會以一個相對標準的格式表示這個物件,格式通常是這種形式:<object_something_or_another>,以這種形式顯示的物件通常會提供物件類別,物件id或位置,或者其它合適的資訊。

在這裡插入圖片描述

6.cmp()

內建函式cmp()用於比較兩個物件objl和 obj2,如果objl小於obj2,則返回一個負整數,如果objl大於obj2則返回一個正整數,如果objl等於obj2,則返回0。

它的行為非常類似於C語言的strcmp()函式。比較是在物件之間進行的,不管是標準型別物件還是使用者自定義物件。如果是使用者自定義物件, cmp()會呼叫該類的特殊方法_cmp_()。

會詳細介紹類的這些特殊方法。下面是幾個使用cmp()內建函式的對數值和字串物件進行比較的例子。

a, b = -4, 12>
cmp (a, b)
-1

cmp(b, a)1
b = —4>>>cmp(a, b)

a, b = 'abc ', ‘xyz’>
cmp (a, b)
-23

cmp(b, a)
23

b = ‘abc’

cmp(a, b)
0
在後面我們會研究cmp()用於其它物件的比較操作。

7.str()和repr()(及 ’ '運算子)

內建函式str() 和repr()或反引號運算子(~`)可以方便的以字串的方式獲取物件的內容、型別、數值屬性等資訊。

str()函式得到的字串可讀性好,而repr()函式得到的字串通常可以用來重新獲得該物件,通常情況下obj == eval(repr(obj))這個等式是成立的。

兩個函式接受一個物件做為其引數,返回適當的字串。在下面的例子裡,我們會隨機取一些Python物件來檢視他們的字串表示。

str(4.53-2j)
’(4.53-2j)’

str(1)'1’

str (2e10)
’20000000000.o’>>>

str([0, 5,9,9])’
[0,5,9,9]’

repr([0,5,9,9])
’[0,5,9,9]’

1`’[0,5,9,9]’

儘管str(), repr()和`運算在特性和功能方面都非常相似,事實上repr()和``做的是完全一樣的事情,它們返回的是一個物件的“官方”字串表示,也就是說絕大多數情況下可以通過求值運算(使用eval()內建函式)重新得到該物件,但 str()則有所不同。

str()致力於生成一個物件的可讀性好的字串表示,它的返回結果通常無法用於eval()求值,但很適合用於 print語句輸出。需要再次提醒一下的是,並不是所有repr()返回的字串都能夠用eval()內建函式得到原來的物件:

eval ( type(type)))File “”, line 1eval ( type (type)))
SyntaxError: invalid syntax

也就是說 repr()輸出對Python 比較友好,而str()的輸出對人比較友好。雖然如此,很多情況下這三者的輸出仍然都是完全一樣的。

核心筆記:為什麼我們有了repr()還需要^^`?

在Python學習過程中,你偶爾會遇到某個運算子和某個函式是做同樣一件事情。之所以如此是因為某些場合函式會比運算子更適合使用。
舉個例子,當處理類似函式這樣的可執行物件或根據不同的資料項呼叫不同的函式處理時,函式就比運算子用起來方便。另一個例子就是雙星號(
)乘方運算和pow()內建函式,x林y 和pow(x, y)執行的都是x的y次方。**

在這裡插入圖片描述

8.type()和isinstance()

Python不支援方法或函式過載,因此你必須自己保證呼叫的就是你想要的函式或物件。幸運的是,我們前面提到的type()內建函式可以幫助你確認這一點。

一個名字裡究竟儲存的是什麼?相當多,尤其是這是一個型別的名字時。確認接收到的型別物件的身份有很多時候都是很有用的。

為了達到此目的,Python提供了一個內建函式 type(). type()返回任意Python物件物件的型別,而不侷限於標準型別。讓我們通過互動式直譯器來看幾個使用type()內建函式返回多種物件型別的例子:

Python不支援方法或函式過載,因此你必須自己保證呼叫的就是你想要的函式或物件。(參閱Python常見問答4.75節)。幸運的是,我們前面4.3.1小節提到的type()內建函式可以幫助你確認這一點。一個名字裡究竟儲存的是什麼?相當多,尤其是這是一個型別的名字時。確認接收到的型別物件的身份有很多時候都是很有用的。為了達到此目的,Python提供了一個內建函式 type(). type()返回任意Python物件物件的型別,而不侷限於標準型別。讓我們通過互動式直譯器來看幾個使用type()內建函式返回多種物件型別的例子:

type(’’)
<type ‘str’>>>>

s = ‘xyz’>>>type (s)<type ‘str’>>>>
type (100)Ktype ‘int’>>>>type(O+0j)Ktype ‘complex’>>type (OL)Ktype ‘long’>>>>type (0.0)<type ‘float’>>>>
type([])<type ‘list’>>>>type(())

<type ‘tuple’>

type (l})<type ‘dict’>>

type (type)
<type ‘type’>>>>
class Foo: pass #new-style class

foo = Foo()
class Bar (object): pass#new-style class…
bar = Bar (>>>

type(Foo)<type ‘classobj’>>>>type(foo)<type ‘instance’>>>type (Bar)<type ‘type’>>>>type(bar)
<class ‘main.Bar’>

Python2.2統一了型別和類,如果你使用的是低於Python2.2的直譯器,你可能看到不一樣的輸出結果。

除了內建函式type(),還有一個有用的內建函式叫isinstance().
我們會物件導向程式設計正式研究這個函式,不過在這裡我們還是要簡要介紹一下你如何利用它來確認一個物件的型別。

舉例

在其中們提供了一段指令碼來演示在執行時環境使用isinstance()和 type()函式。隨後我們討論type()的使用以及怎麼將這個例子移植為改用isinstance()。

執行typechk.py,我們會得到以下輸出:

-69 is a number of type: int
9999999999999999999999 is a number of type:
long98.6 is a number of type: float
(-5.2+1.9j) is a number of type: comple
xxxx is not a number at all ! !

檢查型別(typechk.py)

函式displayNumType()接受一個數值引數,它使用內建函式type()來確認數值的型別(或不是一個數值型別)。

1 # !/usr/bin/env python2
3def displayNumType (num) :4 print num, 'is ',
5 if isinstance (num,(int,long,float,complex) ) :6 print 'a number of type: ', type (num)._name__7 else:
8 print 'not a number at all ! !’9
10 displayNumType (-69)
11 displayNumType(9999999999999999999999L)12 displayNumType(98.6)
13 displayNumType(-5.2+1.9j)14 displayNumType ( ‘xxx’)

例子進階
原始
這個完成功能的函式與本書的第一版中的例子已經大不相同:

def displayNumetype(num):
例子進階
print num, "is ",
if type (num) == type(O) :print ‘an integer’
elif type (num) -= type (OL) :print ‘a long’
elif type (num) == type(0.0):print ‘a float’
elif type (num) == type(O+0j):print ‘a complex number’
else:
print 'not a number at all ! !’

由於 Python奉行簡單但是比較慢的方式,所以我們必須這麼做,看一眼我們原來的條件表示式:
if type (num) == type(0). . .

減少函式呼叫的次數
如果我們仔細研究一下我們的程式碼,會看到我們呼叫了兩次 type()。

要知道每次呼叫函式都會付出效能代價,如果我們能減少函式的呼叫次數,就會提高程式的效能。

利用在本章我們前面提到的 types模組,我們還有另一種比較物件型別的方法,那就是將檢測得到的型別與一個已知型別進行比較。如果這樣,我們就可以直接使用type物件而不用每次計算出這個物件來。那麼我們現在修改一下程式碼,改為只呼叫一次type()函式:

import types
if type (num) == types.IntType… .


物件值比較 VS物件身份比較

在這一章的前面部分我們討論了物件的值比較和身份比較,如果你瞭解其中的關鍵點,你就會發現我們的程式碼在效能上還不是最優的.在執行時期,只有一個型別物件來表示整數型別.也就是說, type(0), type(42), type(-100)都是同一個物件:<type ‘int’>(types.IntType 也是這個物件)

最後!

今天的文章就到這裡結束啦,希望看完以後能對有一些不大不小的幫助。如果喜歡的可以點贊收藏關注,如果不行的話,那也得行(我們IT人不能說不行)球球大夥遼

如果大家感興趣的話,可以學習交流討論的,我們可以一起加油,可以點選這裡,我們們一起進步
Python自動化測試學習群在這裡插入圖片描述


  1. 0, 5,9, 9 ↩︎

相關文章