程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【深度之眼五——(1)】Python:有益的探索

編輯:Python

目錄

 一,數據類型的底層實現

 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簡單的裝飾器

 知識回顧


本章導讀

 一,數據類型的底層實現

 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 字典的底層實現

通過稀疏數組來實現值的存儲與訪問

字典的創造過程

·第一步:創建一個散列表(稀疏數組N>>n)

 

 第一步:通過hash()計算鍵的散列值

 

 

鍵值對的訪問過程

 

         

 

 1.3字符串

數組

 1.4是否可變

不可變類型:數字,字符串,元組        

生命周期中保持不變

換句話說,改變了就不是自己了

不可變對象+=操作 實際創建了一個新的對象

 

 元組不是總是不可變的

元組有可變元素時可變3

 可變類型:列表,字典,集合

 

 

 1.5 列表操作的小例子

【例1】 刪除列表裡的元素

 

 

出現這個原因說因為使用remove函數的時候,會刪除第一個出現的d,比如第一次使用的時候,出現了d,刪除第一個d,在第二次for循環時候,會訪問第二個地址元素,但因為第一個d被刪除了,所以實際訪問的是第三個d,以此類推

 

 【例2】多維列表的創建

 二,更加簡潔的語法

2.1解析語法

 

 2.1.1 基本結構

 

 

 

 

 

 

 2.1.2 其他解析語法的例子

 

 

 

 2.2 條件表達式

 

 三,三大神器

3.1  生成器

 

 3.1.1 生成器表達式

        ·海量數據,不需儲存

 

 3.1.2 生成器函數——yield

·生產斐波那契數列 :數列前兩個元素 之和   為後元素

 

 

 

  3.2 迭代器

3.2.1 可迭代對象

可以直接用for循環的對象統稱可迭代對象

 

 

 

 

 

 

 

 

 

enumerate能講元素的位置信息和他本身進行組合,生成一個元組

 

 

 第二次在迭代就迭代不出來了

 

而且不可以被耗盡

 

3.3 裝飾器

3.3.1 目的

 

 

 3.3.2 函數對象

 

 3.3.3 高階函數

 

 3.3.4 嵌套函數

 

 3.3.5 閉包

 

 

 

會報錯

解決方法

 3.3.6簡單的裝飾器

 

語法糖

 

裝飾有參函數

有返回值函數

 

 帶參數的修飾器

 

 

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)

何時執行

        ·一裝飾就執行,不必等調用

回歸本源

        ·原函數屬性被覆蓋

 

        ·回來

通過這個可以使原函數的屬性給弄回來

 知識回顧

 

 

 

 


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved