Python基础知识(第四天)
47.字典_特點(diǎn)_4種創(chuàng)建方式_普通_dict_zip_formkeys
字典
字典是“鍵值對(duì)”的無(wú)序可變序列,字典中的每個(gè)元素都是一個(gè)“鍵值對(duì)”,包含:“鍵對(duì)象”和“值對(duì)象”。可以通過(guò)“鍵對(duì)象”實(shí)現(xiàn)快速獲取、刪除、更新對(duì)應(yīng)的“值對(duì)象”。列表中我們通過(guò)“下標(biāo)數(shù)字”找到對(duì)應(yīng)的對(duì)象。字典中通過(guò)“鍵對(duì)象”找到對(duì)應(yīng)的“值對(duì)象”。
“鍵”是任意的不可變數(shù)據(jù),比如:整數(shù)、浮點(diǎn)數(shù)、字符串、元組。但是:列表、 ???字典、集合這些可變對(duì)象,不能作為“鍵”。并且“鍵”不可重復(fù)。“值”可以是任意的數(shù)據(jù),并且可重復(fù)。
一個(gè)典型的字典的定義方式:a = {'name':'gaoqi','age':18,'job':'programmer'}
字典的創(chuàng)建
1、我們可以通過(guò){}、dict()來(lái)創(chuàng)建字典對(duì)象。
>>> a = {'name':'gaoqi','age':18,'job':'programmer'}
>>> b = dict(name='gaoqi',age=18,job='programmer')
>>> a = dict([("name","gaoqi"),("age",18)])
>>> c?= {} #空的字典對(duì)象
>>> d?= dict() #空的字典對(duì)象
2、通過(guò) zip()創(chuàng)建字典對(duì)象
>>> k = ['name','age','job']
>>> v = ['gaoqi',18,'techer']
>>> d = dict(zip(k,v))
>>> d
{'name': 'gaoqi', 'age': 18, 'job': 'techer'}
3、通過(guò) fromkeys?創(chuàng)建值為空的字典
>>> a = dict.fromkeys(['name','age','job'])
>>> a
{'name': None, 'age': None, 'job': None}
48.字典_元素的訪問(wèn)_鍵的訪問(wèn)_值的訪問(wèn)_鍵值對(duì)的訪問(wèn)
字典元素的訪問(wèn)
1、通過(guò) [鍵] 獲得“值”。若鍵不存在,則拋出異常。? ? ? ? ? a['name']
2、通過(guò)get()方法獲得“值”。推薦使用。優(yōu)點(diǎn)是:指定鍵不存在,返回 None;也可以設(shè)定指定鍵不存在時(shí)默認(rèn)返回的對(duì)象。推薦使用 get()獲取“值對(duì)象”。? ? ? ? ? ?a.get('name')
3、列出所有的鍵值對(duì)
>>> a.items()
dict_items([('name', 'gaoqi'), ('age', 18), ('job', 'programmer')])
4、列出所有的鍵,列出所有的值? ? ? ? ? ? ?>>> a.keys()? ? ? ??>>> a.values()
5、len() 鍵值對(duì)的個(gè)數(shù)
6、檢測(cè)一個(gè)“鍵”是否。字典中? ? ? ? ? ?>>> "name" in a
49.字典_元素的添加_修改_刪除
字典元素添加、修改、刪除
1、給字典新增“鍵值對(duì)”。如果“鍵”已經(jīng)存在,則覆蓋舊的鍵值對(duì);如果“鍵”不存在,則新增“鍵值對(duì)”。? ? ? ? ? ? ? ? ?
a['address']='西三旗1號(hào)院'
2、使用update()將新字典中所有鍵值對(duì)全部添加到舊字典對(duì)象上。如果 key?有重復(fù),則直接覆蓋。? ? ? ? ? ?
a.update(b)
3、字典中元素的刪除,可以使用 del()方法;或者 clear()刪除所有鍵值對(duì);pop()刪除指定鍵值對(duì),并返回對(duì)應(yīng)的“值對(duì)象”? ? ? ? ? ? ?
del(a['name'])? ? ? ? a.clear()? ? ??b = a.pop('age')
4、popitem() :隨機(jī)刪除和返回該鍵值對(duì)。字典是“無(wú)序可變序列”,因此沒(méi)有第一個(gè)元素、最后一個(gè)元素的概念;popitem?彈出隨機(jī)的項(xiàng),因?yàn)樽值洳](méi)有"最后的元素"或者其他有關(guān)順序的概念。若想一個(gè)接一個(gè)地移除并處理項(xiàng),這個(gè)方法就非常有效(因?yàn)椴挥檬紫全@取鍵的列表)。
a.popitem()
50.字典_序列解包用于列表元組字典
序列解包
?序列解包可以用于元組、列表、字典。序列解包可以讓我們方便的對(duì)多個(gè)變量賦值。
>>> x,y,z=(20,30,10)
>>> x
20
>>> [a,b,c]=[10,20,30]
>>> a
10
序列解包用于字典時(shí),默認(rèn)是對(duì)“鍵”進(jìn)行操作; 如果需要對(duì)鍵值對(duì)操作,則需要使用items();如果需要對(duì)“值”進(jìn)行操作,則需要使用 values();
>>> s = {'name':'gaoqi','age':18,'job':'teacher'}
>>> name,age,job=s #默認(rèn)對(duì)鍵進(jìn)行操作
>>> name,age,job=s.items() #對(duì)鍵值對(duì)進(jìn)行操作
>>> name,age,job=s.values() #對(duì)值進(jìn)行操作
51.字典_復(fù)雜表格數(shù)據(jù)存儲(chǔ)_列表和字典綜合嵌套
52.字典_核心底層原理_內(nèi)存分析_存儲(chǔ)鍵值對(duì)過(guò)程
字典核心底層原理(重要)
字典對(duì)象的核心是散列表。散列表是一個(gè)稀疏數(shù)組(總是有空白元素的數(shù)組),數(shù)組的 ???每個(gè)單元叫做 bucket。每個(gè) bucket?有兩部分:一個(gè)是鍵對(duì)象的引用,一個(gè)是值對(duì)象的引用。
由于,所有 bucket 結(jié)構(gòu)和大小一致,我們可以通過(guò)偏移量來(lái)讀取指定 bucket。
將一個(gè)鍵值對(duì)放進(jìn)字典的底層過(guò)程
假設(shè)字典 a 對(duì)象創(chuàng)建完后,數(shù)組長(zhǎng)度為 8:
我們要把”name”=”gaoqi”這個(gè)鍵值對(duì)放到字典對(duì)象 a 中,首先第一步需要計(jì)算鍵”name”的散列值。Python 中可以通過(guò) hash()來(lái)計(jì)算。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? >>> bin(hash("name"))
'-0b1010111101001110110101100100101'
由于數(shù)組長(zhǎng)度為 8,我們可以拿計(jì)算出的散列值的最右邊 3?位數(shù)字作為偏移量,即“101”,十進(jìn)制是數(shù)字 5。我們查看偏移量 5,對(duì)應(yīng)的 bucket?是否為空。如果為空,則將鍵值對(duì)放進(jìn)去。如果不為空,則依次取右邊 3?位作為偏移量,即“100”,十進(jìn)制是數(shù)字4。再查看偏移量為 4 的 bucket 是否為空。直到找到為空的 bucket 將鍵值對(duì)放進(jìn)去。
python 會(huì)根據(jù)散列表的擁擠程度擴(kuò)容。“擴(kuò)容”指的是:創(chuàng)造更大的數(shù)組,將原有內(nèi)容拷貝到新數(shù)組中。接近 2/3 時(shí),數(shù)組就會(huì)擴(kuò)容。
53.字典_核心底層原理_內(nèi)存分析_查找值對(duì)象過(guò)程
根據(jù)鍵查找“鍵值對(duì)”的底層過(guò)程
當(dāng)我們調(diào)用 a.get(“name”),就是根據(jù)鍵“name”查找到“鍵值對(duì)”,從而找到值對(duì)象“gaoqi”。
第一步,我們?nèi)匀灰?jì)算“name”對(duì)象的散列值
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? >>> bin(hash("name"))
'-0b1010111101001110110101100100101'
和存儲(chǔ)的底層流程算法一致,也是依次取散列值的不同位置的數(shù)字。 假設(shè)數(shù)組長(zhǎng)度為8,我們可以拿計(jì)算出的散列值的最右邊 3 位數(shù)字作為偏移量,即“101”,十進(jìn)制是數(shù)字5。我們查看偏移量 5,對(duì)應(yīng)的 bucket?是否為空。如果為空,則返回 None。如果不為空, 則將這個(gè) bucket?的鍵對(duì)象計(jì)算對(duì)應(yīng)散列值,和我們的散列值進(jìn)行比較,如果相等。則將對(duì)應(yīng)“值對(duì)象”返回。如果不相等,則再依次取其他幾位數(shù)字,重新計(jì)算偏移量。依次取完后,仍然沒(méi)有找到。則返回 None。
用法總結(jié):
1.鍵必須可散列
(1)數(shù)字、字符串、元組,都是可散列的
(2)自定義對(duì)象需要支持下面三點(diǎn):
支持 hash()函數(shù)
支持通過(guò)?eq?()方法檢測(cè)相等性。
若 a==b 為真,則 hash(a)==hash(b)也為真。
2.字典在內(nèi)存中開(kāi)銷巨大,典型的空間換時(shí)間。
3.鍵查詢速度很快
4.往字典里面添加新建可能導(dǎo)致擴(kuò)容,導(dǎo)致散列表中鍵的次序變化。因此,不要在遍歷字典的同時(shí)進(jìn)行字典的修改。
54.集合_特點(diǎn)_創(chuàng)建和刪除_交集并集差集運(yùn)算
集合
是無(wú)序可變,元素不能重復(fù)。實(shí)際上,集合底層是字典實(shí)現(xiàn),集合的所有元素都是字典中的“鍵對(duì)象”,因此是不能重復(fù)的且唯一的。
集合創(chuàng)建和刪除
1.使用{}創(chuàng)建集合對(duì)象,并使用 add()方法添加元素? ? ? ? ? >>> a.add(9)
2.使用set(),將列表、元組等可迭代對(duì)象轉(zhuǎn)成集合。如果原來(lái)數(shù)據(jù)存在重復(fù)數(shù)據(jù),則只保留一個(gè)。3.remove()刪除指定元素;clear()清空整個(gè)集合? ? ? ? ? ?>>> a.remove(9)? ??>>> a.clear()
集合相關(guān)操作
>>> a|b #并集? ? ? ? ? ? >>> a&b #交集? ? ? ? ? ? >>> a-b #差集
>>> a.union(b) #并集? ? ? ? ? ? >>> a.intersection(b) #交集? ? ? ? ? ?>>> a.difference(b) #差集
55.Pycharm開(kāi)發(fā)環(huán)境的下載安裝配置_項(xiàng)目管理
控制語(yǔ)句
我們?cè)谇懊鎸W(xué)習(xí)的過(guò)程中,都是很短的示例代碼,沒(méi)有進(jìn)行復(fù)雜的操作。現(xiàn)在,我們將開(kāi)始學(xué)習(xí)流程控制語(yǔ)句。
前面學(xué)習(xí)的變量、數(shù)據(jù)類型(整數(shù)、浮點(diǎn)數(shù)、布爾)、序列(字符串、列表、元組、字 ???典、集合),可以看做是數(shù)據(jù)的組織方式。數(shù)據(jù)可以看做是“磚塊”!
流程控制語(yǔ)句是代碼的組織方式,可以看做是“混凝土”。
一個(gè)完整的程序,離不開(kāi)“磚塊”,也離不開(kāi)“混凝土”。他們的組合,才能讓我們建立從小到“一個(gè)方法”,大到“操作系統(tǒng)”,這樣各種各樣的“軟件”。
56.單分支選擇結(jié)構(gòu)_條件表達(dá)式詳解
選擇結(jié)構(gòu)
選擇結(jié)構(gòu)通過(guò)判斷條件是否成立,來(lái)決定執(zhí)行哪個(gè)分支。選擇結(jié)構(gòu)有多種形式,分為:單分 ???支、雙分支、多分支。流程圖如下:
單分支結(jié)構(gòu)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 雙分支結(jié)構(gòu)
多分支結(jié)構(gòu)?
單分支選擇結(jié)構(gòu)?
if 語(yǔ)句單分支結(jié)構(gòu)的語(yǔ)法形式如下:
if 條件表達(dá)式:
? ? ? ? 語(yǔ)句/語(yǔ)句塊
其中:條件表達(dá)式:可以是邏輯表達(dá)式、關(guān)系表達(dá)式、算術(shù)表達(dá)式等等。語(yǔ)句/語(yǔ)句塊:可以是一條語(yǔ)句,也可以是多條語(yǔ)句。多條語(yǔ)句,縮進(jìn)必須對(duì)齊一致。
條件表達(dá)式詳解
在選擇和循環(huán)結(jié)構(gòu)中,條件表達(dá)式的值為 False 的情況如下:False、0、0.0、空值 None、空序列對(duì)象(空列表、空元祖、空集合、空字典、空字符串)、空 range 對(duì)象、空迭代對(duì)象。其他情況,均為True。這么看來(lái),Python 所有的合法表達(dá)式都可以看做條件表達(dá)式,甚至包括函數(shù)調(diào)用的表達(dá)式。字符串False是True
條件表達(dá)式中,不能有賦值操作符“=”
57.雙分支選擇結(jié)構(gòu)_三元運(yùn)算符的使用詳解
雙分支選擇結(jié)構(gòu)
if 條件表達(dá)式?:語(yǔ)句 1/語(yǔ)句塊 1 else:? ?語(yǔ)句 2/語(yǔ)句塊 2三元條件運(yùn)算符
Python?提供了三元運(yùn)算符,用來(lái)在某些簡(jiǎn)單雙分支賦值情況。三元條件運(yùn)算符語(yǔ)法格式如下:
條件為真時(shí)的值 if (條件表達(dá)式) else 條件為假時(shí)的值
num = input("請(qǐng)輸入一個(gè)數(shù)字") print( num if int(num)<10 else "數(shù)字太大")58.多分支選擇結(jié)構(gòu)
多分支選擇結(jié)構(gòu)
多分支結(jié)構(gòu),幾個(gè)分支之間是有邏輯關(guān)系的,不能隨意顛倒順序。
score = int(input("請(qǐng)輸入分?jǐn)?shù)")) grade = '' if score<60:grade = "不及格" elif score<80:grade = "及格" elif score<90:grade = "良好" elif score<=100:grade = "優(yōu)秀"print("分?jǐn)?shù)是{0},等級(jí)是{1}".format(score,grade))59.選擇結(jié)構(gòu)的嵌套
選擇結(jié)構(gòu)可以嵌套,使用時(shí)一定要注意控制好不同級(jí)別代碼塊的縮進(jìn)量,因?yàn)榭s進(jìn)量決定了代碼的從屬關(guān)系。語(yǔ)法格式如下:
score = int(input("請(qǐng)輸入一個(gè)在 0-100 之間的數(shù)字:")) grade = "" if score>100 or score<0:score = int(input("輸入錯(cuò)誤!請(qǐng)重新輸入一個(gè)在 0-100 之間的數(shù)字:")) else:if score>=90:grade = "A"elif score>=80:grade = 'B'elif score>=70:grade = 'C'elif score>=60:grade = 'D'else:grade = 'E'print("分?jǐn)?shù)為{0},等級(jí)為{1}".format(score,grade)) score = int(input("請(qǐng)輸入一個(gè)在 0-100 之間的數(shù)字:")) degree = "ABCDE" num = 0 if score>100 or score<0:score = int(input("輸入錯(cuò)誤!請(qǐng)重新輸入一個(gè)在 0-100 之間的數(shù)字:")) else:num = score//10if num<6:num=5print("分?jǐn)?shù)是{0},等級(jí)是{1}".format(score,degree[9-num]))60.while循環(huán)結(jié)構(gòu)_死循環(huán)處理
循環(huán)結(jié)構(gòu)
循環(huán)結(jié)構(gòu)用來(lái)重復(fù)執(zhí)行一條或多條語(yǔ)句。表達(dá)這樣的邏輯:如果符合條件,則反復(fù)執(zhí)行循環(huán)體里的語(yǔ)句。在每次執(zhí)行完后都會(huì)判斷一次條件是否為 True,如果為 True?則重復(fù)執(zhí)行循環(huán)體里的語(yǔ)句。圖示如下:
循環(huán)體里面的語(yǔ)句至少應(yīng)該包含改變條件表達(dá)式的語(yǔ)句,以使循環(huán)趨于結(jié)束;否則,就會(huì)變成一個(gè)死循環(huán)。
while 循環(huán)
while 循環(huán)的語(yǔ)法格式如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?while 條件表達(dá)式:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?循環(huán)體語(yǔ)句
我們通過(guò)一些簡(jiǎn)單的練習(xí),來(lái)慢慢熟悉 while 循環(huán)。
num = 0 while num<=10:print(num)num += 1 num=0 sum_all=0 while num<=100:sum_all=sum_all+numnum+=1 print("1-100所有數(shù)的累加和:",sum_all) 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Python基础知识(第四天)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python基础知识(第三天)
- 下一篇: Python基础知识(第五天)