python的內置類型

 

字符串與字節

python2中用str表示字節字符串,這種類型如今在Python3中用bytes對象來處理,明確區分字符串與字節html

python3中只有一種可以保存文本信息的數據類型,就是str,它是不可變序列,保存的是Unicode碼位python

bytes以及可變的bytearray與str不一樣,只能用字節做爲序列值,即0<=x<=256範圍內的整數。例如數據結構

>>>print(bytes([102,111,111]))
b'foo'

   對於bytes和bytearray,在轉換爲另外一種序列類型(如list或tuple)時能夠顯示其原本面目:例如:app

>>>list(b'foo bar')
[102,111,111,32,98,97,114]
>>>tuple(b'foo bar')
(102,111,111,32,98,97,114)

  從python3開始,全部沒有前綴的字符串都是Unicode。所以,全部用單引號,雙引號或成組的3個引號包圍且沒有前綴的值都表示str數據類型:函數

>>>type("some string")
<class 'str'>

  在python2中,Unicode須要有前綴(例如u"some string")。從python3.3開始,爲保證向後兼容,仍然支持這個前綴,但它在python3中沒有任何語法上的意義。性能

字節的明確語法:字節也被單引號,雙引號或三引號包圍,但必須有一個b或B前綴。測試

關於pytho字符串編碼與解碼參考: https://blog.csdn.net/trochiluses/article/details/16825269編碼

字符串拼接

python中字符串是不可變的,拼接任意多個字符串時在內存中會產生一個新的序列對象:好比lua

s=""
for substring in substrings:
    s += substring

  字符串s經過屢次拼接來建立一個新字符串,可是這中建立方式效率極低。幸虧python爲咱們提供了str.join()方法。它接受一個可迭代字符串爲參數。由於它是一個方法,實際調用時利用空字符串來調用,參數爲須要拼接的迭代字符串spa

s="".join(substrings)

  join方法還能夠在須要合併的多個字符串之間插入分隔符

','.join(['a','b','c','d'])
'a,b,c,d'

  雖然join方法速度更快,但並非全部須要拼接字符串的狀況下都使用該方法。在下面幾種狀況下,join的性能可能還不如利用加法的普通拼接

  1. 字符串的數量不多,並且已經存在在某個可迭代對象中時,加法性能會超過join
  2. 比較短的字符串,編譯時會被轉換爲更短的形式:如‘a’+'b'+'c' 在編譯時被轉換爲‘abc’
  3. 事先知道字符串的數目,能夠用字符串格式化str.format()方法或%運算符,此時該format()爲最佳方法

集合類型

python內置集合類型有:列表(list),元組(tuple),字典(dictionary),集合(set)

python中組基本的兩種集合類型list和tuple,他們都是對象序列,列表時動態的,大小可變動,元組是不可變的,一旦建立就沒法修改,所以也是可哈希(hashtable)的,便可做爲字典中的key

列表中的方法操做詳解參考:http://www.javashuo.com/article/p-mnsgbtkw-bs.html

列表推導

咱們都值都,編寫這樣的代碼時痛苦的

這種方法可能適用與C語言,但在python中的實際運行速度很慢,有如下緣由:

  1. 解釋器在每次循環中都須要判斷序列中的那一部分須要修改
  2. 須要用一個計數器來跟蹤須要處理的元素
  3. 因爲append()時一個列表方法,全部每次遍歷時都須要額外執行一個查詢函數

列表推導就是爲了解決這個問題,它使用編排好的功能對上述語句的一部分作了自動化處理:

這種寫法更加高效簡短,也意味着更少的錯誤,更容易閱讀和理解

建立列表的其餘方法(習語)

python習語的另外一個典型例子就是使用enumerate(枚舉)。在循環中使用列表時,這個內置函數能夠很方便的獲取其索引,列如:

它能夠替換爲下面這段更短的代碼:

若是須要一個一個合併多個列表(或任意可迭代對象)中的元素,那麼可使用內置的zip()函數。 

 

注意:對zip函數返回的結果再次調用zip,能夠將其恢復原狀

另一種常見的語法元素是序列解包。這種方法適用與任意序列類型(列表,元組,字符串,字節序列等)。只要賦值運算符左邊的變量和右邊的元素數目相等,你均可以用這種方法將元素序列解包到另外一邊的變量中:

解包還能夠利用帶*的表達式獲取單個變量中的多個元素,只要它的解釋沒有歧義便可。還能夠對嵌套序列進行解包。下面是一些更復雜的解包實例:

帶*的表達是能夠獲取序列剩餘部分

帶*的表達是能夠獲取序列的中間部分

嵌套解包

 

字典

 字典能夠用和前面列表推導相似的推導來建立一個新的字典。如:

重要的是,使用字典推導具備與列表推導相同的優勢,所以字典推導要更加高效,更加簡短,更加簡潔。

字典的keys(),values()和items()3個方法的返回值類型再也不是列表,而且與之對應的iterkeys(),itervluae()和iteritems()原本返回的是迭代器,python3中已經沒有這三個方法。python3中keys(),vlaues()和items()返回的是視圖對象(view objects)

 

  1. keys():返回dict_keys對象,查看字典的全部鍵
  2. values():返回dict_values對象,查看字典的全部值
  3. items():返回dict_items對象,查看字典全部的(key,value)二元組

視圖對象能夠動態查看字典的內容,所以每次字典發生變化時,視圖都會相應的變化:

獲取字典長度使用len(len(words)),測試元素是否包含其中使用in子句

在keys和values方法返回的視圖中,鍵和值的順序時徹底對應的。但在python2中,若是你想要保證獲取的鍵和值順序徹底一致,須要在兩次函數調用以前不能修改字典內容

字典的鍵必須時可哈希(hashable)的(可哈希:一個對象有一個整個生命週期值不變的散列值,而且能夠和其餘對象進行比較),python全部不變的類型都是可哈希的,可變類型(列表,字典和集合)是不可哈希的

字典是無序的,可是python標準庫的collections模塊提供了名爲OrderedDict的有序字典

集合(Set)

集合是一種很棒的數據結構,它與數學中的集合概念類型,有交集,並集等概念

Python的內置集合類型有兩種:

set():可變的,無序的,有限的集合,其元素是惟一的,不可變的對象,集合中的元素必須是可哈希的

frozenset():不可變的,可哈希的,無序的集合,其元素是惟一的,不可變的對象,在一個set()或frozenset()中不能包含另外一個普通的可變set(),會拋異常TypeError

 

下面這種集合初始化的方法是徹底正確的:

建立可變集合有三種方法:

  1. 調用set(),選擇性地接受可迭代對象做爲初始化參數,例如set([0,1,2])
  2. 使用集合推導,例如:{element for element in range(3)}.
  3. 使用集合字面值,例如{1,2,3}

 注意:空的集合對象是沒有字面值的。空的花括號{}表示的是空的字典字面值

相關文章
相關標籤/搜索