一皂股、set集合【了解】
1.概述
和數(shù)學(xué)上的集合基本是一樣的荷辕,
特點(diǎn):不允許有重復(fù)元素途戒,可以進(jìn)行交集坑傅,并集,差集的運(yùn)算
本質(zhì):無(wú)序喷斋,無(wú)重復(fù)元素的集合
2.創(chuàng)建
set(列表或者元組或者字典)
代碼演示:
#注意:set的創(chuàng)建需要借助于list和tuple #1.通過(guò)list創(chuàng)建set list1 = [432,5,5,46,65] s1 = set(list1) print(list1) print(s1) #注意1:set中會(huì)自動(dòng)將重復(fù)元素過(guò)濾掉 #2.通過(guò)tuple創(chuàng)建set tuple1 = (235,45,5,656,5) s2 = set(tuple1) print(tuple1) print(s2) #3.通過(guò)dict創(chuàng)建set dict1 = {1:"hello",2:"good"} s3 = set(dict1) print(dict1) #{1: 'hello', 2: 'good'} print(s3) #{1, 2} #注意2:set跟dict類似唁毒,都使用{}表示,但是與dict之間的區(qū)別在于:set中相當(dāng)于只存儲(chǔ)了一組key星爪,沒(méi)有value
3.操作
3.1添加
代碼演示:
#1.添加 #add() 在set的末尾進(jìn)行追加 s1 = set([1,2,3,4,5]) print(s1) s1.add(6) print(s1) #注意:如果元素已經(jīng)存在浆西,則添加失敗 s1.add(3) print(s1) #print(s1.add(3)) #s1.add([7,8,9]) #TypeError: unhashable type: 'list' list是可變的,set中的元素不能是list類型 s1.add((7,8,9)) #s1.add({1:"a"}) #TypeError: unhashable type: 'dict' 顽腾,dict中的鍵值對(duì)可以改變近零,set中的元素不能是dict類型 print(s1) #update() 插入【末尾添加】,打碎插入【直接將元組,列表中的元素添加到set中久信,將字符串中的字母作為小的字符串添加到set中】 s2 = set([1,2,3,4,5]) print(s2) s2.update([6,7,8]) s2.update((9,10)) s2.update("good") #注意:不能添加整型窖杀,因?yàn)檎筒荒苁褂胒or循環(huán)遍歷 #s2.update(11) #TypeError: 'int' object is not iterable print(s2)
3.2刪除
代碼演示:
#2.刪除 #remove() s3 = set([1,2,3,4,5]) print(s3) s3.remove(3) print(s3)
3.3遍歷
代碼演示:
#3.set的遍歷 s4 = set([1,2,3,4,5]) for i in s4: print(i) #注意:set是沒(méi)有索引的,所以不能通過(guò)s4[2]獲取元素裙士,原因:set是無(wú)序的 #print(s4[2]) #TypeError: 'set' object does not support indexing #注意:獲取的是編號(hào)和元素值 for i,num in enumerate(s4): print(i,num)
3.4交集和并集
代碼演示:
#4.交集和并集 s4 = set([1,2,3]) s5 = set([4,5,3]) #交集:&【按位與】 and r1 = s4 & s5 print(r1) print(type(r1)) #并集:|【按位或】 or r2 = s4 | s5 print(r2)
三入客、簡(jiǎn)單算法【掌握】
代碼演示:
#需求:求列表中元素的最大值,不能借助于系統(tǒng)功能 list1 = [5,54,6,774,43,44] #方式一 #定義一個(gè)變量腿椎,用于記錄最大值【參照物】 #思路:如果要操作列表痊项,初始值一般使用列表的第一個(gè)元素 maxValue = list1[0] for num in list1: if num > maxValue: #給maxValue重新賦值 maxValue = num print(maxValue) #方式二 maxValue1 = list1[0] for index in range(1,len(list1)): if list1[index] > maxValue1: maxValue1 = list1[index] print(maxValue1) #需求升級(jí):獲取最大值以及最大值對(duì)應(yīng)的下標(biāo) maxValue2 = list1[0] maxIndex = 0 for index in range(1, len(list1)): if list1[index] > maxValue2: maxValue2 = list1[index] maxIndex = index print(maxValue2,maxIndex)
1.排序
1.1冒泡排序
排序思路:比較兩個(gè)相鄰下標(biāo)對(duì)應(yīng)的元素,如果以升序?yàn)槔脑捤址蹋瑒t最大值出現(xiàn)在最右邊
代碼實(shí)現(xiàn):
list1 = [34,5,46,23,23,54,65,54] #升序排序:冒泡 #外層循環(huán):控制比較的輪數(shù) for out in range(0,len(list1) - 1): #內(nèi)層循環(huán);控制每一輪比較的次數(shù)鞍泉,兼顧參與比較的下標(biāo) for inner in range(0,len(list1) - out - 1): if list1[inner] > list1[inner + 1]: #方式一 temp = list1[inner] list1[inner] = list1[inner + 1] list1[inner + 1] = temp #方式二:簡(jiǎn)寫(xiě) #list1[inner],list1[inner + 1] = list1[inner + 1],list1[inner] print(list1) """" for inner in range(0,len(list1) - out): IndexError: list index out of range 原因分析:當(dāng)out取值為0的時(shí)候,inner的取值范圍為0~len(list1) - 1 當(dāng)使用if list1[inner] > list1[inner + 1]:肮帐,當(dāng)inner取值為len(list1) - 1咖驮,此時(shí)inner+1變成了len(list1) 解決辦法:for inner in range(0,len(list1) - out - 1): 當(dāng)out取值為0的時(shí)候,此時(shí)inner的取值范圍:0~len(list1) - 2 假設(shè)元素個(gè)數(shù)為5训枢,inner當(dāng)取值為3的時(shí)候托修,inner+1取值為4,正好是索引的最大值的邊界 """
1.2選擇排序
排序思路:固定一個(gè)下標(biāo)恒界,然后拿這個(gè)下標(biāo)對(duì)應(yīng)的元素和其他的元素依次進(jìn)行比較睦刃,最小值出現(xiàn)在最左邊
代碼演示:
list1 = [34,5,46,23,23,54,65,54] #排序方式:選擇排序 #外層循環(huán):控制比較的輪數(shù) for out in range(0,len(list1) - 1): #內(nèi)層循環(huán):控制每一輪比較的次數(shù),兼顧參與比較的下標(biāo) for inner in range(out + 1,len(list1)): """ 0-1 0-2 0-3 0-4 1-2 1-3 1-4 2-3 2-4 3-4 """ #out表示小的下標(biāo)十酣,inner的最小值out+1 if list1[out] > list1[inner]: temp = list1[out] list1[out] = list1[inner] list1[inner] = temp print(list1) #注意:注意區(qū)分冒泡和選擇的邊界問(wèn)題
三涩拙、String字符串【1】
1.概述
由多個(gè)字母,數(shù)字耸采,特殊字符組成的有限序列
在Python中兴泥,使用單引號(hào)或者雙引號(hào)都可以表示字符串
注意:沒(méi)有單符號(hào)的數(shù)據(jù)類型
'a' "a"
2.創(chuàng)建字符串
代碼演示:
str1 = "hello" str2 = "abc1234" str3 = "***fhhg%%%" str4 = "中文"
3.字符串運(yùn)算
代碼演示:
#1.+ 字符串連接 s1 = "welcome" s2 = " to China" print(s1 + s2) #注意:在Python中,使用+虾宇。只能是字符串和字符串之間搓彻。和其他數(shù)據(jù)類型使用的話不支持 #print("abc" + 10) #print("123" + 1) #print(1 + "12" + 12) #print("hello" + True) #2. * 字符串重復(fù) s3 = "good" print(s3 * 3) #3.獲取字符串中的某個(gè)字符 """ 類似于列表和元組的使用,通過(guò)索引來(lái)獲取指定位置的字符 注意索引的取值范圍【0~長(zhǎng)度 - 1】嘱朽,同樣會(huì)出現(xiàn)索引越界 訪問(wèn)方式:字符串名稱[索引] """ s4 = "abcdef" print(s4[1]) #print(s4[10]) #IndexError: string index out of range #獲取字符串的長(zhǎng)度:len() #遍歷字符串,和list旭贬,tuple的用法完全相同 for element in s4: print(element) for index in range(0,len(s4)): print(s4[index]) for index,str in enumerate(s4): print(index,str) #4.截取字符串【切片】 str1 = "hello world" #指定區(qū)間 print(str1[3:7]) #從指定位置到結(jié)尾,包含指定位置 print(str1[3:]) #從開(kāi)頭到指定位置搪泳,但是不包含指定位置 print(str1[:7]) str2 = "abc123456" print(str2[2:5]) #c12 print(str2[2:]) #c123456 print(str2[2::2]) #c246 print(str2[::2]) #ac246 print(str2[::-1]) #654321cba 倒序 print(str2[-3:-1]) #45 -1表示最后一個(gè)字符 #5.判斷一個(gè)子字符串是否在原字符串中 #in not in str3 = "today is a good day" print("good" in str3) print("good1" not in str3)
4.格式化輸出
通過(guò)%來(lái)改變后面字母或者數(shù)字的含義稀轨,%被稱為占位符
%d 整數(shù)
%f 浮點(diǎn)型,特點(diǎn):可以指定小數(shù)點(diǎn)后的位數(shù)
%s 字符串
代碼演示:
#6.格式化輸出 num = 10 string1 = "hello" print("string1=",string1,"num=",num) #注意:變量的書(shū)寫(xiě)順序盡量和前面字符串中出現(xiàn)的順序保持一致 print("string1=%s,num=%d"%(string1,num)) f = 12.247 print("string1=%s,num=%d,f=%f"%(string1,num,f)) #需求:浮點(diǎn)數(shù)保留小數(shù)點(diǎn)后兩位 print("string1=%s,num=%d,f=%.2f"%(string1,num,f)) #round(12.247,2)
5.常用轉(zhuǎn)義字符
通過(guò)\來(lái)改變后面字母或者特殊字符的含義
\t 相當(dāng)于tab鍵
\n 相當(dāng)于enter鍵
\b 相當(dāng)于backspace
代碼演示:
#7.轉(zhuǎn)義字符 string2 = "hello\tworld" string21 = "hello world" print(string2) print(string21) #換行:\n 多行注釋 string3 = "hello\nPython" string31 = """hello python2354623 """ print(string3) print(string31) #需求:"hello" print("\"hello\"") #C:\Users\Administrator\Desktop\SZ-Python1805\Day6\視頻 print("C:\\Users\\Administrator\\Desktop") #注意;如果一個(gè)字符串中有多個(gè)字符需要轉(zhuǎn)義森书,則可以在字符串的前面添加r,可以避免對(duì)字符串中的每個(gè)特殊字符進(jìn)行轉(zhuǎn)義 print(r"C:\Users\Administrator\Desktop")
四靶端、String字符串【2】
1.常用功能
1.1獲取長(zhǎng)度和次數(shù)
代碼演示:
#1.計(jì)算字符串長(zhǎng)度 len #類似于list和tuple的中獲取長(zhǎng)度的用法 str1 = "hfufhja" l = len(str1) print(l) #2,計(jì)算某個(gè)字符或者子字符串在原字符串中出現(xiàn)的次數(shù) count str2 = "this is a good day good day" #count(str,[start,end]) #在整個(gè)字符串中進(jìn)行查找 print(str2.count("day")) #在指定區(qū)間內(nèi)進(jìn)行查找 print(str2.count("day",3,10))
1.2大小寫(xiě)轉(zhuǎn)換
代碼演示:
#注意:使用字符串中的功能谎势,一般情況下,都是生成一個(gè)新的字符串杨名,原字符串沒(méi)有發(fā)生任何變化 #3.大小寫(xiě)字母轉(zhuǎn)換 #lower() 將字符串中的大寫(xiě)字母轉(zhuǎn)換為小寫(xiě) str31 = "Today Is a Good day" astr31 = str31.lower() print(astr31) #uppper() 將字符串中小寫(xiě)字母轉(zhuǎn)換為大寫(xiě) str32 = "Today Is a Good day" astr32 = str2.upper() print(astr32) #swapcase() 將字符串中小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)脏榆,大寫(xiě)字母轉(zhuǎn)換為小寫(xiě) str33 = "Today Is a Good day" astr33 = str33.swapcase() print(astr33) #capitalize() 將一句英文中首單詞的首字母轉(zhuǎn)化為大寫(xiě),其他小寫(xiě) str34 = "today Is a Good day" astr34 = str34.capitalize() print(astr34) #title() 將一句英文中每個(gè)單詞的首字母大寫(xiě) str35 = "today is a good day" astr35 = str35.title() print(astr35)
1.3整數(shù)和字符串轉(zhuǎn)換
代碼演示:
4.字符串和數(shù)字之間的轉(zhuǎn)換 #int() float() str() #eval(str) 將str轉(zhuǎn)換為有效的表達(dá)式台谍,參與運(yùn)算须喂,并返回運(yùn)算結(jié)果 num1 = eval("123") print(num1) #print("123") print(type(num1)) print(int("123")) #eval和int將+和-當(dāng)做正負(fù)號(hào)處理 print(eval("+123")) print(int("+123")) print(eval("-123")) print(int("-123")) #將12+3字符串轉(zhuǎn)換為了有效的表達(dá)式,并運(yùn)算了結(jié)果 print(eval("12+3")) #15 #不成立 #print(int("12+3")) #ValueError: invalid literal for int() with base 10: '12+3' print(eval("12-3")) #9 #print(int("12-3")) #ValueError: invalid literal for int() with base 10: '12-3' #print(eval("a123")) #NameError: name 'a123' is not defined #print(int("a123")) #ValueError: invalid literal for int() with base 10: 'a123' #總結(jié):注意區(qū)分eval和int【eval:轉(zhuǎn)換有效的表達(dá)式 int:將字符串轉(zhuǎn)換為整型】
1.4填充
代碼演示:
#5.填充【了解】 #center(width[,fillchar]) 返回一個(gè)指定寬度的居中字符串趁蕊,width是填充之后整個(gè)字符串的長(zhǎng)度坞生,fillchar為需要填充的字符串,默認(rèn)使用空格填充 str1 = "hello" print(str1.center(20)) print(str1.center(10,"*")) #ljust(width[,fillchar]) 返回一個(gè)指定寬度的字符串掷伙,將原字符串居左對(duì)齊是己,width是填充之后整個(gè)字符串的長(zhǎng)度 print(str1.ljust(40,"%")) #rjust width[,fillchar]) 返回一個(gè)指定寬度的字符串,將原字符串居右對(duì)齊任柜,width是填充之后整個(gè)字符串的長(zhǎng)度 print(str1.rjust(40,"%")) #zfill(width) 返回一個(gè)指定寬度的字符串,將原字符串居右對(duì)齊,剩余的部分使用的數(shù)字0填充 print(str1.zfill(40))
1.5查找
代碼演示:
#6.查找【掌握】 str2 = "abcdefhello123hello" #find(str[,start,end]) 從左到右依次檢測(cè)卒废,str是否在原字符串中,宙地,也可以指定查找的范圍 #特點(diǎn);得到的子字符串第一次出現(xiàn)的開(kāi)始字符的下標(biāo)摔认,如果查找不到則返回-1 print(str2.find("hello")) #6 print(str2.find("e")) print(str2.find("yyy")) #-1 print(str2.find("e",3,10)) #rfind(str[,start,end]) 類似于find,從右向左進(jìn)行檢測(cè) print(str2.rfind("hello")) #14 #index 和find的使用基本相同宅粥,唯一的區(qū)別在于如果子字符串查找不到参袱,find返回-1,而index則直接報(bào)錯(cuò) print(str2.index("hello")) #print(str2.index("yyy")) #ValueError: substring not found #rindex 和rfind的使用基本相同 #max(str) 獲取str中最大的字母【在字典中的順序】 #"abcdefhello123hello" print(max(str2)) str3 = "46732647" print(max(str3)) #min(str) 獲取str中最小的字母【在字典中的順序】
1.6提取
代碼演示:
#7.提取字符串 #strip(str) 使用str作為條件提取字符串秽梅,除了兩頭指定的字符串 str1 = "********today is *********a good day*******" print(str1.strip("*")) #today is *********a good day #lstrip(str) 提取字符串抹蚀,除了左邊的指定字符串 str11 = "********today is *********a good day*******" print(str11.lstrip("*")) #rstrip() str12 = "********today is *********a good day*******" print(str12.rstrip("*"))
1.7分割和合并
代碼演示:
#8.分割和合并【掌握:正則表達(dá)式】 #split(str[,num)] 將str作為分隔符切割原字符串,結(jié)果為一個(gè)列表,如果制定了num风纠,則僅使用num個(gè)字符串截取原字符串 str3 = "today is a good day" print(str3.split(" ")) #['today', 'is', 'a', 'good', 'day'] print(str3.split(" ",2)) #['today', 'is', 'a good day'] #splitlines(flag) 按照換行符【\n况鸣,\r,\r\n】分隔牢贸,結(jié)果為列表 #flag:False或者不寫(xiě)竹观,則表示忽略換行符;如果True潜索,則表示保留換行符 str4 = """today is a good day """ print(str4.splitlines(True)) #['today', 'is', 'a', 'good', 'day'] ['today\n', 'is\n', 'a\n', 'good\n', 'day\n'] #join(list) 將原字符串作為連接符號(hào)臭增,將列表中的元素分別連接起來(lái),結(jié)果為字符串竹习,作用和split是相反的 str5 = "*" list1 = ["shangsan","lisi","jack"] print(str5.join(list1))
1.8替換
代碼演示:
#9.替換 #replace(old,new[,max]) 用new的字符串將old的字符串替換掉.max表示可以替換的最大次數(shù)【從左到右】 str1 = "this is a easy test test test test" print(str1.replace("test","exam")) print(str1.replace("test","exam",2)) #使用場(chǎng)景:在一定情境下誊抛,可以實(shí)現(xiàn)字符串的簡(jiǎn)單加密,加密規(guī)則可以自定義 #maketrans() 創(chuàng)建字符映射的轉(zhuǎn)換表,結(jié)果為字典整陌,通過(guò)key:value的方式 #translate(table) t = str.maketrans("aco","123") print(t) #{97: 49, 99: 50, 111: 51} str2 = "today is a good day" print(str2.translate(t)) #t3d1y is 1 g33d d1y
1.9判斷
代碼演示:
#10.判斷 #isalpha() 如果字符串中至少包含一個(gè)字符并且所有的字符都是字母拗窃,才返回True print("".isalpha()) print("abc".isalpha()) print("abc123".isalpha()) #False #isalnum 如果字符串中至少包含一個(gè)字符并且所有字符都是字母或者數(shù)字的時(shí)候才返回True print("".isalnum()) #False print("abc".isalnum()) print("abc123".isalnum()) print("123".isalnum()) print("1abc".isalnum()) print("1abc¥".isalnum()) #False #isupper 如果字符串中至少包含一個(gè)字符并且出現(xiàn)的字母必須是大寫(xiě)字母才返回True瞎领,數(shù)字的出現(xiàn)沒(méi)有影響 print("".isupper()) print("aBC".isupper()) print("123A".isupper()) #True print("abc".isupper()) #islower #istitle 每個(gè)單詞的首字母必須全部大寫(xiě)才返回True print("Good Day".istitle()) print("good Day".istitle()) #isdigit() 【掌握】 如果字符串中只包含數(shù)字,則返回True print("abc123".isdigit()) print("2364".isdigit()) #需求:將用戶從控制臺(tái)輸入的字符串轉(zhuǎn)化為整型【全數(shù)字】 str = input() if str.isdigit(): int(str) print("yes")
1.10前綴和后綴
代碼演示:
#11.前綴和后綴【掌握】 子字符串是連續(xù)的 #startswith str1 = "helloPython" print(str1.startswith("hello")) #endswith print(str1.endswith("on"))
1.11編解碼
代碼演示:
#12.字符串編碼和解碼 #注意:主要針對(duì)的是中文 #encode() 默認(rèn)的編碼格式為utf-8 str2 = "this is 千鋒教育" print(str2.encode()) print(str2.encode("utf-8")) print(str2.encode("gbk")) #decode() bytes對(duì)象 #\xe5\x8d\x83\xe9\x94\x8b\xe6\x95\x99\xe8\x82\xb2 #print(r"\xe5\x8d\x83\xe9\x94\x8b\xe6\x95\x99\xe8\x82\xb2".decode()) 錯(cuò)誤
1.12ASCII碼轉(zhuǎn)換
代碼演示:
#13随夸。ASCII嗎的轉(zhuǎn)換 #ord() print(ord("A")) print(ord("0")) #chr() print(chr(65)) print(chr(110))
2.練習(xí)
需求一:
#需求1:統(tǒng)計(jì)下面字符串中每個(gè)單詞的出現(xiàn)次數(shù)九默,并生成一個(gè)字典,單詞為key宾毒,次數(shù)為value """ 實(shí)現(xiàn)思路: 1.以空格為切割符切割字符串 2.遍歷第一步中得到的list 3.將單詞提取出來(lái)驼修,去一個(gè)字典中判斷 4.如果單詞不存在,就以該單詞作為key诈铛,1作為value存儲(chǔ)到字典中 5.如果單詞存在乙各,將對(duì)應(yīng)key的value遞增1【修改指定key的value】 """ str1 = "tomorrow is sunny day tomorrow is sunny day tomorrow is wind day" dict1 = {} #創(chuàng)建一個(gè)空字典,備用 list1 = str1.split(" ") #切割字符串 #方式一:get() """ for word in list1: #遍歷列表 value = dict1.get(word) #None if value == None: dict1[word] = 1 #往字典中添加鍵值對(duì) else: dict1[word] += 1 #給字典中指定key的value修改值 print(dict1) """ #方式二:成員運(yùn)算符 for word in list1: #遍歷列表 if word not in dict1: dict1[word] = 1 else: dict1[word] += 1 print(dict1)
需求二:
#需求2:從控制臺(tái)輸入一個(gè)字符串幢竹,表示時(shí)間耳峦,編寫(xiě)程序,獲取這個(gè)時(shí)間的下一秒 #例如輸入:12:23:33 輸出12:23:34 """ 思路分析: 1.將字符串切割焕毫,得到時(shí)分秒的數(shù)據(jù) 2.得到時(shí)間的下一秒:給秒加1 3.12:23:59----》12:24:00 當(dāng)秒數(shù)增加完之后為60的時(shí)候妇萄,分鐘需要增加1,秒數(shù)應(yīng)該置為0 4.12:59:59----》13:00:00 當(dāng)分鐘增加完之后為60的時(shí)候咬荷,時(shí)鐘需要增加1冠句,分鐘置為0 5.當(dāng)時(shí)鐘增加完之后為24的時(shí)候,時(shí)鐘置為0 """ timeStr = input("請(qǐng)輸入正確格式的時(shí)間:") timeList = timeStr.split(":") h = int(timeList[0]) m = int(timeList[1]) s = int(timeList[2]) s += 1 if s == 60: m += 1 s = 0 if m == 60: h += 1 m = 0 if h == 24: h = 0 print("%.2d:%.2d:%.2d"%(h,m,s)) #%.2f
需求三:
#需求3:實(shí)現(xiàn)簡(jiǎn)單的購(gòu)物車功能 """ 思路分析 1.引導(dǎo)用戶選擇商品【提供】 2.引導(dǎo)用戶輸入金額 3.加入購(gòu)物車 4.查看購(gòu)物車幸乒,計(jì)算余額 """ product_list = [ ("Mac",10000), ("kindle",500), ("iphone x",8000), ("bike",3000) ] saving = input("請(qǐng)輸入金額:") #定義一個(gè)列表懦底,充當(dāng)購(gòu)物車 shopping_car = [] #判斷金額是否是數(shù)字 if saving.isdigit(): #將saving轉(zhuǎn)換為整數(shù) saving = int(saving) while True: #打印商品信息,提供給用戶選擇 for index,p in enumerate(product_list): print(index,":",p) #引導(dǎo)用戶選擇商品 choice = input("請(qǐng)輸入商品的編號(hào)[輸入q退出]:") #判斷編號(hào)是否合法 if choice.isdigit(): choice = int(choice) if choice >= 0 and choice < len(product_list): #將用戶選擇的商品從product_list取出來(lái) item = product_list[choice] #元組 #item[0] :商品名稱 item[1]:商品的價(jià)格 if item[1] <= saving: #saving減少 saving -= item[1] #需要將商品添加到購(gòu)物車對(duì)應(yīng)的list中 shopping_car.append(item) else: print("余額不足") else: print("不存在的編號(hào)") elif choice == "q": print("-------你已經(jīng)購(gòu)買(mǎi)如下商品:-------") for i in shopping_car: print(i) print("你還剩余%d元錢(qián)"%(saving)) break else: print("不合法的編號(hào)") else: print("invalid input")