第三章:數(shù)據(jù)類型

本文是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ù)類型挪凑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逛艰,隨后出現(xiàn)的幾起案子躏碳,更是在濱河造成了極大的恐慌,老刑警劉巖散怖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菇绵,死亡現(xiàn)場離奇詭異,居然都是意外死亡镇眷,警方通過查閱死者的電腦和手機(jī)咬最,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欠动,“玉大人永乌,你說我怎么就攤上這事。” “怎么了翅雏?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵圈驼,是天一觀的道長。 經(jīng)常有香客問我枚荣,道長碗脊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任橄妆,我火速辦了婚禮衙伶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘害碾。我一直安慰自己矢劲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布慌随。 她就那樣靜靜地躺著芬沉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阁猜。 梳的紋絲不亂的頭發(fā)上丸逸,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音剃袍,去河邊找鬼黄刚。 笑死,一個胖子當(dāng)著我的面吹牛民效,可吹牛的內(nèi)容都是我干的憔维。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼畏邢,長吁一口氣:“原來是場噩夢啊……” “哼业扒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舒萎,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤程储,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逆甜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虱肄,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年交煞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斟或。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡素征,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情御毅,我是刑警寧澤根欧,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站端蛆,受9級特大地震影響凤粗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜今豆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一嫌拣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呆躲,春花似錦异逐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辅甥,卻和暖如春酝润,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背璃弄。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工要销, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谢揪。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓蕉陋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拨扶。 傳聞我的和親對象是個殘疾皇子凳鬓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容