梳理Python基本數據類型

最近會將 Python 的基礎知識進行梳理歸納,這算是第一篇吧。小白剛入門,有錯誤或不詳實的地方還請大家斧正。

先羅列一下Python提供的基本數據類型:數值(整型、浮點型、複數、布爾型等)、字元串、列表、元組、字典、集合等,將它們簡單分類如下:

數值(Numbers)

numbers:列出了一些簡單的例子

361, -361, 0, 66666 # 整型 --> int()3.61, 3.14e-6, 0.0 # 浮點型 --> float()3+6j, 3.0+6.0j, 6j # 複數 --> complex([real[, imag]])0b101010 # 二進位 --> bin()0o177 # 八進位 --> oct()0x9ff # 十六進位 --> hex()# 常見操作+, -, *, /, //, %, ** # / 結果是浮點數,// 結果只取整數部分&, |, ^, <<, >> # 位操作,與,或,異或,左移,右移

bool:調用bool()可以檢查變數的真假值True或False。

if語句通過判斷布爾類型來控制程序的執行路徑,同時在 Python 中數據有隱式的真假值,可以使代碼變得簡短有效,如下

字元串(String)

首先,我們定義一個s=python語句,它在計算機中的執行順序是先在內存中創建一個字元串python,在程序棧寄存器中創建一個變數s,最後把python的地址賦給s 。

再來看看字元串的一些常見操作

"""字元串""" # 多行字元串,一般用於文件說明和函數說明,可使用__doc__輸出s = 優雅的Python# 切片s[0], s[-1], s[3:], s[::-1] # 優, n, Python, nohtyP的雅優# 替換,還可以使用正則表達式替換s.replace(Python, Java) # 優雅的Java# 查找,find()、index()、rfind()、rindex()s.find(P) # 3, 返回第一次出現的子串的下標s.find(h, 2) # 6, 設定下標2開始查找s.find(23333) # -1, 查找不到返回-1s.index(y) # 4, 返回第一次出現的子串的下標s.index(23333) # 不同與find(), 查找不到會拋出異常# 轉大小寫, upper()、lower()、swapcase()、capitalize()、istitle()、isupper()、islower()s.upper() # 優雅的PYTHONs.swapcase() # 優雅的pYTHON, 大小寫互換s.istitle() # Trues.islower() # False# 去空格,strip()、lstrip()、rstrip()# 格式化s1 = %s %s % (Windrivder, 21) # Windrivder 21 s2 = {}, {}.format(21, Windridver) # 推薦使用format格式化字元串s3 = {0}, {1}, {0}.format(Windrivder, 21)s4 = {name}: {age}.format(age=21, name=Windrivder)# 連接與分割,使用 + 連接字元串,每次操作會重新計算、開闢、釋放內存,效率很低,所以推薦使用joinl = [2017, 03, 29, 22:00]s5 = -.join(l) # 2017-03-29-22:00s6 = s5.split(-) # [2017, 03, 29, 22:00]# 還有一些常用的,這裡只列出來S.endswith() # 字元串是否以給定字元串結尾S.startswith() # 字元串是否以給定字元串開始S.isalnum() # 是否全是字母和數字S.isalpha() # 是否全是字母S.isspace() # 是否全是空白字元S.center(width, [fillchar]) # 中間對齊S.ljust(width,[fillchar]) # 左對齊,默認是空格補全S.rjust(width,[fillchar]) # 右對齊S.count(substr, [start, [end]])# 計算substr在S中出現的次數S.splitlines([keepends]) # 按行分割成list,keepends是一個bool值,如果為真每行後而會保留行分割符。

以上是一些常見的操作,當然還有一個沒有列出來,這裡想單獨拿來談談,就是 Python3 字元串的編碼:

  1. ASCII 編碼出現最早,只有大小寫英文字母、數字和一些符號等127個字元,為了實現多語言表示,如中文的GB2312編碼,日文的Shift_JIS編碼等,Unicode 孕育而生,它將所有語言都統一到一套編碼中;

  2. 在 Python3 中所有字元串在內存中均是 Unicode 保存;

  3. 當需要將文件保存到外設或進行網路傳輸時,就要進行編碼轉換,將字元轉換為位元組,以提高效率

# encode 將字元轉換為位元組>>> str = 優雅的Python >>> str.encode() # 默認編碼是 UTF-8bxe4xbcx98xe9x9bx85xe7x9ax84Python>>> str.encode(gbk) bxd3xc5xd1xc5xb5xc4Python# decode 將位元組轉換為字元>>> bxe4xbcx98xe9x9bx85xe7x9ax84Python.decode()優雅的Python>>> bxd3xc5xd1xc5xb5xc4Python.decode(gbk)優雅的Python

在 Python3 中,內存中的 Unicode 字元用 str 對象表示,對應於的,Python3 使用了一種全新的數據類型來表示位元組,就是 bytes,所以 encode 轉換後的位元組流就不是 str 對象,而是 bytes 位元組對象,它當然支持分片、索引、基本數值運算等操作,但 str 與 bytes 類型的數據不能進行+操作。

來看看 bytes 數據類型的定義:

>>> byt = b優雅的Python File "<stdin>", line 1SyntaxError: bytes can only contain ASCII literal characters.>>> byt = bPython>>> type(byt)<class bytes>

從上述例子中可以看出 bytes 對象不能由超出 ASCII 碼範圍的字元組成,只接受 ASCII 碼這個範圍的字元。

