目錄
一,數據類型的底層實現
1錯綜復雜的復制
1.1列表的底層實現
1.1.1新增元素
1.1.2修改元素
1.2.3對列表型元素進行操作
1.1.3對元組型元素進行操作
1.1.4對字典型元素進行操作
深拷貝
1.2 神秘的字典
1.2.1 快速的查找
1.2.2 字典的底層實現
1.3字符串
1.4是否可變
不可變類型:數字,字符串,元組
可變類型:列表,字典,集合
1.5 列表操作的小例子
二,更加簡潔的語法
2.1解析語法
2.1.1 基本結構
2.1.2 其他解析語法的例子
2.2 條件表達式
三,三大神器
3.1 生成器
3.1.1 生成器表達式
3.1.2 生成器函數——yield
3.2 迭代器
3.2.1 可迭代對象
3.3 裝飾器
3.3.1 目的
3.3.2 函數對象
3.3.3 高階函數
3.3.4 嵌套函數
3.3.5 閉包
3.3.6簡單的裝飾器
知識回顧
本章導讀
·淺拷貝
·對淺拷貝前後列表分別進行操作
和列表差不多
總結:像列表和字典,是可變的,地址可以不變,內容變化,而像元組那樣的不可變類型,內容變時,地址也發生了響應的變化
所以引入
通過稀疏數組來實現值的存儲與訪問
字典的創造過程
·第一步:創建一個散列表(稀疏數組N>>n)
第一步:通過hash()計算鍵的散列值
鍵值對的訪問過程
數組
生命周期中保持不變
換句話說,改變了就不是自己了
不可變對象+=操作 實際創建了一個新的對象
元組不是總是不可變的
元組有可變元素時可變3
【例1】 刪除列表裡的元素
出現這個原因說因為使用remove函數的時候,會刪除第一個出現的d,比如第一次使用的時候,出現了d,刪除第一個d,在第二次for循環時候,會訪問第二個地址元素,但因為第一個d被刪除了,所以實際訪問的是第三個d,以此類推
【例2】多維列表的創建
·海量數據,不需儲存
·生產斐波那契數列 :數列前兩個元素 之和 為後元素
可以直接用for循環的對象統稱可迭代對象
enumerate能講元素的位置信息和他本身進行組合,生成一個元組
第二次在迭代就迭代不出來了
而且不可以被耗盡
會報錯
解決方法
語法糖
裝飾有參函數
有返回值函數
帶參數的修飾器
def timer(method):
def outer(func):
def inner(*args,**kwargs):
print("inner")
if method == "origin":
print("origin")
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print("{}:{:.2f}s".format(func.__name__,(end-start)))
elif method == "double":
print("double")
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print("{}:{:.2f}s".format(func.__name__,2*(end-start)))
return res
return inner
return outer
@timer(method="origin") # 相當於timer =timer(method="origin")f1=timer(f1)
def f1(n):
print("f1 run")
time.sleep(n)
return "wake up"
@timer(method="double") # 相當於timer =timer(method="double")f2=timer(f2)
def f2(n):
print("f2 run")
time.sleep(n)
return " up"
f1(1)
f2(2)
何時執行
·一裝飾就執行,不必等調用
回歸本源
·原函數屬性被覆蓋
·回來
通過這個可以使原函數的屬性給弄回來