官术网_书友最值得收藏!

1.2 數據類型

經過對1.1節的學習,讀者已經對Python開發有所了解,從本節開始,我們將逐步學習Python的編程技巧。

數據類型的定義是一個值的集合及定義在這個集合上的一組操作。變量用來存儲值的所在之處,它們有名字和數據類型。變量的數據類型決定了如何將代表這些值的位存儲到計算機的內存中。Python在聲明變量時雖然無須指定數據類型,但是每個變量在被賦值時便會被賦予一種數據類型。所以,所有變量都具有數據類型,掌握數據類型是學好Python的基礎。

1.2.1 Number類型

Number類型即數值類型,通常用于存儲數字,是最常用的變量類型。

1. 類型定義

Python中的數值類型包括integer、bool、float和complex。

(1)integer:整型,相當于C語言中的int及long型。與C語言及Python 2不同的是,在Python 3中不限制整型變量的取值范圍,即可以使用超出-264~264范圍的數值,示例如下:

(2)bool:布爾型,多用于判斷場景,只有兩個值,即True和False,示例如下:

(3)float:浮點數,可以用直接的十進制或科學計數法表示,每個浮點數占8字節。浮點數值通常都有一個小數點和一個可選的后綴e(大寫或小寫,表示科學計數法),在e和指數之間可以用正(+)或負(-)表示指數的正負,示例如下:

其中float("inf")與float("nan")常被用來與其他數值做比較運算。

(4)complex:復數,可以指不實的數字或并非表明具體數量的數字。復數由實數部分和虛數部分構成,虛數部分必須有后綴j或J。示例如下:

2. 操作符

Python中的數值操作符分兩類:一類是算術操作符,如加、減、乘、除;另一類是比特操作符,如取反、異或等。表1.1列出了Python中的算術操作符及其含義,表1.2列出了Python中的比特操作符及其含義。

表1.1 Python中的算術操作符及其含義

算術操作符的使用示例如下:

表1.2 Python中的比特操作符及其含義

比特操作符的使用示例如下:

技巧:進行比特運算時,可以先想想這些數字的二進制形式,之后就能手到擒來。比如對于表達式3 ^ 1,其二進制形式為011 ^ 001 = 010,結果為十進制的2。

3. 內置函數

除了操作符,Python中還有一組內置函數支持數值類型的變量操作。本書把這些內置函數分為兩類:一類是通用函數,它們不僅適用于數值類型的變量,還適用于其他類型的變量;另一類是特定函數,它們只適用于數值類型的變量的相關操作。表1.3列出了Python中的通用函數及其含義。

表1.3 Python中的通用函數及其含義

通用函數的使用示例如下:

表1.4列出了Python中的數值類型的特定函數及其含義。

表1.4 Python中的數值類型的特定函數及其含義

數值類型特定函數的使用示例如下:

1.2.2 Sequence類型

除了基本的數值類型,Python中的Sequence類型在Python編程中占有重要的地位,Python中的字符串(string)、元組(tuple)、列表(list)都屬于Sequence類型,即序列類型。可以將字符串看作由字符組成的序列類型,元組是由任意對象組成的不可修改序列類型,列表是由任意對象組成的可修改序列類型。序列類型的操作方式在這些類型中共用,本節學習序列類型的共同技巧。

1. 操作符

Python中的序列操作符包括元素提取、序列鏈接等,如表1.5所示。

表1.5 序列操作符及其含義

【示例1-2】序列操作符的使用示例如下:

2. 內置函數

序列類型可以使用內置函數進行求長度、類型轉換、排序等操作。序列類型內置函數及其含義如表1.6所示。

表1.6 序列類型內置函數及其含義

【示例1-3】序列類型內置函數的使用示例如下:

1.2.3 string與bytes

string(字符串)是由零個或多個字符組成的有限序列。字符串通常以串的整體作為操作對象,例如,在字符串中查找某個子串、求取一個子串、在串的某個位置上插入一個子串及刪除一個子串等。Python中的字符串是Sequence類型的一員,字符串用引號包含標識,如"Hello"、'This is fantacy!'。

