本文是Python通用編程系列教程熄云,已全部更新完成,實(shí)現(xiàn)的目標(biāo)是從零基礎(chǔ)開始到精通Python編程語言妙真。本教程不是對Python的內(nèi)容進(jìn)行泛泛而談缴允,而是精細(xì)化,深入化的講解珍德,共5個階段练般,25章內(nèi)容。所以锈候,需要有耐心的學(xué)習(xí)薄料,才能真正有所收獲。雖不涉及任何框架的使用泵琳,但是會對操作系統(tǒng)和網(wǎng)絡(luò)通信進(jìn)行全局的講解都办,甚至?xí)σ恍╅_源模塊和服務(wù)器進(jìn)行重寫。學(xué)完之后虑稼,你所收獲的不僅僅是精通一門Python編程語言琳钉,而且具備快速學(xué)習(xí)其他編程語言的能力,無障礙閱讀所有Python源碼的能力和對計算機(jī)與網(wǎng)絡(luò)的全面認(rèn)識蛛倦。對于零基礎(chǔ)的小白來說歌懒,是入門計算機(jī)領(lǐng)域并精通一門編程語言的絕佳教材。對于有一定Python基礎(chǔ)的童鞋溯壶,相信這套教程會讓你的水平更上一層樓及皂。
一 數(shù)字類型
1. 數(shù)字類型 int和float
在第一章用戶交互我們給大家介紹了一下基本的數(shù)據(jù)類型,這一章主要是介紹不同數(shù)據(jù)類型的使用方法和深入研究
數(shù)字類型即變量的值且改,如age=18验烧,18則是我們保存的數(shù)據(jù)。
變量的是用來反映/保持狀態(tài)以及狀態(tài)變化的又跛,毫無疑問針對不同的狀態(tài)就應(yīng)該用不同類型的數(shù)據(jù)去標(biāo)識
數(shù)字類型只能存一個值碍拆,是不可變類型(不可變類型可以哈希,后面章節(jié)會講解哈希)
#int整型
定義:age=10 # age=int(10)
用于標(biāo)識:年齡慨蓝,等級感混,身份證號,qq號礼烈,個數(shù)
#float浮點(diǎn)型
定義:salary=3.1 #salary=float(3.1)
用于標(biāo)識:工資弧满,身高,體重此熬,
2. int類型常用的方法
# 常用操作+內(nèi)置的方法
print(bin(3)) #十進(jìn)制轉(zhuǎn)成二進(jìn)制,0b11
print(oct(8)) #十進(jìn)制轉(zhuǎn)成八進(jìn)制,0o10
print(10) #10
print(hex(16)) #十進(jìn)制轉(zhuǎn)成十六進(jìn)制,0x10
在進(jìn)行用戶交互程序的時候我們常用 .isdigit()這個判斷用戶輸入是不是數(shù)字庭呜,來進(jìn)行下一步操作滑进,這樣就避免了程序出錯,但是需要注意的是用戶輸入的內(nèi)容默認(rèn)是字符串募谎,判斷一個字符串是否是數(shù)字扶关,我們使用這個方法。
age = input(your age>>:)
if age.isdigit():
age = int(age)
age +=1
print(age)
3. Python其他數(shù)字類型(了解)
#int(整型)
在32位機(jī)器上近哟,整數(shù)的位數(shù)為32位驮审,取值范圍為-2**31~2**31-1鲫寄,即-2147483648~2147483647
在64位系統(tǒng)上吉执,整數(shù)的位數(shù)為64位,取值范圍為-2**63~2**63-1地来,即-9223372036854775808~9223372036854775807
#long(長整型)
跟C語言不同戳玫,Python的長整數(shù)沒有指定位寬,即:Python沒有限制長整數(shù)數(shù)值的大小未斑,但實(shí)際上由于機(jī)器內(nèi)存有限咕宿,我們使用的長整數(shù)數(shù)值不可能無限大。
注意蜡秽,自從Python2.2起府阀,如果整數(shù)發(fā)生溢出,Python會自動將整數(shù)數(shù)據(jù)轉(zhuǎn)換為長整數(shù)芽突,所以如今在長整數(shù)數(shù)據(jù)后面不加字母L也不會導(dǎo)致嚴(yán)重后果了试浙。
注意:在Python3里不再有l(wèi)ong類型了,全都是int
>>> a= 2**64
>>> type(a) #type()是查看數(shù)據(jù)類型的方法
<type 'long'>
>>> b = 2**60
>>> type(b)
<type 'int'>
#complex復(fù)數(shù)型
>>> x=1-2j
>>> x.imag
-2.0
>>> x.real
1.0
二 字符串類型
1. 字符串類型介紹
在python中寞蚌,加了引號的字符就是字符串類型田巴,用于標(biāo)識:描述性的內(nèi)容,如姓名挟秤,性別壹哺,國籍,種族艘刚,定義形式:
name='Albert' # name=str('Albert')
字符串格式化:
name = input('請輸入名字>>:')
print('你好管宵,%s' % name)
2. 單引號,雙引號和三引號的區(qū)別
#那單引號攀甚、雙引號啄糙、多引號有什么區(qū)別呢? 讓我大聲告訴你云稚,單雙引號木有任何區(qū)別隧饼,只有下面這種情況 你需要考慮單雙的配合
msg = "My name is Albert , I'm 18 years old!"
#多引號什么作用呢?作用就是多行字符串必須用多引號
msg =
'''
今天我想寫首小詩静陈,
歌頌我的同桌燕雁,
你看他那烏黑的短發(fā)诞丽,
好像一只炸毛雞。
'''
print(msg)
# 三引號里面寫多行內(nèi)容
3. 字符串的拼接
#數(shù)字可以進(jìn)行加減乘除等運(yùn)算拐格,字符串呢僧免?讓我大聲告訴你,也能捏浊?what ?是的懂衩,但只能進(jìn)行"相加"和"相乘"運(yùn)算。
>>> name='albert'
>>> age='18'
>>> name+age #相加其實(shí)就是簡單拼接
'albert18'
>>> name*5
'albertalbertalbertalbertalbert'
#注意1:
字符串1+字符串3金踪,并不會在字符串1的基礎(chǔ)上加字符串2浊洞,而是申請一個全新的內(nèi)存空間存入字符串1和字符串3,相當(dāng)字符串1與字符串3的空間被復(fù)制了一次胡岔,
#注意2:只能字符串加字符串法希,不能字符串加其他類型
字符串拼接(只能在字符串之間進(jìn)行,且只能相加或相乘)
字符串類型只能存一個值靶瘸,是不可變類型蓖捶,可以哈希溶握。
4. 字符串類型常用的方法
(1) 按照索引取值
字符串是不可變類型,并不能改變字符串的值,取值時最多可以有三個參數(shù)溜徙,分別是起始位置琅关,結(jié)束為止和步長舅世,可以正向取值夸浅,反向取值(起始位置大于結(jié)束位置或者沒有起始位置與結(jié)束位置,步長為-1表示從最后一個開始辽话,步長為負(fù)數(shù))
hobbies = "music basketball"
print(hobbies[0])
print(hobbies[1])
print(hobbies[5])
print(hobbies[0:5])
print(hobbies[:5])
print(hobbies[0:5:2])
print(hobbies[0:5:-2])
print(hobbies[11:5:-2])
print(hobbies[-1])
print(hobbies[-2])
(2) 長度運(yùn)算
print(len('name'))
(3) 成員運(yùn)算
print('a' in 'Albert')
# False
print('a' in not 'Albert')
# True
(4) 移除空白
print(' name'.lstrip()) # 移除左邊空白
print('name '.rstrip()) # 移除右邊空白
print(' name '.strip()) # 移除兩邊空白
(5) 切分
print('n a me'.split(','))
print('n,a me'.split(','))
print('n,/a /me'.split('/',1)) # 數(shù)字表示切割次數(shù)肄鸽,默認(rèn)全部切割
print('n,a /me'.split('/'))
print('a|b|c'.rsplit('|',1)) # 從右邊開始切割
(6) 組合
print('a'.join('1234'))
print('a'.join('bcde'))
tag = ' '
print(tag.join(['I', 'say', 'hello', 'world'])) # 可迭代對象必須都是字符串
(7) 替換
print('abc name id'.replace('a', 'card'))
name = 'albert say :i have a dream,my name is albert'
# 注意此時name原來的值并沒有改變,而是產(chǎn)生了一個替換之后新的值
print(name.replace('albert', 'Albert', 1))
(8) 字符串其他操作
# find,rfind,index,rindex,count
name='albert say hello'
print(name.find('o',1,3)) # 顧頭不顧尾,找不到則返回-1不會報錯,找到了則顯示索引
# print(name.index('e',2,4)) # 同上,但是找不到會報錯
print(name.count('e',1,3)) # 顧頭不顧尾,如果不指定范圍則查找所有
# center,ljust,rjust,zfill
name='albert'
print(name.center(30,'-'))
print(name.ljust(30,'*'))
print(name.rjust(30,'*'))
print(name.zfill(50)) # 用0填充
# expandtabs
name='albert\thello'
print(name)
print(name.expandtabs(1))
# captalize,swapcase,title
print(name.capitalize()) # 首字母大寫
print(name.swapcase()) # 大小寫翻轉(zhuǎn)
msg='albert say hi'
print(msg.title()) # 每個單詞的首字母大寫
# is數(shù)字系列
# 在python3中
num1=b'4' # bytes
num2=u'4' # unicode,python3中無需加u就是unicode
num3='四' # 中文數(shù)字
num4='Ⅳ' #羅馬數(shù)字
# isdigit:bytes,unicode
print(num1.isdigit()) # True
print(num2.isdigit()) # True
print(num3.isdigit()) # False
print(num4.isdigit()) # False
# isdecimal:uncicode
# bytes類型無isdecimal方法
print(num2.isdecimal()) # True
print(num3.isdecimal()) # False
print(num4.isdecimal()) # False
# isnumberic:unicode,中文數(shù)字,羅馬數(shù)字
# bytes類型無isnumberic方法
print(num2.isnumeric()) # True
print(num3.isnumeric()) # True
print(num4.isnumeric()) # True
# 三者不能判斷浮點(diǎn)數(shù)
num5='4.3'
print(num5.isdigit())
print(num5.isdecimal())
print(num5.isnumeric())
'''
總結(jié):
最常用的是isdigit,可以判斷bytes和unicode類型,這也是最常見的數(shù)字應(yīng)用場景
如果要判斷中文數(shù)字或羅馬數(shù)字,則需要用到isnumeric
'''
# is其他
print('===>')
name='alb123ert'
print(name.isalnum()) # 字符串由字母或數(shù)字組成
print(name.isalpha()) # 字符串只由字母組成
print(name.isidentifier())
print(name.islower())
print(name.isupper())
print(name.isspace())
print(name.istitle())
三 列表
1. 列表類型基本介紹
在[]內(nèi)用逗號分隔油啤,可以存放n個任意類型的值典徘,用于標(biāo)識:存儲多個值的情況,比如一個人有多個愛好益咬,定義格式示例:
students=['albert','james','kd',]
# 或者students=list(['albert','james','kd',])
列表可以存儲多個值逮诲,是有序的,是可變類型幽告,不可以哈希梅鹦。
2. 列表類型常用的方法
(1) 添加元素
append方法 在列表最后追加元素
l1 = ['a', 'b', 'c', 'd', ]
l1.append('e')
print(l1)
print(l1.append('e'))
# 在隊(duì)尾追加,沒有返回值
# ['a', 'b', 'c', 'd', 'e']
# None
insert方法 在列表中插入元素
l1 = ['a', 'b', 'c', 'd', ]
l1.insert(3,'x') # 3 指定插入索引3這個位置冗锁,就是“d”齐唆,這個位置,把‘d’ 頂?shù)搅撕竺?print(l1)
# insert可以指定插入的位置
# ['a', 'b', 'c', 'x', 'd']
extend方法 在列表中同時插入多個元素冻河,extend方法使用以及與append方法的區(qū)別
append是整體添加
l1 = [1, 2, 3, 4, 5, ]
l1.append([6, 7, 8, 9, ])
# l1.append(*[6, 7, 8, 9, ]) # 會報錯
print(l1)
l1.extend([6, 7, 8, 9])
print(l1)
只能接收一個參數(shù)箍邮,如果出現(xiàn)打散的情況茉帅,還是會被識別成多個參數(shù),因?yàn)槌绦驁?zhí)行執(zhí)行是從左到右锭弊,從上倒下執(zhí)行的堪澎,當(dāng)出現(xiàn)時這個列表已經(jīng)被打散了,因而味滞,會被程序識別成被傳入了多個參數(shù)樱蛤。
extend是逐個添加
l1 = [1, 2, 3, 4, 5, ]
l1.extend([6, 7, 8, 9])
print(l1)
l1.extend('abc')
print(l1)
l1.extend('a') # 也是可迭代對象
print(l1)
# l1.extend(1) # 報錯,不可迭代
print(l1)
extend在執(zhí)行添加的時候剑鞍,被傳入的參數(shù)必須是可迭代對象昨凡,這樣通過迭代就解決了同時傳入多個參數(shù)的問題,如果你還不知道可迭代對象攒暇,放心土匀,你很快就會知道的子房。<br />
(2) 刪除元素
pop刪除形用,有返回值,默認(rèn)刪除列表中最后一個证杭,指定刪除索引值
l1 = [1, 2, 3, 4, 5, 6, ]
print(l1.pop()) # 這個是有返回值的田度,因?yàn)檫@是一個可迭代類型和我們前面的extend一類
print(l1)
print(l1.pop(2)) # 2指定是列表中的索引值
print(l1)
remove 刪除 沒有返回值,沒有默認(rèn)值解愤,指定被刪除的元素
l1 = [1, 2, 3, 4, 5, 6, ]
print(l1.remove(2)) # 注意這個2 是真的2镇饺,不是索引值
# print(l1.remove()) # 報錯
print(l1)
clear 刪除 保留列表名稱,清空里面的值
l1 = ['a', 'b', 'c', 'd', 'e', 'b', 'c']
l1.clear()
print(l1)
del 刪除 通用刪除 但是一般不用
l1 = [1, 2, 3, 4, 5, 6, ]
del l1[2] # 按索引
print(l1)
l1 = [1, 2, 3, 4, 5, 6, ]
del l1 # 在內(nèi)存中刪除l1 相當(dāng)于沒有定義l1
# print(l1) # 報錯
(3) 更改元素
注意與insert插入的不同送讲,都是以原來的為位置為參照奸笤,insert是擠開,本質(zhì)是添加哼鬓,而這里是替換
l1 = [1, 2, 3, ]
l1[2] = 4
print(l1)
(4) 查找元素
按照索引或者指定列表中的元素查找
l1 = ['a', 'b', 'c', 'd', 'e', 'b', 'c']
print(l1.index('a'))
print(l1.index('b',1,4)) # 兩個數(shù)字分別對應(yīng)起始位置和結(jié)束位置
print(l1[0:5]) # 按照索引取值和字符串的用法相同
print(l1[:5])
print(l1[0:5:2])
print(l1[:-1])
print(l1[:-2])
print(l1[5:1:-2])
把列表分段查找
l1 = ['a', 'b', 'c', 'd', 'e', 'b', 'c']
a = int(len(l1)/2)
print(l1[:a]) # 從中間位置開始监右,列出前面所有的元素
print(l1[a:]) # 從中間位置開始,列出后面所有的元素
使用enumerate對列表枚舉
l1 = ['a', 'b', 'c', 'd', 'e']
for i, x in enumerate(l1, 100): # 100指定枚舉開始的數(shù)字
print(i, x)
(5) 統(tǒng)計長度
print(len([1,2,3,4,]))
(6) 統(tǒng)計元素個數(shù)
print(['a','b'].count('a'))
(7) 排序
reverse 反序排序
l1 = ['a', 1, 'b', 'c', 'd', 'e', 'b', 'c']
l1.reverse()
print(l1)
sort 按照ascii碼來進(jìn)行排序
l1 = ['a', '1', 'b', 'c', 'd', 'e', 'b', 'A', 'Z', 'c']
l1.sort()
print(l1)
l1.sort(reverse=True)
print(l1)
(7) 復(fù)制列表
l1 = ['a', '1', 'b', 'c', 'd', 'e', 'b', 'A', 'Z', 'c']
print(l1.copy())
(8) Python中的賦值父虑,淺拷貝與深拷貝區(qū)別
賦值
對于復(fù)制的操作,最簡單的就是賦值,指的是新建一個對象的引用,新建目標(biāo)對象與原來的目標(biāo)對象指向同一個內(nèi)存地址,因而,始終保持一致。
list1 = [1, 2, 3, 4, 5, [6, 7, 8, ]]
list2 = list1
list1.append(9)
print(list1)
print(list2)
list1[5][0] = 10
print(list1)
print(list2)
list1[5] = 10
print(list1)
print(list2)
淺拷貝
淺拷貝顧名思義就是拷貝的比較淺昨忆,我們可以把賦值認(rèn)為是新建了一個對象的引用,把原來被對象內(nèi)存空間的數(shù)據(jù)指向新的變量独旷,這時同一塊內(nèi)存空間指向兩個變量。淺拷貝與賦值不同嵌洼,既然是拷貝案疲,那么就是要開辟一塊新的內(nèi)存空間,復(fù)制的是原來被拷貝對象內(nèi)多個元素對象的引用麻养,有幾個元素對象就賦值幾個元素對象的引用褐啡。因此,被淺拷貝對象內(nèi)的元素改變鳖昌,會引起淺拷貝對象內(nèi)元素的改變备畦;被拷貝對象添加元素低飒,拷貝對象不再添加元素(因?yàn)闆]有一個新的引用);被拷貝對象刪除元素懂盐,拷貝對象也刪除元素(元素都已經(jīng)刪了褥赊,雖然引用存在,但是并沒有什么卵用)莉恼。
import copy
list1 = [1, 2, 3, 4, 5, [6, 7, 8, ]]
list2 = copy.copy(list1)
print(list1)
print(list2)
list1[5].append(9)
print(list1)
print(list2)
list1.append(6)
print(list1)
print(list2)
list1.pop()
print(list1)
print(list2)
深拷貝
深拷貝其實(shí)與淺拷貝有本質(zhì)的區(qū)別拌喉,它不會復(fù)制任何的引用,對象內(nèi)的所有元素俐银,子元素尿背,孫子元素,重孫元素捶惜,曾孫元素的數(shù)據(jù)都是由復(fù)制而來田藐。它的實(shí)現(xiàn)原理就是遞歸,只要任意元素內(nèi)仍然有子元素吱七,就會復(fù)制子元素的數(shù)據(jù)放到新的內(nèi)存地址汽久。既然這樣,在使用深拷貝后陪捷,被拷貝對象的改變回窘,不會引起拷貝對象的任何改變诺擅。
import copy
list1 = [1, 2, 3, 4, 5, [6, 7, 8, ]]
list2 = copy.deepcopy(list1)
print(list1)
print(list2)
list1[5].append(9)
print(list1)
print(list2)
list1.append(6)
print(list1)
print(list2)
list1.pop()
print(list1)
print(list2)
復(fù)制與深淺拷貝總結(jié):
- 賦值:新建一個原來對象內(nèi)存地址的引用市袖,不開辟新的內(nèi)存空間;
- 淺拷貝:新建多個原來對象內(nèi)一級子元素內(nèi)存地址的引用烁涌,開辟新的內(nèi)存空間苍碟;
- 深拷貝:復(fù)制原來對象內(nèi)的所有N級子元素的數(shù)據(jù),開辟新的內(nèi)存空間撮执。
四 元組
與列表類型相比微峰,非常類似只不過[]換成(),作用:用于存儲多個值抒钱,對比列表來說蜓肆,元組不可變(是可以當(dāng)做字典的key的),不可更改谋币,主要是用來讀仗扬。
age=(11,22,33,44,55)
# 本質(zhì)age=tuple((11,22,33,44,55))
元組可以存儲多個值,是有序的蕾额,是不可變類型早芭,可以哈希。元組常用的方法诅蝶,請參考列表常用方法退个,需要注意的是募壕,元組只能取值,而不能改變元組的值
五 字典
1. 字典類型基本介紹
字典用于存放一個人的信息:姓名语盈,性別舱馅,年齡,很明顯是多個值刀荒,既然是存多個值习柠,我們完全可以基于剛剛學(xué)習(xí)的列表去存放,如下:
# 既然如此照棋,我們我們?yōu)楹芜€要用字典资溃?
info=['albert','male',18]
# 定義列表的目的不單單是為了存,還要考慮取值烈炭,如果我想取出這個人的年齡溶锭,可以用
info[2]
# 但這是基于我們已經(jīng)知道在第3個位置存放的是年齡的前提下,我們才知道索引2對應(yīng)的是年齡符隙,即:
# # name, sex, age
info=['albert','male',18]
"""
而這完全只是一種假設(shè)趴捅,并沒有真正意義上規(guī)定第三個位置存放的是年齡,
于是我們需要尋求一種霹疫,即可以存放多個任意類型的值拱绑,又可以硬性規(guī)定值的映射關(guān)系的類型,
比如key=value丽蝎,這就用到了字典
"""
字典用于標(biāo)識存儲多個值的情況猎拨,每個值都有唯一一個對應(yīng)的key,可以更為方便高效地取值屠阻,字典的定義格式如下:
# 在{}內(nèi)用逗號分隔红省,可以存放多個key:value的值,key一般是字符串国觉,value可以是任意類型
info={'name':'albert','age':18,'sex':18}
# info=dict({'name':'albert','age':18,'sex':18})
字典可以存儲多個值吧恃,是無序的,是可變類型麻诀,不可哈希痕寓。
2. 字典類型常用的方法
(1) 增加元素
通過鍵值對的方式
l1 = {
'name': 'albert',
'age': 18,
'gender': 'male'
}
l1['hobbies'] = "music"
print(l1)
用fromkeys構(gòu)造一個字典
"""
第一個參數(shù)迭代循環(huán)的字典的key,第二個參數(shù)表示value蝇闭,
可以多個key循環(huán)對應(yīng)這個value呻率,也可以只有一個key,也可以沒有value
"""
a = l1.fromkeys(l1,'I am Albert')
print(a)
b = dict.fromkeys('name') # 必須有一個可迭代類型丁眼,作為字典的key
print(b)
b = dict.fromkeys('e') # 也可以迭代
print(b)
# b = dict.fromkeys(1) #報錯 數(shù)字類型不可迭代
b = dict.fromkeys([1,2,3,])
print(b)
(2) 刪除元素
del 通過字典的key刪除
l1 = {
'name': 'albert',
'age': 18,
'gender': 'male'
}
del l1['name']
print(l1)
pop 或者popitem刪除
l1 = {
'name': 'albert',
'age': 18,
'gender': 'male'
}
res = l1.pop('name') # 刪除指定key的value筷凤,并拿到一個返回值
print(res)
print(l1)
res2 = l1.popitem() # 隨機(jī)返回并刪除字典中的一對鍵和值(一般刪除末尾對)。
# 如果字典已經(jīng)為空,卻調(diào)用了此方法藐守,就報出KeyError異常挪丢。
print(res2)
print(l1)
(3) 更改元素
通過鍵值對的方式
l1 = {
'name': 'albert',
'age': 18,
'gender': 'male','3':3,
}
l1['name'] = '馬一特'
print(l1)
通過setdefault 或者update操作,兩者使用和區(qū)別如下:
setdefault只添加不修改
d1 = {
'name': 'albert',
'age': 18,
}
d1.setdefault('name', 'Albert')
d1.setdefault('gender', 'male')
print(d1)
update既添加也修改
d1 = {
'name': 'albert',
'age': 18,
}
d1.update({'name': 'Albert', 'gender': 'male'}) # 注意傳參方式的不同
print(d1)
(4) 查找元素
通過鍵值對查找
l1 = {
'name': 'albert',
'age': 18,
'gender': 'male'
}
a = l1['name']
print(a)
通過get方法查找
l1 = {
'name': 'albert',
'age': 18,
'gender': 'male'
}
a = l1.get('hobbies') # 找不到不報錯
print(a)
通過enumerate 枚舉
d1 = {
'name': 'albert',
'age': 18,
'gender': 'male',
'3':3,
}
for a in enumerate(d1):
print(a)
通過.keys(),.values(),.items()等方法
d1 = {
'name': 'albert',
'age': 18,
'gender': 'male',
'3':3,
}
a = d1.keys()
print(a)
print(list(a)[0])
a = d1.values()
print(a)
print(list(a)[0])
a = d1.items()
print(a)
print(list(a)[0])
通過for循環(huán)遍歷
d1 = {
'name': 'albert',
'age': 18,
'gender': 'male',
'3':3,
}
for k,v in d1.items():
print(k,v)
(5) 成員運(yùn)算與長度運(yùn)算
參考列表的運(yùn)算方法卢厂,成員運(yùn)算的依據(jù)是字典的key乾蓬,而不是value,長度運(yùn)算都可以作為參考的依據(jù)
六 集合類型
花括號內(nèi)慎恒,多個元素用逗號分割任内,用來存儲多個值,并且是無序的融柬,那么這多個值不能用來取值死嗦,但是我們可以使用它來進(jìn)行去重和關(guān)系運(yùn)算。
# 集合的元素遵循三個原則:
1: 每個元素必須是不可變類型(可作為字典的key)
2: 沒有重復(fù)的元素
3: 無序
# 注意集合的目的是將不同的值存放到一起粒氧,不同的集合間用來做關(guān)系運(yùn)算越除,無需糾結(jié)于集合中單個值
集合類型可以存多個值,是無序的外盯,是可變類型摘盆,不可以哈希。<br />關(guān)系運(yùn)算練習(xí)
有如下兩個集合饱苟,piano是報名鋼琴課程的學(xué)員名字集合孩擂,violin是報名小提琴課程的學(xué)員名字集合
piano={'albert','孫悟空','周星馳','朱茵','林志玲'}
violin={'豬八戒','郭德綱','林憶蓮','周星馳'}
1. 求出即報名鋼琴又報名小提琴課程的學(xué)員名字集合
2. 求出所有報名的學(xué)生名字集合
3. 求出只報名鋼琴課程的學(xué)員名字
4. 求出沒有同時這兩門課程的學(xué)員名字集合
參考答案
# 求出即報名鋼琴又報名小提琴課程的學(xué)員名字集合
print(piano & violin)
# 求出所有報名的學(xué)生名字集合
print(piano | violin)
# 求出只報名鋼琴課程的學(xué)員名字
print(piano - violin)
# 求出沒有同時這兩門課程的學(xué)員名字集合
print(piano ^ violin)
七 布爾類型
計算機(jī)俗稱電腦箱熬,即我們編寫程序讓計算機(jī)運(yùn)行時类垦,應(yīng)該是讓計算機(jī)無限接近人腦,或者說人腦能干什么坦弟,計算機(jī)就應(yīng)該能干什么护锤,人腦的主要作用是數(shù)據(jù)運(yùn)行與邏輯運(yùn)算,此處的布爾類型就模擬人的邏輯運(yùn)行酿傍,即判斷一個條件成立時,用True標(biāo)識驱入,不成立則用False標(biāo)識赤炒。
#布爾值,一個True一個False
>>> a=3
>>> b=5
>>> a > b #不成立就是False,即假
False
>>> a < b #成立就是True, 即真
True
# 接下來就可以根據(jù)條件結(jié)果來干不同的事情了:
if a > b:
print(a is bigger than b )
else:
print(a is smaller than b )
# 上面是偽代碼亏较,但意味著莺褒,計算機(jī)已經(jīng)可以像人腦一樣根據(jù)判斷結(jié)果不同,來執(zhí)行不同的動作雪情。
布爾類型的重點(diǎn)知識
#所有數(shù)據(jù)類型都自帶布爾值
1遵岩、None,0,空(空字符串尘执,空列表舍哄,空字典等)三種情況下布爾值為False
2、其余均為真
可變類型與不可變類型(重點(diǎn))
# 1.可變類型:在id不變的情況下誊锭,value可以變表悬,則稱為可變類型,如列表丧靡,字典
# 2. 不可變類型:value一旦改變蟆沫,id也改變,則稱為不可變類型(id變温治,意味著創(chuàng)建了新的內(nèi)存空間)
八 collections容器數(shù)據(jù)類型
1. namedtuple 命名元組
from collections import namedtuple
# 創(chuàng)建一個命名元組對象
point = namedtuple('p', ['x', 'y']) # p代表名稱饭庞,"x"和"y"為內(nèi)容
p = point(1, 2)
print(p)
print(p.x) # 1
print(p.y) # 2
2. deque 超級列表
from collections import deque
# 類似列表(list)的容器,實(shí)現(xiàn)了在兩端快速添加(append)和彈出(pop)
d = deque('abcd')
for i in d:
print(i)
print(d[0])
print(d[1])
d.append('e') # 從右邊加入
print(d)
d.appendleft('x') # 從左邊加入
print(d)
d.pop() # 從右側(cè)彈出
print(d)
d.popleft() # 從左側(cè)彈出
print(d)
deque(reversed(d)) # 反轉(zhuǎn)順序
print(d)
# d = list(d) # 轉(zhuǎn)化成list
# d = list(reversed(d))
# print(d)
d.extend('xyz') # 從右側(cè)添加
print(d)
d.extendleft('nba') # 從左側(cè)添加
print(d)
d.rotate(1) # 把最右邊的元素挪到最左邊
print(d)
d.rotate(-1) # 把最左邊的元素挪到最右邊
print(d)
d.clear() # 清空
# d.pop() # 報錯
3. ChainMap 鏈映射
from collections import ChainMap
"""
一個 ChainMap 類是為了將多個映射快速的鏈接到一起熬荆,這樣它們就可以作為一個單元處理但绕。
它通常比創(chuàng)建一個新字典和多次調(diào)用 update() 要快很多。
這個類可以用于模擬嵌套作用域惶看,并且在模版化的時候比較有用捏顺。
"""
# 鏈映射的用法
dict1 = {'name': 'Albert', 'age': 18}
dict2 = {'weight': 65, 'height': 180}
res = list(ChainMap(dict1, dict2))
print(res)
4. Counter 計數(shù)字典
from collections import Counter
# 計數(shù)
cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
cnt[word] += 1
print(cnt)
# Counter({'blue': 3, 'red': 2, 'green': 1})
# 數(shù)學(xué)運(yùn)算
c = Counter(a=3, b=1)
d = Counter(a=1, b=2)
print(c + d) # 相同的部分相加
# Counter({'a': 4, 'b': 3})
print(c - d) # 相同的部分相減
# Counter({'a': 2})
print(c & d) # 相同的部分取最小
# Counter({'a': 1, 'b': 1})
print(c | d) # 相同的部分取最大
# Counter({'a': 3, 'b': 2})
Collections容器類型一共有9種,除了上面介紹的4種之外還有OrderedDict纬黎,defaultdict幅骄,UserDict,UserList本今,UserString拆座,他們的用法不是完全相同,但是使用起來并不復(fù)雜冠息,更多Collections容器類型數(shù)據(jù)結(jié)構(gòu)詳見官方文檔:Collections容器數(shù)據(jù)類型挪凑。