[toc]
說明: 等號(=)右邊有多個數值僅通過逗號分割,就會封裝到乙個元組,稱為封裝packing。
# 示例:
x = 1,
y = 1,2
print(type(x), x)
print(type(y), y)
# 輸出結果如下:
(1,)
(1, 2)
備註: 如果右邊只有乙個數值且沒有用逗號,其實是乙個整數型別,請留意。另外等號右邊一定先執行,再賦值給左邊。
說明: 等號(=)右邊容器型別的元素與左邊通過逗號分割的變數要一 一對應,稱為解構unpacking。
x,y = (1,2) # [1,2]
print(x)
print(y)
# 輸出結果如下:
12
備註:右邊的容器可以是元組、列表、字典、集合等,必須是可迭代物件。
錯誤示範:
x,y = (1,2,3)
print(x)
print(y)
# 輸出結果如下:
valueerror: too many values to unpack (expected 2)
說明:左、右兩邊個數一定要一致,不然會丟擲'valueerror'錯誤。
剩餘變數解構
說明:python3引入了剩餘變數解構(rest),'盡可能'收集剩下的資料組成乙個列表。
x, *rest = [1,2,3,4,5,6]
print(type(x), x)
print(type(rest), rest) # 剩餘沒有賦值的就是rest的了
# 輸出結果如下:
1[2, 3, 4, 5, 6]
*rest, y = [1,2,3,4,5,6]
print(type(rest), rest)
print(type(y), y)
# 輸出結果如下:
[1, 2, 3, 4, 5]
6
錯誤示例:
另外一種丟棄變數下劃線:'_'
說明: '_'是合法的識別符號,大多場景表示不關心該值。
x, *_, y = [1,2,3,4,5,6]
print(x)
print(_)
print(y)
# 輸出結果如下:
1[2, 3, 4, 5]
6
_, *rest, _ = [1,2,3,4,5,6]
print(_) # '_'是上一次輸出值
print(rest)
# 輸出結果如下:
6[2, 3, 4, 5]
說明:集合是'可變的、無序的、不重複'的元素集合。
成為集合元素是有條件的:'元素必須可hash、可迭代'
可雜湊物件如下(不可變):
可以通過內建hash函式判斷是否可hash:
s1 = [1,2,3]
print(hash(s1))
# 輸出結果如下:
typeerror: unhashable type: 'list' # 列表是不可hash的
說明:
s = {} # 注意這個是空字典,不是空集合
s1 = set() # 空集合
s2 = set([1,2,3]) # 注意列表裡面元素迭代出來的是整數,可hash
s3 = set("abcd")
print(s1)
print(s2)
print(s3)
# 輸出結果如下:
set()
錯誤示例:
s = set([[1]]) # 列表套列表,迭代出來是列表,不可hash
print(s)
# 輸出結果如下:
typeerror: unhashable type: 'list'
s1 = set([1,2,3])
s1.add(4)
print(s1)
# 輸出結果如下:
s1 = set([1,2,3])
s1.update((4,5,6),[7,8,9])
print(s1)
# 輸出結果如下:
說明:集合是個容器,是可以遍歷的,但是效率都是o(n)。
s1 =
for s in s1:
print(s)
# 輸出結果如下:12
3
說到這裡,你覺得集合set和列表list哪個遍歷效率更高呢?
答案是set,因為set的元素是hash值作為key(下面講的字典也是hash值),查詢時間複雜度為o(1),而list是線性資料結構,時間複雜度是o(n)。
大家可以按照如下進行驗證下,隨著資料規模越來越大,很明顯就可以看出哪個效率高。
說明:字典是由任意個item(元素)組成的集合,item是由key:value對組成的二元組。
# 空字典
d1 = {}
d2 = dict()
# 示例:
d3 = dict(a=1,b=2,c=3)
d4 = dict(d3)
d5 = dict([('a',1),('b',2),('c',3)]) # 元素必須是可迭代的
d6 =
# 輸出結果都是:
d =
print(d.pop('c',none))
print(d)
# 輸出結果如下:
3
2)d.popitem()
d =
print(d.popitem())
print(d)
# 輸出結果如下:
('c', 3)
3)d.clear()
d =
d.clear()
print(d)
正常訪問元素:
d =
print(d['a'])
print(d.get('b'))
# 輸出結果如下:
12
key不存在的處理方式:
d =
print(d.get('d',none)) # 如果key不存在,預設返回none
print(d.setdefault('d',100)) # 如果key不存在,則新增key:value對
print(d)
# 輸出結果如下:
none
100
語法
優點 示例需求:請從給定區間中提取能夠被2整除的元素。
大眾普遍的寫法:
list =
for i in range(10):
if i % 2 == 0:
print(list)
# 輸出結果如下:
[0, 2, 4, 6, 8]
再來感受一下簡單而優雅的寫法:
print([i for i in range(10) if i % 2 == 0])
# 輸出結果如下:
[0, 2, 4, 6, 8]
以上就是列表解析式,也叫列表推倒式。語法
特點:
看下生成器物件是長什麼樣的(不要認為是元組解析式,哈哈):
x = (i for i in range(10) if i % 2 == 0)
print(type(x))
print(x)
# 輸出結果如下:
# 生成器
at 0x000001a143acba98> # 生成器物件
那生成器物件是如何計算得到結果:
import time
x = (i for i in range(10) if i % 2 == 0)
for i in range(6): # 僅一次迴圈取值
time.sleep(0.5)
print(next(x))
time.sleep(1)
print(next(x)) # for迴圈已經計算完所有結果了,不能取值,故丟擲異常
# 輸出結果如下:02
468stopiteration # 已經超出可迭代範圍,丟擲異常
備註:生成器表示式只能迭代一次。
集合解析式和列表解析式語法類似,不做過多解析。
語法:
示例:
print()
# 輸出結果如下:
字典解析式和集合解析式語法類似,不做過多解析。
語法:
示例:
print()
# 輸出結果如下:
總體來說,解析式寫起來如果讓人簡單易懂、又高效,是非常推薦大家使用的。
但有的場景寫起來很複雜,那還是得用for...in迴圈拆分來寫。
字典和解析式
key value鍵值對的資料的集合 可變的 無序的key不重複d key 返回key對應的值value key不存在丟擲keyerror異常 get key default 返回key對應的值value key不存在返回預設值,如果沒有設定預設值就返回none setdefault key def...
Python基礎 迭代和解析
for迴圈可以迭代序列物件,從左到右遍歷序列物件的元素。這裡for迴圈屬於迭代工具,而序列屬於可迭代物件,兩者通過迭代協議聯絡。python提供了內建函式next,以迭代器做輸入,每次返回序列的下一元素,直到序列末尾,引發異常 i iter 1,2,3,4 next i 1 next i 2 nex...
雜湊表原理解析
雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構,它通過對映函式把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。關鍵碼值 key value 也可以當成是key的hash值,這個對映函式叫做雜湊函式。而存放記錄的陣列叫做雜湊表 根據上述...