>>> uaa>>> u0061a>>> .encode(unicode-escape)b\u4e2d>>> b@Aab@Aa>>> bx40x41x61b@Aa>>> #-*- coding:utf-8 -*-... >>>

同樣,從上面的例子我們還可以總結出一些坑爹的東西:

  1. Unicode 碼在 Python3 中有兩種表示方式,u字元串和u四位十六進位數;區分r字元串 ,是表示不轉義的原始字元串

  2. 將字元直接以 Unicode 碼保存使用unicode-escape

  3. 在 Python 的互動式環境中,輸出 bytes 對象時,可按 ASCII 碼錶示,或按十六進位x表示

  4. 在 Python 頭聲明#-*- coding:utf-8 -*-,是告訴 Python 編譯器按utf-8的方式讀取,這個聲明並不能將 Python 文件本身保存成utf-8,這時候需要藉助文本編輯器保存文件編碼。

編碼部分我的理解就是這些了,感覺還是沒有將編碼問題總結清楚(無奈),期待各位的講解

列表(List)

Python 可使用語法糖[]表示列表,其中的元素可以是任何類型,以順序存儲的方式動態儲存數據:

# 定義L = [] # 推薦方式L = list()L = [Windrivder, 21, {name: xiaoming}]# 多重賦值技巧name, age, other = L# 列表切片參考str# 常用方法L.append(a) # [Windrivder, 21, {name: xiaoming}, a]L.pop() # [Windrivder, 21, {name: xiaoming}],還可以指定下標刪除元素L.extend(L1) # 合併列表 L1L.insert(1, a) # 在下標為1的位置插入aL.index(a) # 同字元串的index()L.remove(a) # 刪除操作L.count(a) # 求某個值的個數L.reverse() # 反轉L = [2, 4, -1, 9, -5, 6]L.sort() # sort()排序,使用非常靈活L.sort(reverse=True) # 反序L.sort(key=abs) # 傳入函數關鍵字作為排序規則for l1, l2 in zip([windrivder, 21], [jack, 22]): # zip 同時遍歷兩個列表 print({} --> {}.format(l1, l2))for index, value in enumerate(L): # enumerate 帶索引遍歷列表 print({} --> {}.format(index, value))# 列表生成式L = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]r = [sum(L) for l in L] # [6, 15, 24]L = [a for a in range(0, 10) if a % 2 == 0] # [0, 2, 4, 6, 8]

元組(Tuple)

元組與列表不同的是,元組是不可變類型(immutable),不能對元素進行修改,但內存可以明確知道需要分配多少空間給元組

# 定義t = ()t = tuple()t = (1,) # 定義一個元素時,需要與(1)-->int區分開 t = (Windrivder, 21, {name: xiaoming})# 沒有列出更多的方法,可以使用 tuple.__dir__() 查看t.index(21) # 1

字典(Dictionaries)

字典是通過鍵值對的方式進行存儲,佔用大量的內存而獲得極快的查找和插入速度,而列表剛好相反,查找和插入速度隨著元素的增加而變慢,但佔用的內存較小。字典雖然是可變類型,但因為它的 value 的位置是根據 key 計算出來的,因此 key 必須是不可變對象,這樣才能確保字典的正確使用。

# 定義d = {}d = {windrivder: 21, other: {jack: 22}} # 嵌套字典d = dict(name=windrivder, age=21)d = dict([(name, windrivder), (age, 21)]) # {name: windrivder, age: 21}d = dict(zip([name, age], [windrivder, 21]))# 常用方法d.keys(), d.values(), d.items() # 分別遍歷鍵、值、鍵值對d.setdefault(key[, value]) # 為字典的某一項設置默認值d.get(key, default) # 獲取字典中的某個值d.update(newd) # 合併字典,此方式效率較高d.pop(key, [d]) # 刪除字典中鍵值為key的項,返回鍵值為key的值,如果不存在,返回默認值d,否則拋出異常d.popitem() # 隨機刪除某一項鍵值對,還可以使用關鍵字 deld = {k: v for (k, v) in zip([name, age], [windrivder, 21])}

集合(Set)

集合與list類似,但集合中不允許有重複的元素,普通集合是可變的,Frozenset是不可變的,我們可以利用集合的特性消除重複元素或做並、交、差等數學操作

a = set()b = set([1, 2, 3])# 平時使用到的時候不多,所以沒有列出a.add(frozenset(b))

自定義數據類型

Python 允許通過繼承去自定義數據類型,很多第三方庫或框架都有類似的應用,這裡簡單實現了一個供參考:

class CustomDict(dict): Simple dict but support access as x.y style. def __init__(self, names=(), values=(), **kw): super(CustomDict, self).__init__(**kw) for k, v in zip(names, values): self[k] = v def __getattr__(self, key): try: return self[key] except KeyError: raise AttributeError( r"CustomDict object has no attribute %s" % key) def __setattr__(self, key, value): self[key] = value

暫時只想到這麼多了,以後隨著學習的深入再來修改補充吧。

下一篇準備總結Python對函數式編程的支持。

推薦閱讀:

Python實現手繪功能
Python爬蟲學習系列教程
基於pytesseract的簡單驗證碼識別
Spider與OpenPyXL的結合
Python入門到精通視頻課程(10)

TAG:Python | Python入门 | Python教程 |