一、序列類型(字符串,元組(),列表[])
?
序列類型支持in,len(),分片[],迭代,5種內置序列類型:bytearray,bytes,list,str,tuple(元組)。
1、元組可以嵌套(如:x=str[2][1][0][1])
2、元組的命名(collections.namedtuple(),即自定義)
?????? 樣:sale=collctions.namedtuple("sale","productid customerid date price") 逗號前的為元組類型的名稱,逗號后的參數為字符串,用空格分隔,每個名稱都代表該元組數據類型的一項,數據項如:x=sale(121,"2017-03-22",1,10.99);調用某一項則可用x.price來實現,此處結果為10.99;
?????? 對于格式化替換,可用**namedtuple._asdict()函數實現直接用名稱替換索引,如:"{productid}{price}".format(**x._asdict())。此方法用于多層元組較好,name即為最外層元組的name.
?????? 單個元素的元組需要加上逗號。
3、列表
?????? 1>列表也可存儲任意類型的數據,且可使用比較操作符(逐項進行比較)和修改列表內容。
?????? 2>列表支持元組的所有操作,同時還有以下函數:
?????? append() 追加
?????? count(x) 統計x出現的次數
?????? index(x,start,end)找x,如沒有則產生一個ValueError,
?????? extend() ? (等同于+=),
?????? insert(i,x) (在索引位置i處插入x),
?????? pop() 移除最后一項
?????? pop(i) (移除i索引位置處的數據項,如沒有i值,則默認移除最后一項),
?????? remove(x) (移除從左邊開始出現的第一個數據為x的項,如沒有則返回一個ValueError),
?????? reverse() ? 反轉,
?????? sort() 排序。
?????? 對序列特定位置進行賦值可以對列表中單個數據進行替換修改(x[1]=2;x[1:2]=[a,b],對片進行替換時新數據項的個數不一定要等于原數據項的個數,可以是任意個數,結果都是新的分片替換已選定的分片,如果新的替換分片為空,就相當于刪除了已選定的原分片),del x[1:2]也可以起到刪除這一分片的效果(不過del其實是解除了這一數據項與變量之間的綁定)。
?????? 3>用*對序列進行拆分賦值
?????? 樣:a,*b,c=[1,2,3,4,5,6]? -> a,b,c=(1, [2, 3, 4, 5], 6)
?????? 數據項按位置依次經變量賦值,然后將剩余的所有數據都賦給帶有*號的變量。*的作用就是將一個iterable進行拆分.
?????? “*”的另一個作用是復制操作符,其效果相當于乘號,不過對象不限于數字,可以為任何對象。
?????? 4>列表內涵(用于創建一些含有大量數據的列表)
?????? [expression for item in iterable](對iterable中每個數據項進行expression操作)
?????? [expression for item in iterable if condition],對限定條件的對象進行操作。
?????? 例:leaps=[y for y in range(1900,2000) if (y%4==0 and y%100!=0)or(y%400==0)] 計算閏年。(range同樣為前閉后開)
?????? 列表內涵的多變量嵌套:
?????? 例:cods=[s+z+c for s in "MF" for z in "SMLX" for c in "BGW"
????????????? if not(s=="F" and z=="X")]相當于三層疊加的for循環.
?
二、集合類型(set)({})
?
set支持 in ,len(),比較,位邏輯操作符;并且也是iterable的。只有可hash運算的對象才可以添加到集合中。所有內置的固定數據類型(float,frozenset,int,str,tupul...)都是可hash運算的。內置的可變數據類型(如:dict,list,set)都不是可hash運算的。
創建一個集合可用set("a","b",3),且創建一個空集合必須用set()。集合創建時可以存在兩個相同的項,但沒意義,最終形成的集合只會保留一個。
例:s={2,"veil",("a",5),frozenset({8,4,7}),"a"}
集合是沒索引位置區分的,也不能分片或按步距分片。集合中每個數據都是獨一無二的,所以集合常被用于刪除重復的數據項(x=list(set(x)))。
1、集合常用函數:
?????? s.add(x) 添加x到集合s中;
?????? s.clear() 清空;
?????? s.pop() ? 移除集合中任意一項,如果為空了則返回產生KeyError異常;
?????? s.remove(x) 移除x項,如x不存在就產生KeyError異常;
?????? s.discard(x)? 如果x 存在就移除掉該項;
?????? s.copy() 淺拷貝;? *
?????? s.different(t)s-t? 返回一個新集合,其只包含s但不在集合t中;? *
?????? s.difference_update(t)s-=t? 移除每一個在集合t但不在s中的項;
?????? s.intersection(t)s&t???? 返回s和t的交集;? *
2、集合聯合操作運算符結果:
?????? s|t,合集;s&t,交集;s-t,減去與t的交集;s^t,合集減去交集。
3、集合內涵(同列表內涵)
?????? {expression for item in iterable}
?????? {expression for item in iterable if condition}
4、固定集合(frozenset())
?????? 一旦創建了就不可改變,同static,可用的函數只有那些不改變集合本身內容的函數(上已用*標注)。
?
三、映射類型(dict)
?
映射是鍵-值數據的無序組合。內置的映射類型有:dict(),collections.defaultdict();對于3.1以上的還有collections.OrderedDict(),它同dict()一樣,不過有索引序列。
映射的鍵只有可hash運算的類型才可使用,而值則可使用任意類型的數據。
1、字典的創建
d=dict(id=1948,name="washer",size=3)? #關鍵字參數
d={"id":1948,"name":"washer","size":3}?? #面值
d=dict({"id":1948,"name":"washer","size":3})??? #面值
d=dict([("id",1948),("name","washer"),("size",3)])? #序列
d=dict(zip(("id","name","size"),(1948,"washer",3)))? #序列
{}或用d=dict()來創建一個空字典
2、使用d["id"]則返回相應的值,如果此鍵不存在,則產生一個KeyError.
d["xx"]=34可添加一個項,如果此鍵已經存在,則會修改原始的值。
del d["xx"]會刪除鍵為"xx"的項,如果不存在則產生一個KeyError。
3、常用函數(全)
?????? d.clear() 清空
?????? d.copy() 淺拷貝
?????? d.pop(k,v) 返回k的值,并刪除k項,如果k不存在,就返回KeyError或者v(如v存在的話)
?????? d.popitem() 移除任意一對鍵-值,如果d為空就產生KeyError
?????? d.values() 返回字典中所有值的視圖
?????? d.keys() 返回字典所有鍵的視圖
?????? d.items() 返回字典所有(key,value)對的視圖
?????? d.get(k) 返回k的值,如果k不存在就返回None
?????? d.get(k,v) 返回k的值,如果k不存在就返回v
?????? d.setdefault(k,v) 同get(),如果k不存在就插入一個k項,值為None或者v(如果給了v)
?????? d.fromkeys(s,v) 返回一個dict,它的鍵為序列s的項,值為None或者v(如果給了v)
?????? d.update(a) 用a更新d,如果鍵已存在則更新值,如不存在則插入。a可以是dict也可以是(key,value)對的一個iterable.
for
4、對字典的迭代
?????? 對鍵:for key in d:??? print(key)
????????????? 或:for key in d.keys():?? print(key)
?????? 對值:for value in d.values():???? print(value)
?????? 對鍵-值:for key,value in d.items():??? print(key,value)
????????????? 或:for item in d.items():??? print(item[0],item[1])
5、字典鍵的視圖與項的視圖支持一些類似于集合的操作(集合處的聯合操作運算)
此可用in來查看某個鍵是否存在于dict,也可用聯合操作運算查看特定集合的鍵是否存在于dict,如下:
d={}.fromkeys("ABCD",3);? s=set("ACX"); matches=d.keys()&s? #matches=={'A','C'}
6、字典內涵
{keyexpression:valueexpression for key ,value in terable}
{keyexpression:valueexpression for key ,value in terable if condition}
例:一個字典的鍵-值反轉:inverted_d={v:k for k, v in d.items()}
7、默認字典(collectons.defaultdict())
默認字典永遠不會產生KeyError,當查詢的鍵不存在時,字典就會自動生成一個新的以此查詢鍵為鍵的項,其值為創建字典時設定的默認值。
例:words=collections.defaultdict(int),新增入此字典的默認值就會是數字0。傳入的int為工廠函數(也就是一個不帶括號、沒有參數的函數),以后可用lambda函數進行簡單設置。
8、有序字典(collctions.OrderedDict())
字典的數據項以插入的順序進行保存,如果用了一個無序的字典來進行update(),得到的結果也會變成無序的。
do=collections.OderedDict([('z',5),(3,6),(8,'a')])或者先建一個空的,再一項一項的添加。
將一個普通字典轉換成有序字典:d=collections.OderedDict(sorted(d.items()))。
?
四、組合數據的迭代與復制
1、常見迭代操作符與函數:
?????? s+t 兩個序列的連接;
?????? s*n 返回n個s序列的連接的序列;
?????? x in s 判斷是否在內,not in;
?????? all(i) ? 如果iterable i中的每一項都評估為True,則返回True;
?????? any(i) 如果任意一項為True,則返回True;
?????? enumerate(i,start)通常用于for...in循環,提供一個(index,item)元組序列,其中的索引起始值為0或start;{相當于將一個序列i折分成單個,并給每個一個序列號,用(index,item),index為自動產生的序列號,item則依次為i每一項的值}
?????? len() 返回長度;
?????? max(i,key) 返回iterable i 中最大的項,如果給定的是key函數,就返回key(item)值最大的項;
?????? min(i,key)? 同上;
?????? range(start,stop,step) 返回一個數字迭代子,左閉右開,如果沒給start,則從0開始;
?????? reversed(i) 反轉序列;
?????? sorted(i,key,reverse)?? 排序;reverse=True時進行逆序排列。當key存在時可以設置為需要的任意函數規則,甚至可以是自己構造的函數,如key=abs以絕對值排列,key=str.lower,以str中的lower()函數規則排序。sorted()排序只適用于所有數據項都可以進行互相比較的組合類型,如果有不同的類型則會產生一個TypeError。
?????? sum(i,start)? 求和,start為可選
?????? zip(i1,...,iN) 返回元組的迭代子,使用迭代子i1到iN;i1-iN都是iterable數據組,例可參考dict的zip構造方式。只要有某個iterable中的元素用完,就終止迭代過程。
2、用a=iter(iterable結構)可以獲取一個迭代子,在每次循環時可用next(a)方法獲取下一個數據項,當結尾時會產生一個StopIteration異常。
3、組合數據類型的復制。
樣:b="sudent",a=b?? 這樣的用等號只是簡單的將b的值賦給了a,但b的值"student"在系統內并沒有被復制成2份,只是a和b都指向"student"這個值,無論是從a還是從b改變這個對象"student",另一個變量也會顯示出改變后的結果。要想復制出一個"student"的副本則可以用加上類型名:a=str(b);或者分片的方式a=b[:],因為提取分片時會產生一個副本。對于字典和集合類型則用copy()函數來實現。
?????? 以上的方法都屬于淺拷貝,因為它只會復制對象的第一層內容。如果對象中還存在可變的iterable對象,它拷貝的只是iterable對象的引用地址,如果iterable從原對象改變了,拷貝對象的iterable部分也會跟著改變。如嵌套的列表:['a',['b','c']],復制此對象['b','c']部分時只是復制的一個引用地址。 如果要對此對象進行完全的復制則需用到深拷貝,import copy;?????? a=copy.deepcopy(b)
4、位置常量命名一般方法:WATER,TREE,MONEY=range(1,4);那么這三個字符的值依次就為1,2,3
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