技巧:在Python中雙引號和單引號的意義相同,都可用于表示字符串。

在Python 3中,string類型中的每個字符都以Unicode方式編碼,因此實際上每個字符都可由多個字節組成。與string類型相對的另一種Sequence類型是bytes(字節串),它由若干字節組成,以字節為單位進行操作。字節串用前綴b表示,如b"I’m bytes"、 b'Python3'。

string與bytes類型的對象可以通過encode()與decode()函數相互轉換,比如:

在Python 3中對string類型進行這樣的定義大大改善了在Python 2中惱人的非ANSI字符顯示亂碼的問題。總的來說,string是適用場景更多的文本Sequence類型,是本節講解的重點。但在本書將要學習的網絡通信類框架Tornado與Twisted中,收發數據的數據類型多為bytes,屆時請讀者注意。

1. 基本使用

Python中的字符串可以用單引號、雙引號或三重引號定義,其中前兩者用于定義單行文本,而三重引號用來定義多行文本。此外,在Python 2中用為字符串增加前綴u的方式將其定義為Unicode編碼;但如前所述,在Python 3中所有字符串都是Unicode編碼的,因此在開發過程中該前綴已無實際意義。

【示例1-4】字符串基本使用演示如下:

注意:Python 3仍然支持字符串前綴u,但其目的僅僅是兼容舊的Python 2代碼。

【示例1-5】通過所有Sequence類型通用的切片操作可以讀取字符串的部分內容:

【示例1-6】字符串是不可變類型,也就是說,改變一個字符串的元素需要新建一個新的字符串。如下代碼演示了如何修改字符串:

技巧:因為string是一種Sequence類型,所以1.1.2中的所有操作符和函數都適用于string類型,本節不再重復舉例。

2. 字符串格式化

【示例1-7】字符串格式化是按指定的規則連接、替換字符串并返回新的符合要求的字符串。比如:

Python中格式化字符串的表達式語法主要有兩類:

其中format_v2是Python 2風格的格式化模板,format_v3是Python 3風格的格式化模板。格式化模板中包括字符串中的固定內容與待替換內容,待替換的內容用格式化符號標明;obj_to_convert為要格式化的字符串,如果是兩個以上,則需要用小括號括起來。format_v2與format_v3中的可用格式化符號如表1.7所示。

表1.7 format_v2與format_v3中的可用格式化符號

除了表1.7中的格式化符號,有時需要調整格式化符號的顯示方法,如調整數字的顯示精度及是否輸出正值符號“+”等,表1.8列出了輔助格式化符號的使用方法。

表1.8 輔助格式化符號的使用方法

【示例1-8】結合表1.7和表1.8,格式化字符串的使用方法舉例如下:

使用Python 3風格格式化的一個好處是,可以在格式化模板中指定待替換內容的具體位置,并允許內容復用。比如:

本例中.format()的參數列表里共有兩個變量,但是在格式化模板中有三個格式化符號,其中{1:s}與{1!r}替換的是同一個參數"Henry"。

此外,Python 3風格的格式化模板還允許省略替換格式,比如:

在格式化模板中用簡單的花括號對“{}”就完成了內容替換。

注意:Python 2風格的字符串格式化在今后的Python版本中可能被廢棄,建議在新項目開發中使用Python 3風格。

格式化字符串中的固定內容除了字母、數字、標點符號等可顯示的字符,還可以包含不可顯示字符,如回車、縮進等。Python中稱這種字符為轉義字符,表1.9總結了轉義字符。

表1.9 轉義字符

【示例1-9】在字符串中,這些轉義字符串會被解釋為相應的意義,如果在字符串前面加了標識“r”,則可禁用轉義字符解釋,示例如下:

3. 內置函數

字符串作為最重要的常用類型之一,有一系列特有的內置函數,常用的字符串如下。

? capitalize():將字符串中的第1個字符大寫。

? center(width):返回一個長度至少為width的字符串,并使原字符串的內容居中。

? count(str,beg=0,end=len(str)):返回子串str出現的次數,可以用開始索引(beg)和結束索引(end)指定搜索的范圍。

