1.id is詳解html
ID
在Python中,id是什麼?id是內存地址,好比你利用id()內置函數去查詢一個數據的內存地址: name = 'nba' print(id(name)) # 1585831283968
IS
is 又是什麼那? == 是什麼意思是那?
is(身份運算)指的兩邊的內存地址是否相等,也就是是不是同一個地址 ==指的兩邊的數值是否相等python
因此:若是內存地址相等,那數值必定相等,若是數值相等,內存地址不必定相等c#
2.代碼塊緩存
在python中一切都是對象 Python的程序是由代碼塊構形成的。塊是python程序的一個文本,他是一個能執行的一個單元
python中的代碼塊:一個函數,一個模塊,一個類,一個文件都是代碼塊,而在交互式方式輸入的每條語句都是一個代碼塊。
那代碼塊和小數據池有什麼關係那?
代碼塊的緩存機制:
在python執行同一個代碼塊下的初始化對象命令時(能夠理解爲c#中的初始化字符串),會檢查該值是否存在(默認在一個字典那種去檢查),若是該變量和值存在默認要檢查的字典中,就從新使用該值
若是不存在,就在字典中建立該變量與值相對的映射,存入到字典當中,方便之後繼續調用。
因此同一個代碼塊中i1=1000,i2=1000,指向的時同一個1000,即:要使用同一代碼塊的緩存機制,因此i1和i2指向的內存地址相同,數值也相同
代碼塊緩存機機制的適用範圍:
int(float):任何數字在同一代碼塊都複用
bool:True和False在內存中都以1或0表示,複用
str:幾乎全部的字符串都符合
1.非乘法獲得的字符都知足代碼塊的緩存機制
2.乘法獲得的爲兩種:
1.乘數爲1的任何字符串都知足代碼塊的緩存機制
2.乘數>=2時:僅含大小寫字母,數字,下劃線,總長度<=20,知足代碼塊的緩存機制
trple():空元組
None:
代碼塊緩存機制的優勢:
1.節省內存空間
2.提高python性能
============================================================================================================================
小數據池
也稱做小整數緩存機制,或稱爲駐留機制等等
小數據池是針對不一樣代碼塊之間的緩存機制
小數據池緩存機制:
小數據池緩存機制使用的不一樣的代碼塊中,在內存中開闢兩個內存地址:
一個空間:-5-256
一個空間:必定規則的字符串(相乘不超過20,且乘數的是1)
小數據池適用範圍
int(整數):python自動將-5-256之間的整數進行緩存(放在一個池中,多是字典,或其餘容器),當你把整數賦值給變量時,並不會直接建立對象,而是在內存中使用已經建立好的緩存對象
bool:就是True,False,不管你建立多少個變量指向True,False,那麼他在內存中只存在一個1或0
str:
1.字符串的長度爲0或者1,默認都採用了駐留機制(小數據池)
2.字符串的長度>1,且只含有大小寫字母,數字,下劃線時,纔會默認駐留
3,用乘法獲得的字符串,分兩種狀況。
1.乘數爲1時,僅含大小寫字母,數字,下劃線,默認駐留,含其餘字符,長度<=1,默認駐留,含其餘字符,長度>1,默認駐留。
2.乘數>=2時,僅含大小寫字母,數字,下劃線,總長度<=20,默認駐留。
小數據池的優勢:
1.節省內存空間
2.提高python性能
重點:
若是在同一代碼塊下,則採用同一代碼塊下的換緩存機制。 若是是不一樣代碼塊,則採用小數據池的駐留機制。
驗證1:
驗證2:app
3.基礎數據類型之間的轉換函數
1.int bool str三者之間能夠進行轉換
2.bool能夠與全部的數據類型進行轉換,全部爲空的數據類型轉換成bool都是false
3.字符串<--->列表
str--->list li=str.spilt()
list--->str str='.'.join(list) #其中list裏面的元素必須都是字符串類型
4.字符串<--->元組
str--->tuple tu =str1.partition('b') #b是字符串中一個字符
tuple--->str str='.'.join(tu)
5.列表<-->元組
list<--->tuple
tuple(list)或者list(tuple)
6.字典<--->列表
dict--->list list(dict) #列表中的元素是字典裏面的鍵值
other:
1.若是元組中只有單個元素,並期沒有','逗號的時候,那麼打印出來的類型爲元素自己
tu = (123)
print(tu,type(tu))
2.字典的formkeys()方法:用於建立一個新字典,以序列 seq 中元素作字典的鍵,value 爲字典全部鍵對應的初始值。 dict.formkeys(seq,[,value]),鍵值必須爲可迭代類型
坑: 若是你的值是一個可變的數據類型, 他在內存中是一個id相同的內存地址。
dic = dict.fromkeys('abcd',[])
dic['a'].append(666)
dic['b'].append(111)
dic['c'].append(222)
print(dic)
4.set集合操做性能
set:是字典的閹割版,沒有值的鍵
rar文件
set的做用:
1.列表去重
2.關係測試
set是無序列,可是在數字1-21之間的數字,在集合中從小到大的排序
5.拓展測試
拓展一spa
# 將此列表索引爲奇數位對應的元素所有刪除. l1 = [11, 22, 33, 44, 55]
#方法一:經過del函數的切片加步長的方式刪除
del li[1::2]
print(li)
#方法二:錯誤案例
for item in range(len(li)):
item % 2 ==1:
ll.pop(item)
print(li) ---> [11,33,44]
此方法從思路上來說是正確的,range(len(li))根據"顧頭不顧腚"原則能生成從0-5(0,1,2,3,4)五個元素,而後判斷爲奇數的,而後根據pop(索引)的方法來刪除奇數索引。
但其實裏面的一個坑在於:若是咱們從前向後刪除第一個爲奇數索引以後,這個索引就消失了了,還剩下0 2 3 4四個索引,可是根據列表的特性,中間不能出現斷裂的索引,也就是說,索引必須是連續的。
因此索引2 3 4 會向前補充,因此就會漏掉一部分索引,從而致使刪除的結果不對。
#正確的刪除方式:
1.在for循環裏面不要對列表的大小進行改變(刪除,增長元素等操做),可能會影響到後續最終結果
li1=[]
for item in range(len(li)):
if item % 2 ==0:
li1.append(li[item])
li=li1
print(li)
2.根據題意來講,從後向前刪除列表,不會產生以上問題
for item in range(len(li)-1,-1,-1):
if item % 2 ==1:
li.pop(item)
print(li)
拓展二code
#將字典中的key中含有k元素的全部鍵值對刪除. dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3', 'name': 'alex'}
#錯誤案例
for key in dic:
if 'k' in key:
dic.pop(key)
print(dic)
報錯信息: dictionary changed size during iteration
#正確案例
l1 = []
for key in dic:
if 'k' in key:
l1.append(key)
for key in l1:
dic.pop(key)
print(dic)
將符合條件的能夠添加到其餘對象那個之中,在進行修改
在for循環裏面不要對字典的大小進行改變(刪除,增長元素等操做),可能會影響到後續最終結果