elem 是單詞 element(元素)的縮寫,在程式定義中代表某一不確定的類型,也就是抽象的資料類型。
清單
定義
由一系列元素按順序進行排列而成的容器
- 元素可以是任意類型
- 元素按確定順序排列,具有有序性
建立清單
先建立空清單實例再新增元素
- list()
- .append()方法
>>>wife = list()#實例化
>>>wife.append("西宮硝子")
>>>wife.append("櫻島麻衣")
>>>wife.append("愛莉希雅")
>>>wife
['西宮硝子','櫻島麻衣','愛莉希雅']
直接定義清單並填入元素
>>> phones = ["Apple", "Huawei", "Xiaomi"]
>>> phones
['Apple', 'Huawei', 'Xiaomi']
查看元素
- 使用索引 用$[i]$查看第i+1個元素
- index()方法 $$name.index(x)$$ 在list name中查找第一個值為x的元素,返回其索引
- count()方法 $$name.count(x)$$ 在list name中查看有幾個元素為x,返回個數
- len()方法 $$name.len()$$ 查找list name中元素總個數,返回個數
新增元素
- append()方法 $$name.append(x)$$ 向name末尾添加元素x
- insert()方法 $$name.insert(i,x)$$ 將物件x插入name索引為i處,原來i以及i後面的元素順位後移
- extend()方法 $$name.extend(name2)$$ 將list name2接在list name後面
修改元素
- 用索引指明元素直接賦值修改
刪除元素
- pop()方法 $$name.pop()$$ 預設刪除list最後一個元素 $$name.pop(i)$$ 刪除索引為i的元素,後面的元素順位前移
- remove()方法 $$name.remove(x)$$ 刪除第一個值為x的元素,後面的元素順位前移
- clear()方法 $$name.clear()$$ 刪除所有元素(清空list)
- del語句 $$del\ name[a:b]$$ 刪除del索引$[a,b)$的元素,包括a不包括b $del\ name[:]$表示清空list $$del\ name[i]$$ 刪除索引為i的元素
反轉列表
- reverse()方法 $$name.reverse()$$ 將列表name反轉,最後一個元素變為第一個元素以此類推。
- 切片法
>>> nums=[1,2,3,4,5]
>>> new_nums=nums[::-1]
>>> new_nums
[5,4,3,2,1]
原對象nums不變,產生新對象new_nums為反轉列表
列表排序
- sort()方法 $$name.sort()$$ $$name.sort(cmp=None,key=None,reverse=False)$$
該方法無返回值,會直接修改原list
cmp為可選參數,
key指明用元素的哪個參數作為比較權重,只有一個參數,取自比較的可迭代對象
- 當比較元素elem僅包含一個參數(比如數字或單個字符)時,可省略key參數。
# 獲取列表的第二個元素
def takeSecond(elem):
return elem[1]
# 列表
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
# 指定第二個元素排序
random.sort(key=takeSecond)
#通過函數takeSecond指定比較元組第二個元素(權重)
# 輸出類別
print('排序列表:')
print(random)
排序列表:
[(4, 1), (2, 2), (1, 3), (3, 4)]
- reverse為排序規則,默認False升序,True為降序
tuple
定義
元組(tuple),由一系列元素按順序進行排列形成的容器 元組不可變(immutable),列表可變(mutable)
創建元組
- 直接使用$()$將所有元素包圍,創建list是使用$[]$
- 有時不使用$()$也能創建元組(不建議)
- 元組推導式
atuple=(i+1 for i in range(31,42))
- 當創建的元組僅包含一個對象時,在其後添加逗號$","$ 否則帶小括號對象數據類型為對象類型而非元組
- 創建空元組
a=tuple()
b=()
tuple不允許增刪改查
tuple與list轉換
tuple->list
atuple=(1,'love',3.334,'Y')
list(atuple)
'''此時atuple仍為tuple類型'''
alist=list(atuple)
'''alist為list類型'''
print(atuple)
輸出(1, 'love', 3.334, 'Y')
print(alist)
輸出[1, 'love', 3.334, 'Y']
list->tuple
alist=['I',2,3.1415,'polaris']
atuple=tuple(alist)
'''alist仍為list,atuple為tuple'''
dict
定義
- 字典(dict),由一系列鍵值對(key-value) 組合而成的資料結構。
- key必須為可以hash的值,如==字串==、數值
- hash:雜湊(散列、雜湊),將任意長度輸入通過雜湊(雜湊)演算法變換成固定長度輸出(雜湊值)。 hash是一種壓縮映射。
- value,可以為任意物件
創建字典
- 先創建空字典再添加元素 注意用等號連接識別符與物件(key&value) 此時key為識別符,識別符字串不用加引號
- 直接使用大括號$\{\}$ 注意用冒號連接key與value 此時冒號前為key,字串需要引號
- 使用dict()函數從鍵值對序列(如tuple、list)創建dict
profile=dict(name='孤箏',age=19,愛好='明月栞那')
profile={name:'孤箏',age:19,愛好:'明月栞那'}
alist=[('name','孤箏'),('age',19),('愛好','明月栞那')]
profile=dict(alist)
此時alist仍為list,profile物件為dict
print(profile)
輸出{'name':'孤箏','age':19,'愛好':'明月栞那'}
- 字典推導式
adict={i:i**2 for i in range(2,5)}
print(adict)
輸出{2:4,3:9,4:16,5:25}
查看元素
- 使用 $$dict[key]$$ dict為字典名稱,key為鍵 key不存在時報錯KeyValue
- $dict.get(key[,value])$ dict為字典名稱,key為鍵,value為可選參數,初始值 當key不存在時返回設定的value,未設定value返回None ==如果鍵不存在於字典中,將會添加鍵並將value設為預設值。==
新增元素
$$dict[key]=value$$key為新增鍵,value為對應值
修改元素
$$dict[key]=new\_value$$刪除元素
- $dict.pop(key)$ dict為字典名稱,key為鍵,字串需帶引號
- del函數 $$del\ dict[key]$$ dict為字典名稱
其他重要方法
判斷key是否存在
- $in,not in$
- $dict.has\_key()$函數 存在返回True,否則返回False ==僅在python2 中可使用,python3刪除==
設置key預設值
- 先判斷key是否在dict中,若不在則賦值
profile = {"name": "王炳明", "age": 27, "公众号": "Python编程时光"}
if "gender" not in profile:
profile["gender"] = "male"
- $setdefault()$方法 $$dict.setdefault(key,default=None)$$ default為key不存在時設置的值,預設為None
set
定義
集合(set),同數學集合,一個無序的不重複元素序列。 ==question==:既然無序,那麼print set時元素是按照什麼順序,儲存時是什麼順序?
創建集合
- 使用花括號創建,$\{\}$內可以有重複元素,但最後set會去重
- 使用set()方法創建。
aset={1314,'520'}
print(aset)
輸出:
{1314,'520'}
bset=set()#創建空集合aset
print(bset)
輸出:
set()
cset=set(['I','love','ishimiya'])
print(cset)
輸出:
{'I','love','ishimiya'}
增加元素
$.add()$函數
$$set.add(elem)$$==問題==:如果elem為原set已有元素會發生什麼? 注意:當添加的元素與set集合中的元素出現重複的時候,不會有任何效果,但是並不報錯。
添加的元素必須是不可變類型的,若添加可變類型的元素則會報錯。
$.update()$函數
$$set.update(ElemType)$$ElemType必須為一個序列(string,list,tuple,dict,set等)
aset={'朱冰倩'}
aset.add('suki')
aset.update({'for'})
'''接集合{'for'}'''
aset.update([10000])
'''接列表[10000]'''
aset.update(('years',))
'''接元組,僅有一個元素時帶上逗號'''
aset.update({'name':'guzheng','age':19})
'''接字典,僅將key加入set'''
print(aset)
輸出:
{'朱冰倩','suki','for',10000,'years','name','age'}
刪除元素
- $.remove()$
aset={'朱冰倩','suki','for',10000,'years','name','age'}
aset.remove('name')
aset.remove('愛')
'''當remove不存在元素時報錯'''
KeyError: '愛'
- $.discard()$ 存在元素則移除,不存在也不會報錯
aset={'朱冰倩','suki','for',10000,'years','age'}
aset.discard('age')
aset.discard('love')
- $.pop()$ 從集合中隨機刪除元素,不可傳入任何參數
aset={'朱冰倩','suki','for',10000,'love'}
aset.pop()
print(aset)
可能輸出:
{'朱冰倩','suki','for',10000}
- $.clear()$ 清空集合中元素 $$set.clear()$$
修改元素
因為 set 中的元素無序,所以集合沒有索引,無法修改元素,只能增加或刪除元素。
查看元素
同上,無索引無法查看元素。 查看元素數量
$$len(set)$$返回集合中元素個數
集合運算
合集
使用$union$函數將兩個集合合併並去重,返回合併後集合C
$$aset.union(bset)$$等價於
$$aset\ |\ bset$$差集
使用$difference$函數求差集:找出==存在於集合A==但是==不在集合B==中的元素並作為一個新集合C返回。
$$aset.difference(bset)$$等價於
$$aset\ -\ bset$$交集
- 使用$intersection$函數求交集:找出==同時存在於集合A和B==中的元素並返回集合C。 $$aset.intersection(bset)$$ 或 $$bset.intersection(aset)$$ 等價於 $$aset\ \&\ bset$$ $$bset\ \&\ aset$$
- 使用$intersection\_update$函數求交集:找出交集並賦給aset,不會返回交集。 $$aset.intersection\_update()$$
- 使用$\&$,返回交集不改變aset、bset $$aset\ \&\ bset$$
不重合集
- $symmetric\_difference$函數,返回不重合集 $$aset.symmetric\_difference(bset)$$
- 使用$symmetric\_difference\_update$函數,將不重合集返回aset $$aset.symmetric\_difference\_update(bset)$$
其他
- 判斷set是否含有某元素,用in $$print(elem\ in\ aset)$$
- 判斷兩set是否有相同元素 $$aset.isdisjoint(bset)$$ 如果有相同元素則返回False
- 判斷bset是否為aset子集 $$bset.issubset(aset)$$ 若bset為aset子集則返回True
迭代器
可迭代物件
可以利用 for 迴圈的物件,都叫可迭代物件。
可迭代協議
- 第一種場景:如果一個物件內部實現了
__iter__()方法 ,並返回一個迭代器實例,那麼該物件就是可迭代物件。- 對於該場景,
isinstance(my_list,Iterable)返回True
- 對於該場景,
- 第二種場景:假設一個物件沒有實現
__iter__(),Python 解釋器__getitem__()方法獲取元素,如果可行,那麼該物件也是一個可迭代物件。- 對於該類可迭代物件,
isinstance(my_list,Iterable)返回False
- 對於該類可迭代物件,
迭代器物件
當你對一個可迭代物件使用 iter 函數後,它會回傳一個迭代器物件,對於迭代器物件,我們可以使用 next 函數,去取得元素,每執行一次,取得一次,等到全部取得完畢,會拋出 StopIteration 提示無元素可取。
alist=['人','生','若','只','如','初','見']
gen=iter(alist)
for i in alist:
print(next(gen))
輸出:
人
生
若
只
如
初
見
for i in alist:
print(i)
輸出:
人
生
若
只
如
初
見
可迭代物件與迭代器物件
- 可迭代物件指整體,如一個list
- 迭代器物件是iter()函數返回的物件,可對該物件使用next()函數不斷獲取元素。
generator
生成器,是一個可以像迭代器那樣使用for迴圈來獲取元素的函數。
生成器創建
列表推導式
alist=[i for i in range(5)]
print(alist)
輸出:
[0,1,2,3,4]
'''
用[]創建列表對象
'''
alist=(i for i in range(5))
print(alist)
輸出:
0
'''
此時alist為生成器對象
'''
yield
yield與renturn的區別
- 當一個函數運行到 yield 後,函數的運行會暫停,並且會把 yield 後的值返回出去。
- 若 yield 沒有接任何值,則返回 None。
- yield 雖然返回了,但是函數並沒有結束。再次調用該函數賦值的標識符,函數繼續運行。
def generator():
top=5
i=0
while i<top:
print('當前值為:'+str(i))
i+=1
yield i
raise StopIteration
gen=generator()
for i in range(6):
print(next(gen))

何時一樽酒,重與細論文。