? encode(encoding='UTF-8',errors='strict'):以encoding指定的編碼格式編碼string,返回一個bytes類型對象。

? endswith(obj, beg=0,end=len(string))b,e:檢查字符串是否以obj結束,如果是,則返回True,否則返回False;可以用開始索引(beg)和結束索引(end)指定搜索的范圍。

? expandtabs(tabsize=8):把字符串string中的Tab符號轉為空格,默認的空格數tabsize是8。

? find(str, beg=0,end=len(string)):檢測str是否包含在string中;可以用開始索引(beg)和結束索引(end)指定搜索的范圍,找到則返回索引值,找不到則返回-1。

? index(str, beg=0,end=len(string)):跟find()類似,但是如果str不在string中,則報一個異常。

? isalnum():如果發現有一個字符并且所有字符都是字母或數字,則返回True,否則返回False。

? isalpha():如果發現有一個字符并且所有字符都是字母,則返回True,否則返回False。

? isdecimal():如果可解釋為十進制數字,則返回True,否則返回False。

? isdigit():如果可解釋為數字,則返回True,否則返回False。

? islower():如果字符串中的字符都是小寫,則返回True,否則返回False。

? isnumeric():如果只包含數字字符,則返回True,否則返回False。

? isspace():如果字符串是空格,則返回True,否則返回False。

? istitle():如果字符串是標題,則返回True,否則返回False。

? isupper():如果字符串中的字符都是大寫的,則返回True,否則返回False。

? ljust(width):返回一個原字符串左對齊,并使用空格填充至長度width的新字符串。

? lower():轉換所有大寫字符為小寫。

? lstrip():截掉string左邊的空格。

? replace(str1, str2,num=count(str1)):把string中的str1替換成str2,num指定替換的最大次數。

? rfind(str, beg=0,end=len(string)):類似于find(),但是從右邊開始查找。

? rindex( str, beg=0,end=len(string)):類似于index(),但是從右邊開始查找。

? rjust(width):返回一個原字符串右對齊并使用空格填充至長度width的新字符串。

? rpartition(str)e:類似于partition()函數,但是從右邊開始查找。

? rstrip():刪除string字符串末尾的空格。

? split(str="", num=count(str)):以str為分隔符切片string,如果num有指定的值,則僅分隔num個子字符串。

? splitlines(num=count('\n')):按照行分隔,返回一個包含各行作為元素的列表,如果num已指定,則僅切片num個行。

? startswith(obj, beg=0,end=len(string)):檢查字符串是否以obj開頭,如果是則返回True,否則返回False。可以用開始索引(beg)和結束索引(end)指定搜索的范圍。

? strip([obj]):在string上執行lstrip()和rstrip()。

? swapcase():翻轉string中的大小寫。

? title():將字符串標題化,即所有單詞都以大寫開始,其余字母均小寫。

? translate(str, del=""):根據str給出的表轉換string的字符,將要過濾掉的字符放到del參數中。

? upper():轉換string中的小寫字母為大寫。

? zfill(width):返回長度為width的字符串,原字符串string右對齊,前面填充0。

【示例1-10】內置函數示例如下:

1.2.4 tuple類型

tuple類型即元組,是一種特殊的Sequence類型。tuple用圓括號“( )”表示,在不同的元素之間以逗號隔開。在Python中,tuple的大小和其中的元素在初始化后不能修改,tuple的操作速度比可修改的list的操作速度快。如果開發者定義了一個值的常量集,并且唯一要用它做的是不斷地讀取,則這正可以發揮tuple的長處。

【示例1-11】tuple通過Sequence類型的通用方法進行操作,示例如下:

1.2.5 list類型

list類型即列表,是一種常用的Sequence類型。list用中括號“[ ]”表示,不同的元素之間以逗號隔開。在Python中,list的大小和其中的元素在初始化后可以被再次修改,這是list與tuple的主要區別。如果開發者定義了一組值,并且在之后需要不斷對其進行增、刪、改等操作,則應該使用list類型。

1. 基本操作

【示例1-12】list通過Sequence類型的通用方法進行操作,示例如下:

2.內置函數

除了Sequence類型公用的操作,tuple類型還有一組自己的函數,常用的函數如下。

? append(obj):在列表尾部添加一個對象。

? count(obj):計算對象在列表中出現的次數。

? extend(seq):把序列seq的內容添加到列表中。

? index(obj, i=0, j=len(list)):計算對象obj在列表中的索引位置。

? insert(index, obj):把對象插入列表index指定的位置。

? pop(index=-1):讀取并刪除index位置的對象,默認為最后一個對象。

? remove(obj):從列表中刪除對象obj。

? reverse():獲得反向列表。

? list.sort(func=None,key=None,reverse=False):以指定的方式排序列表中的成員。

【示例1-13】這些函數的使用方式示例如下:

1.2.6 set類型

set類型即集合,用于表示相互之間無序的一組對象。集合在算術上的運算包括并集、交集、補集等。Python中的集合分為兩種類型:普通集合和不可變集合。普通集合在初始化后支持并集、交集、補集等運算;而不可變集合初始化后就不能改變。

1. 類型定義

Python中通過關鍵字set和frozenset定義普通集合和不可變集合,初始化集合內容的方法是向其傳入Sequence類型簇的變量。

【示例1-14】set類型示例如下:

普通集合定義時也可以省略set,直接用大括號“{}”代替,如:

根據集合的算術意義,Python定義了相應的操作符,如表1.10所示。

表1.10 集合操作符

【示例1-15】集合類型的操作符的使用方法如下:

2. 內置函數

set類型有一組自己的內置函數,用于集合的增、刪、改等操作,如下所述。

? add():增加新元素。

? update(seq):用序列更新集合,序列的每個元素都被添加到集合中。

? remove(element):刪除元素。

【示例1-16】set類型的內置函數的使用方法如下:

1.2.7 dict類型

dict類型即字典,代表一個鍵值存儲庫,工作方式很像映射表。給定一個鍵,可以在一個dict對象中搜索該鍵對應的值,因此字典被認為是鍵值對的列表。

1. 類型定義

dict是Python中唯一表示映射關系的類,所以其有自己獨特的定義和操作方式。

【示例1-17】開發者可以用“{key1:value, key2:value…}”的方式初始化字典,示例如下:

2. 內置函數

Python為字典類型定義了豐富的函數操作,如下所述。

? clear():清除字典中的所有鍵值對。

? copy():復制字典的一個副本。

? fromkeys(seq,val=None):用seq中的元素作為鍵創建字典,所有鍵的值都被設為val,val默認為None。

? get(key,default=None):讀取字典中的鍵key,返回該鍵的值;如果找不到該鍵則返回default所設的值。

? key in DICT:用in關鍵字判斷鍵key在字典中是否存在,如果存在則返回True,否則返回False。

? items():返回一個包含字典中鍵值對元組的列表。

? keys():返回一個字典中所有鍵的列表。

? iteritems():返回字典中所有鍵值對的迭代器。

? iterkeys():返回字典中所有鍵的迭代器。

? itervalues():返回字典中所有值的迭代器。

? pop(key[, default]):讀取某鍵的值,并且從字典中刪除該鍵的值。如果鍵key不存在且沒有設置default,則引發KeyError異常。

? setdefault(key,default=None):設置字典中鍵key的值為default。

? update(dict):合并字典。

? values():返回一個包含字典中所有值的列表。

【示例1-18】dict內置函數的使用方法示例如下:

主站蜘蛛池模板: 永兴县| 崇义县| 仁布县| 米林县| 南汇区| 许昌县| 伊川县| 永顺县| 金堂县| 澜沧| 中超| 霸州市| 乐亭县| 新乐市| 怀柔区| 山阳县| 怀集县| 乐陵市| 台东县| 纳雍县| 大田县| 东阳市| 原平市| 黄石市| 延庆县| 临邑县| 纳雍县| 宿州市| 鲜城| 普兰店市| 恭城| 杭州市| 邛崃市| 临颍县| 仁寿县| 繁峙县| 怀宁县| 晴隆县| 长寿区| 商南县| 淳化县|