摘要:內(nèi)容列表元組操作字符串操作字典操作集合操作文件操作字符編碼與轉(zhuǎn)碼內(nèi)置函數(shù)在中,最基本的數(shù)據(jù)結(jié)構(gòu)是序列。序列中的每個(gè)元素被分配一個(gè)序號(hào)即元素的位置,也稱為索引??兆值洳话ㄈ魏雾?xiàng)由兩個(gè)大括號(hào)組成。
day2內(nèi)容
1、列表、元組操作
2、字符串操作
3、字典操作
4、集合操作
5、文件操作
6、字符編碼與轉(zhuǎn)碼
7、內(nèi)置函數(shù)
在Python中,最基本的數(shù)據(jù)結(jié)構(gòu)是序列(sequence)。序列中的每個(gè)元素被分配一個(gè)序號(hào)--即元素的位置,也稱為索引。第一個(gè)索引是0,第二個(gè)是1,以此類推。Python包含6中內(nèi)鍵的序列:列表、元組、字符串、Unicode字符串、buffer對(duì)象和xrange對(duì)象。
序列都可以進(jìn)行的操作包括索引、切片、加、乘、檢查成員
此外,Python已經(jīng)內(nèi)置確定序列的長度以及確定最大和最小元素的方法。
列表是Python中最常用的數(shù)據(jù)類型之一,通過列表可以對(duì)數(shù)據(jù)實(shí)現(xiàn)最方便的存儲(chǔ),修改等操作。
names = ["dabric","devil","Tom"]列表中元素的訪問
通過下標(biāo)訪問列表中的元素,下標(biāo)從0開始計(jì)數(shù)
>>> names ["dabric", "devil", "Tom"] >>> names[0] "dabric" >>> names[1] "devil" >>> names[-1] #還可以從后往前取 "Tom" >>> names[-2] "devil"改變列表:元素賦值
為指定下標(biāo)的元素賦值
>>> names ["dabric", "devil", "Tom"] >>> names[1] = "Alice" >>> names ["dabric", "Alice", "Tom"]分片(split)
Python通過對(duì)序列進(jìn)行分片,來取序列中的多個(gè)元素,分片遵循顧前不顧后的原則
>>> names ["dabric", "Alice", "Tom", "Beth", "Cecil"] >>> names[0:3] #當(dāng)從列表的首個(gè)元素開始切片時(shí),可以省略不寫0;相當(dāng)于names[:3] ["dabric", "Alice", "Tom"] >>> names ["dabric", "Alice", "Tom", "Beth", "Cecil"] >>> names[1:] #要取從指定下標(biāo)處開始所有列表中的元素,省略不寫后面的下標(biāo); ["Alice", "Tom", "Beth", "Cecil"] #從列表后往前切片 >>> names ["dabric", "Alice", "Tom", "Beth", "Cecil"] >>> names[-3:-1] ["Tom", "Beth"] >>> names ["dabric", "Alice", "Tom", "Beth", "Cecil"] >>> names[:-1] ["dabric", "Alice", "Tom", "Beth"] >>> names[-4:] ["Alice", "Tom", "Beth", "Cecil"]
append方法用于在列表末尾追加新的對(duì)象:
>>> names ["dabric", "Alice", "Tom"] >>> names.append("Beth") >>> names ["dabric", "Alice", "Tom", "Beth"]count
count方法統(tǒng)計(jì)某個(gè)元素在列表中出現(xiàn)的次數(shù):
>>> names ["dabric", "Alice", "Tom", "Beth", "Cecil", "Cecil"] >>> names.count("Cecil") 2extend
extend方法可以在列表的末尾一次性追加另一個(gè)序列中的多個(gè)值。換句話說,可以用新列表擴(kuò)展原有的列表:
>>> names ["dabric", "Alice", "Tom", "Beth", "Cecil", "Cecil"] >>> name ["Dee-Dee", "Earl"] >>> names.extend(name) >>> names ["dabric", "Alice", "Tom", "Beth", "Cecil", "Cecil", "Dee-Dee", "Earl"]index
index方法用于從列表中找出某個(gè)值第一個(gè)匹配的索引位置:
>>> names ["dabric", "Alice", "Tom", "Beth", "Cecil", "Cecil", "Dee-Dee", "Earl"] >>> names.index("dabric") 0 >>> names.index("Tom") 2 >>> names.index("Jerry") Traceback (most recent call last): File "insert", line 1, in ValueError: "Jerry" is not in list
insert方法用于將對(duì)象插入到列表中的指定位置:
>>> names ["dabric", "Alice", "Tom", "Beth", "Cecil", "Cecil", "Dee-Dee", "Earl"] >>> names.insert(3,"貝斯") >>> names ["dabric", "Alice", "Tom", "貝斯", "Beth", "Cecil", "Cecil", "Dee-Dee", "Earl"]pop
pop方法會(huì)移除列表中的一個(gè)元素(默認(rèn)為最后一個(gè)),并且返回該元素的值:
>>> names ["dabric", "Alice", "Tom", "貝斯", "Beth", "Cecil", "Cecil", "Dee-Dee", "Earl"] >>> names.pop() "Earl" >>> names ["dabric", "Alice", "Tom", "貝斯", "Beth", "Cecil", "Cecil", "Dee-Dee"] >>> names.pop(3) #移除指定下標(biāo)的元素,并將該元素的值返回 "貝斯" >>> names ["dabric", "Alice", "Tom", "Beth", "Cecil", "Cecil", "Dee-Dee"]remove
remove方法用于移除列表中某個(gè)值的第一個(gè)匹配項(xiàng)(remove方法修改了列表卻沒有返回值,這與pop方法相反):
>>> names ["dabric", "Alice", "Tom", "Beth", "Cecil", "Cecil", "Dee-Dee", "Tom"] >>> names.remove("Tom") >>> names ["dabric", "Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", "Tom"]reverse
reverse方法將列表中的元素反向存放:
>>> names ["dabric", "Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", "Tom"] >>> names.reverse() >>> names ["Tom", "Dee-Dee", "Cecil", "Cecil", "Beth", "Alice", "dabric"]sort
sort方法用于在原位置對(duì)列表盡心排序。在“原位置排序”意味著改變?cè)瓉淼牧斜恚瑂ort方法修改原來的列表,其返回結(jié)果為空:
>>> names ["Tom", "Dee-Dee", "Cecil", "Cecil", "Beth", "Alice", "dabric"] >>> name = names.sort() >>> names ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", "Tom", "dabric"] >>> name >>> print(name) Nonecopy
列表的賦值有三種方式:
>>> names ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", "Tom"] >>> name = names.copy() #方法一(淺拷貝) >>> names ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", "Tom"] >>> name ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", "Tom"] >>> names.pop() #移除names中的最后一個(gè)元素 "Tom" >>> name ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", "Tom"] >>> names ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee"] >>> name.clear() #清空列表中的數(shù)據(jù) >>> name [] >>> name = names[:] #方法二,names[:]得到的是包含names所有元素的分片,這是一種很有效率的復(fù)制整個(gè)列表的方法。只是簡(jiǎn)單的把names賦值給name是沒有用的,因?yàn)檫@樣做就讓names和name都指向同一個(gè)列表了。 >>> name ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", "Tom"] >>> names ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee"] >>> name.clear() >>> name [] >>> import copy #方法三,導(dǎo)入copy模塊 >>> name = copy.copy(names) #其功能和列表的copy方法一樣,都是淺拷貝 >>> name ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee"]深拷貝與淺拷貝
#淺拷貝,只能拷貝第一層的列表,對(duì)于第二層乃至更深的一層不能實(shí)現(xiàn)拷貝的功能。列表的拷貝是將列表中每個(gè)索引指向的值拷貝一份,對(duì)于列表中的列表,其索引指向的是另外一個(gè)地址,而淺拷貝只是將該索引指向的地址復(fù)制一份,所以當(dāng)前一個(gè)列表中值發(fā)生改變,相應(yīng)復(fù)制的列表中的值也發(fā)生同樣的變化。 >>> names ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee"] >>> names.append([1,2,3]) >>> names ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", [1, 2, 3]] >>> name [] >>> name = copy.copy(names) >>> name ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", [1, 2, 3]] >>> names ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", [1, 2, 3]] >>> names[-1][0] = 10 >>> name ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", [10, 2, 3]] >>> names ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", [10, 2, 3]] #深拷貝 >>> names ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", [1, 2, 3]] >>> name [] >>> name = copy.deepcopy(names) >>> name ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", [1, 2, 3]] >>> names[-1][0] = 10 >>> names ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", [10, 2, 3]] >>> name ["Alice", "Beth", "Cecil", "Cecil", "Dee-Dee", [1, 2, 3]]
元組與列表一樣,也是一種序列。唯一不同的是元組不能修改。
1、元組的定義 用逗號(hào)分隔一些值,就自動(dòng)創(chuàng)建了元組>>> 1,2,3 (1, 2, 3) >>> (1,2,3) (1, 2, 3)包含一個(gè)值的元組的實(shí)現(xiàn)
>>> 42, (42,) >>> (42) 42 >>> (42,) (42,)
元組也可以實(shí)現(xiàn)切片,它只有兩個(gè)方法,一個(gè)是count,另一個(gè)是index。
程序練習(xí)
程序:購物車程序
需求:
(1) 啟動(dòng)程序后,讓用戶輸入工資,然后打印商品列表
(2) 允許用戶根據(jù)商品編號(hào)購買商品
(3) 用戶選擇商品后,檢測(cè)余額是否夠,夠就直接扣款,不夠就提醒
(4) 可隨時(shí)退出,退出時(shí),打印已購買商品和余額
所有標(biāo)準(zhǔn)的序列操作(索引、分片、乘法、判斷成員資格、求長度、取最小值和最大值)對(duì)字符串同樣適用。但是字符串是不可改變的,例如:
>>> website = "http://www.python.org" >>> website[-3:] = "com" Traceback (most recent call last): File "2、字符串格式化", line 1, in TypeError: "str" object does not support item assignment
字符串格式化使用字符串格式化操作符即百分號(hào)%來實(shí)現(xiàn)。在%號(hào)左側(cè)放置一個(gè)字符串(格式化字符串),而右側(cè)則放置希望被格式化的值??梢允褂靡粋€(gè)值,如一個(gè)字符串或者數(shù)字,也可以使用多個(gè)值的元組或者字典。
格式化操作符的右操作數(shù)可以是任意類型,如果右操作數(shù)是元組的話,則其中的每一個(gè)元素都會(huì)被多帶帶格式化,每個(gè)值都需要一個(gè)對(duì)應(yīng)的轉(zhuǎn)換說明符。
>>> "%s plus %s equals %s" % (1,1,2) "1 plus 1 equals 2"
基本的轉(zhuǎn)換說明符
%字符:標(biāo)記轉(zhuǎn)換說明符的開始
轉(zhuǎn)換標(biāo)志(可選):-表示左對(duì)齊;+表示在轉(zhuǎn)換值之前要加上正負(fù)號(hào);""(空白字符)表示整十?dāng)?shù)之前保留空格;0表示轉(zhuǎn)換值若位數(shù)不夠則用0填充。
最小字段寬度(可選):轉(zhuǎn)換后的字符串至少應(yīng)該具有該值指定的寬度。如果是*,則寬度會(huì)從值元組中讀出。
點(diǎn)(.)后跟精度值(可選):如果轉(zhuǎn)換的是實(shí)數(shù),精度值就表示出現(xiàn)小數(shù)點(diǎn)后的位數(shù)。如果轉(zhuǎn)換的是字符串,那么該數(shù)字就表示最大字段寬度。如果是*,那么精度將會(huì)從元組中讀出。
轉(zhuǎn)換類型:參見下表。
3、字符串方基本方法
center
方法center通過在兩邊添加填充字符(默認(rèn)為空格)讓字符串居中。
>>> name = "My name is Dabric" >>> name.center(39) " My name is Dabric " >>> name.center(39,"*") "***********My name is Dabric***********" >>> name.ljust(40,"*") #將字符串靠左顯示,如果字符串不夠給定長度,用給定字符進(jìn)行填充 "My name is Dabric***********************" >>> name.rjust(40,"*") #將字符串靠右顯示,如果字符串不夠給定長度,用給定字符進(jìn)行填充 "***********************My name is Dabric" >>> name.zfill(40) #將字符串靠右顯示,如果字符串不夠給定長度,用0進(jìn)行填充 "00000000000000000000000My name is Dabric"
find
方法find在字符串中查找子串。如果找到,就返回子串的第一個(gè)字符的索引,否則返回-1.
>>> name.find("e") 6 >>> name.find("u") -1 還可以指定搜索的起點(diǎn)和終點(diǎn)(可選) >>> subject = "$$$ Get rich now!!! $$$" >>> subject.find("$$$") 0 >>> subject.find("$$$", 1) # 只指定了起點(diǎn) 20 >>> subject.find("!!!") 16 >>> subject.find("!!!", 0, 16) # 同時(shí)指定了起點(diǎn)和終點(diǎn)(搜索范圍包含起點(diǎn),但不包含終點(diǎn)) -1
join
join是一個(gè)非常重要的字符串方法,其作用于split相反,用于合并序列的元素。
>>> seq = [1, 2, 3, 4, 5] >>> sep = "+" >>> sep.join(seq) # 嘗試合并一個(gè)數(shù)字列表 Traceback (most recent call last): File "", line 1, in ? TypeError: sequence item 0: expected string, int found >>> seq = ["1", "2", "3", "4", "5"] >>> sep.join(seq) # 合并一個(gè)字符串列表 "1+2+3+4+5" >>> dirs = "", "usr", "bin", "env" >>> "/".join(dirs) "/usr/bin/env" >>> print("C:" + "".join(dirs)) C:usrinenv
repalce
方法replace將指定子串都替換為另一個(gè)字符串,并返回替換后的結(jié)果。
>>> "dabric tian, chinese name is tianchenguang".replace("tian","TIAN",1) "dabric TIAN, chinese name is tianchenguang"
spilt
split是一個(gè)非常重要的字符串方法,其作用與join相反,用于將字符串拆分為序列。
>>> "1+2+3+4+5".split("+") ["1", "2", "3", "4", "5"] >>> "/usr/bin/env".split("/") ["", "usr", "bin", "env"] >>> "Using the default".split() ["Using", "the", "default"] 注意,如果沒有指定分隔符,將默認(rèn)在單個(gè)或多個(gè)連續(xù)的空白字符(空格、制表符、換行符 等)處進(jìn)行拆分。
strip
方法strip將字符串開頭和末尾的空白(但不包括中間的空白)刪除,并返回刪除后的結(jié)果。
>>> " internal whitespace is kept ".strip() "internal whitespace is kept"
判斷字符串是否滿足特定的條件
很多字符串方法都以is打頭,如isspace、isdigit和isupper,它們判斷字符串是否具有特定
的性質(zhì)(如包含的字符全為空白、數(shù)字或大寫)。如果字符串具備特定的性質(zhì),這些方法就返回
True,否則返回False。
isalnum、isalpha、isdecimal、isdigit、isidentifier、islower、isnumeric、 isprintable、isspace、istitle、isupper
其他方法
>>> name = "My name is Dabric" >>> name "My name is Dabric" >>> name.capitalize() #首字母大寫 "My name is dabric" >>> name.casefold() #大寫全部變成小寫 "my name is dabric" >>> name.count("a") #統(tǒng)計(jì)指定字符或字符串出現(xiàn)的次數(shù) 2 >>> name.count("is") 1 >>> name.encode() #將字符串編碼成bytes格式 b"My name is Dabric" >>> name.endswith("dabric") #判斷字符串是否以指定的字符串結(jié)尾 False >>> name.endswith("Dabric") True >>> "dabric tian".expandtabs(10) #將 轉(zhuǎn)換成多長的空格 "dabric tian" >>> "dabric tian".expandtabs() "dabric tian" format : >>> msg = "my name is {}, and age is {}" >>> msg.format("dabric",22) "my name is dabric, and age is 22" >>> msg = "my name is {1}, and age is {0}" >>> msg.format("dabric",22) "my name is 22, and age is alex" >>> msg = "my name is {name}, and age is {age}" >>> msg.format(age=22,name="dabric") "my name is dabric, and age is 22" format_map >>> msg.format_map({"name":"dabric","age":22}) "my name is dabric, and age is 22" msg.index("a") 返回a所在字符串的索引 maketrans >>> intab = "aeiou" #This is the string having actual characters. >>> outtab = "12345" #This is the string having corresponding mapping character >>> trantab = str.maketrans(intab, outtab) >>> >>> str = "this is string example....wow!!!" >>> str.translate(trantab) "th3s 3s str3ng 2x1mpl2....w4w!!!" msg.partition("is") 輸出 ("my name ", "is", " {name}, and age is {age}") msg.swapcase 大小寫互換 >>> b="ddefdsdff_哈哈" >>> b.isidentifier() #檢測(cè)一段字符串可否被當(dāng)作標(biāo)志符,即是否符合變量命名規(guī)則 True
字典的數(shù)據(jù)結(jié)構(gòu)成為映射,字典是Python中唯一內(nèi)建的映射類型。字典中的值并沒有特殊的順序,但是都存儲(chǔ)在一個(gè)熱定的鍵(Key)下。鍵可以是數(shù)字、字符串甚至是元組。
1、字典的創(chuàng)建字典由多個(gè)鍵及與之對(duì)應(yīng)的值構(gòu)成的Key-Value對(duì)組成。每個(gè)鍵和它的值之間用冒號(hào)(:)隔開,項(xiàng)之間用逗號(hào)(,)隔開,而整個(gè)字典是由一對(duì)大括號(hào)括起來。空字典(不包括任何項(xiàng))由兩個(gè)大括號(hào)組成({})。例如:
phonebook = {"Alice":"2341","Beth":"9102","Cecil":"3258"}
dict函數(shù)
可以使用dict函數(shù),通過其他映射(比如其他字典)或者(鍵,值)對(duì)的序列建立字典。
>>> items = [("name","Gumby"),("age",42)] >>> d = dict(items) >>> d {"name": "Gumby", "age": 42}
dict函數(shù)也可以通過關(guān)鍵字參數(shù)來創(chuàng)建字典,如下所示:
>>> d = dict(name="Gumby",age=42) >>> d {"name": "Gumby", "age": 42}2、字典的操作
增加
>>> info {"student1": "Alice", "student2": "Beth", "student": "Cecil"} >>> info["student4"] = "Dabric" >>> info {"student1": "Alice", "student2": "Beth", "student": "Cecil", "student4": "Dabri c"}
修改
>>> info {"student1": "Alice", "student2": "Beth", "student": "Cecil", "student4": "Dabri c"} >>> info["student1"] = "ALICE" >>> info {"student1": "ALICE", "student2": "Beth", "student": "Cecil", "student4": "Dabri c"}
刪除
標(biāo)準(zhǔn)刪除方法
>>> info {"student1": "ALICE", "student2": "Beth", "student": "Cecil", "student4": "Dabri c"} >>> info.pop("student") #刪除指定鍵下的值,并將該值返回 "Cecil" >>> info {"student1": "ALICE", "student2": "Beth", "student4": "Dabric"}
通用刪除方法
>>> info {"student1": "ALICE", "student2": "Beth", "student4": "Dabric"} >>> del info["student1"] >>> info {"student2": "Beth", "student4": "Dabric"}
隨機(jī)刪除方法
>>> info {"student2": "Beth", "student4": "Dabric", "student1": "Alice", "student3": "Cec il"} >>> info.popitem() #隨機(jī)刪除字典中的項(xiàng),并將對(duì)應(yīng)的鍵值以元組的形式返回 ("student3", "Cecil")
查找
>>> info {"student2": "Beth", "student4": "Dabric", "student1": "Alice", "student3": "Cec il"} >>> "student2" in info #成員資格檢查,標(biāo)準(zhǔn)用戶 True >>> info.get("student1") #獲取指定鍵下的值,如果該指定的鍵值不存在,返回None "Alice" >>> info.get("student5") >>> >>> info["student1"] #同上,但是當(dāng)指定的鍵不存在時(shí)報(bào)錯(cuò) "Alice" >>> info["student5"] Traceback (most recent call last): File "", line 1, in KeyError: "student5"
多級(jí)字典嵌套及操作
av_catalog = { "歐美":{ "www.youporn.com": ["很多免費(fèi)的,世界最大的","質(zhì)量一般"], "www.pornhub.com": ["很多免費(fèi)的,也很大","質(zhì)量比yourporn高點(diǎn)"], "letmedothistoyou.com": ["多是自拍,高質(zhì)量圖片很多","資源不多,更新慢"], "x-art.com":["質(zhì)量很高,真的很高","全部收費(fèi),屌比請(qǐng)繞過"] }, "日韓":{ "tokyo-hot":["質(zhì)量怎樣不清楚,個(gè)人已經(jīng)不喜歡日韓范了","聽說是收費(fèi)的"] }, "大陸":{ "1024":["全部免費(fèi),真好,好人一生平安","服務(wù)器在國外,慢"] } } av_catalog["大陸"]["1024"][1] += ",可以用爬蟲爬下來" print(av_catalog["大陸"]["1024"]) #ouput ["全部免費(fèi),真好,好人一生平安", "服務(wù)器在國外,慢,可以用爬蟲爬下來"]
其他操作
#values >>> info {"student2": "Beth", "student4": "Dabric", "student1": "Alice", "student3": "Cec il"} >>> info.values() dict_values(["Beth", "Dabric", "Alice", "Cecil"]) #keys >>> info.keys() dict_keys(["student2", "student4", "student1", "student3"]) #setdefault setdefault方法在某種程度上類似于get方法,能夠獲得與給定鍵相關(guān)量的值,除此之外,setdefault還能在字典中不含有給定鍵的情況下設(shè)定相應(yīng)的鍵值。 >>> info.setdefault("student5","Devil") "Devil" >>> info {"student2": "Beth", "student4": "Dabric", "student1": "Alice", "student3": "Cec il", "student5": "Devil"} >>> info.setdefault("student2","Devil") "Beth" #update update方法可以利用一個(gè)字典項(xiàng)更新另外一個(gè)字典 >>> info {"student2": "Beth", "student4": "Dabric", "student1": "Alice", "student3": "Cec il", "student5": "Devil"} >>> b = {1:2,3:4,"student0":"ALICE"} >>> info.update(b) >>> info {"student2": "Beth", "student4": "Dabric", "student1": "Alice", "student3": "Cec il", "student5": "Devil", 1: 2, 3: 4, "student0": "ALICE"} #items items方法將字典所有的項(xiàng)返回 >>> info.items() dict_items([("student2", "Beth"), ("student4", "Dabric"), ("student1", "Alice"), ("student3", "Cecil"), ("student5", "Devil"), (1, 2), (3, 4), ("student0", "ALI CE")]) #通過一個(gè)列表生成默認(rèn)dict,有個(gè)沒辦法解釋的坑,少用吧這個(gè) >>> dict.fromkeys([1,2,3],"testd") {1: "testd", 2: "testd", 3: "testd"}
字典的遍歷
#方法1 for key in info: print(key,info[key]) #方法2 for k,v in info.items(): #會(huì)先把dict轉(zhuǎn)成list,數(shù)據(jù)大時(shí)莫用 print(k,v)
程序練習(xí)
程序: 三級(jí)菜單
要求:
打印省、市、縣三級(jí)菜單
可返回上一級(jí)
可隨時(shí)退出程序
menu = { "北京":{ "海淀":{ "五道口":{ "soho":{}, "網(wǎng)易":{}, "google":{} }, "中關(guān)村":{ "愛奇藝":{}, "汽車之家":{}, "youku":{}, }, "上地":{ "百度":{}, }, }, "昌平":{ "沙河":{ "老男孩":{}, "北航":{}, }, "天通苑":{}, "回龍觀":{}, }, "朝陽":{}, "東城":{}, }, "上海":{ "閔行":{ "人民廣場(chǎng)":{ "炸雞店":{} } }, "閘北":{ "火車戰(zhàn)":{ "攜程":{} } }, "浦東":{}, }, "山東":{}, } flag = True while flag: for i1 in menu: print(i1) choice1 = input("Please choose the province1>>:") if choice1 in menu: while flag: for i2 in menu[choice1]: print(" ",i2) choice2 = input("Please choose the province2>>:") if choice2 in menu[choice1]: while flag: for i3 in menu[choice1][choice2]: print(" ",i3) choice3 = input("Please choose the province3>>:") if choice3 in menu[choice1][choice2]: while flag: for i4 in menu[choice1][choice2][choice3]: print(" ",i4) choice4 = input("最后一層,按b返回上層,按q退出>>:") if choice4 == "b": break elif choice4 == "q": flag = False if choice3 == "b": break elif choice3 == "q": flag = False if choice2 == "b": break elif choice2 == "q": flag = False if choice1 == "b": break elif choice1 == "q": flag = False
集合是一個(gè)無序的,不重復(fù)的數(shù)據(jù)組合,它的主要作用如下:
去重,把一個(gè)列表變成集合,就自動(dòng)去重了
list_1 = [1,3,5,7,9,5] list_1 = set(list_1) print(list_1,type(list_1)) {1, 3, 5, 7, 9}
關(guān)系測(cè)試,測(cè)試兩組數(shù)據(jù)之間的交集、并集、差集等關(guān)系
1、基本操作t.add("x") # 添加一項(xiàng) s.update([10,37,42]) # 在s中添加多項(xiàng) 使用remove()可以刪除一項(xiàng): t.remove("H") len(s) set 的長度 x in s 測(cè)試 x 是否是 s 的成員 x not in s 測(cè)試 x 是否不是 s 的成員 s.copy() 返回 set “s”的一個(gè)淺復(fù)制2、關(guān)系測(cè)試(方法形式和符號(hào)形式)
交集
>>>list_1 = [1,3,5,7,9,5] >>>list_1 = set(list_1) >>>list_2 = set([6,2,4,7,8,9]) >>>print(list_1,list_2) {1, 3, 5, 7, 9} {2, 4, 6, 7, 8, 9} >>>list_3 = list_1.intersection(list_2) #或者list_3 = list_1 & list_2 >>>print(list_3) {9, 7}
并集
>>>list_3 = list_1.union(list_2) #或者list_3 = list_1 | list_2 >>>print(list_3) {1, 2, 3, 4, 5, 6, 7, 8, 9}
差集
>>>list_3 = list_1.difference(list_2) #或者list_3 = list_1 - list_2 >>>print(list_3) {1, 3, 5}
對(duì)稱差集
>>>list_3 = list_1.symmetric_difference(list_2) #或者list_3 = list_1 ^ list_2 >>>print(list_3) {1, 2, 3, 4, 5, 6, 8}
子集
>>>a = list_1.issubset(list_2) #判斷一個(gè)集合是否為另外一個(gè)集合的子集(list_1是否為list_2的子集),如果是返回值為真,否則為假 >>>print(a) False
父集
>>>a = list_1.issuperset(list_2) #判斷一個(gè)集合是否為另外一個(gè)集合的父集(list_1是否包含list_2),如果是返回值為真,否則為假 >>>print(a) False
對(duì)文件操作流程
1、打開文件,得到文件句柄并賦值給一個(gè)變量
2、通過句柄對(duì)文件進(jìn)行操作
3、關(guān)閉文件
1、打開文件要打開文件,可使用函數(shù)open,它位于自動(dòng)導(dǎo)入的模塊io中。函數(shù)open將文件名作為唯一必
不可少的參數(shù),并返回一個(gè)文件對(duì)象。如果當(dāng)前目錄中有一個(gè)名為somefile.txt的文本文件(可能
是使用文本編輯器創(chuàng)建的),則可像下面這樣打開它:
>>> f = open("somefile.txt")
文件模式:
r,只讀模式(默認(rèn))
w,只寫模式 (不可讀;文件不存在則創(chuàng)建;文件存在則既有內(nèi)容被刪除,并從文件開頭處開始寫入)
x,獨(dú)占寫入模式(在文件已經(jīng)存在時(shí)引發(fā)FileExistsError)
a,追加模式(可讀;文件不存在則創(chuàng)建;存在則在文件末尾追加寫入內(nèi)容)
"+"表示可以同時(shí)讀寫某個(gè)文件
r+,可讀寫文件(可讀;可寫;可追加。以讀和追加模式打開文件)
w+,寫讀(沒有文件先創(chuàng)建一個(gè)文件,有文件的話覆蓋原文件)
a+,追加讀寫
默認(rèn)模式為"rt",這意味著將把文件視為經(jīng)過編碼的Unicode文本,因此將自動(dòng)執(zhí)行解碼和編碼,且默認(rèn)使用UTF-8編碼。默認(rèn)情況下,行以"n"結(jié)尾。讀取時(shí)講自動(dòng)替換其他行尾字符("r"或"rn");寫入時(shí)講"n"替換為系統(tǒng)的默認(rèn)行尾字符(os.linesep);通過設(shè)置newline參數(shù)可指定只將"r"或"rn"視為合法的行尾字符,這樣,讀取時(shí)不會(huì)對(duì)行尾字符進(jìn)行轉(zhuǎn)換,但寫入時(shí)將把"n"替換為系統(tǒng)默認(rèn)的行尾字符。
"U"表示在讀取時(shí),可以將rnrn自動(dòng)轉(zhuǎn)換成n(與r或r+模式同時(shí)使用)
rU
r+U
"b"表示處理二進(jìn)制文件(如:FTP發(fā)送上傳ISO鏡像文件,linux可忽略,windows處理二進(jìn)制文件時(shí)需標(biāo)注)
rb
wb
ab
讀取和寫入
文件寫入
每當(dāng)調(diào)用f.write(string)時(shí),提供的字符串都將寫入到文件中既有內(nèi)容的后面
>>> f = open("somefile.txt", "w") >>> f.write("Hello, ") 7 >>> f.write("World!") 6 >>> f.close()
文件讀取
>>> f = open("somefile.txt", "r") >>> f.read(4) "Hell" >>> f.read() "o, World!" #首先,指定了要讀取多少(4)個(gè)字符。接下來,讀取了文件中余下的全部內(nèi)容(不指定要讀取多少個(gè)字符)。
讀取和寫入行
讀取行
readline 默認(rèn)返回一行的內(nèi)容,也可以指定返回幾個(gè)字符 readlines 讀取文件中的所有行,并以列表的方式返回
寫入行
writelines 與readlines相反:接受一個(gè)字符串列表(實(shí)際上,可以是任何序列或可迭代對(duì)象),并將這些字符串都寫入到文件(或流)中。 注意:寫入時(shí)不會(huì)添加換行符,因此必須自行添加。另外,沒有方法writeline,一次可以使用write
with語句
為了避免打開文件后忘記關(guān)閉,可以通過上下文管理器,即:
with open("somefile.txt") as somefile do_something(somefile)3、其他方法
flush
將內(nèi)存中的數(shù)據(jù)同步到磁盤上
進(jìn)度條的實(shí)現(xiàn) import sys,time for i in range(50): sys.stdout.write("#") sys.stdout.flush() time.sleep(0.1)
tell和seek
tell方法返回文件指針的位置,seek方法用來移動(dòng)文件指針的位置,一般兩個(gè)方法結(jié)合使用。
encoding
打印文件的編碼
fileno
返回文件句柄的編號(hào)。操作系統(tǒng)會(huì)有一個(gè)專門的接口負(fù)責(zé)調(diào)度所有的文件,該編號(hào)為系統(tǒng)中已經(jīng)打開文件的編號(hào)。
name
打印文件名
truncate
該方法如果不接任何參數(shù),則將文件中的內(nèi)容清空;如果接一個(gè)參數(shù)10,從文件指針位置開始截?cái)嗳〕鍪畟€(gè)字符并保存文件指針前的內(nèi)容。
一種常見的文件操作是迭代其內(nèi)容,并在迭代過程中反復(fù)采取某種措施。
每次一個(gè)字符(或字節(jié))
使用read遍歷字符
with open("yesterday",encoding="utf-8") as f: char = f.read(1) while char: sys.stdout.write(char) char = f.read(1) with open("yesterday", encoding="utf-8") as f: while True: char = f.read(1) if not char: break sys.stdout.write(char)
這個(gè)程序之所以可行,是因?yàn)榈竭_(dá)文件末尾時(shí),方法read將返回一個(gè)空字符串,但在此之前,返回的字符串都只包含一個(gè)字符(對(duì)應(yīng)于布爾值True)。
每次一行
with open (filename) as f: while True: line = f.readline() if not line: break print(line)
讀取文件所有內(nèi)容
如果文件不太大,可以讀取整個(gè)文件,利用下面兩種方法進(jìn)行讀取
with open(filename) as f: for char in f.read(): sys.stdout.write(char) with open(filename) as f: for line in f.readlines: print(line)
兩者的區(qū)別是read不提供任何參數(shù),將整個(gè)文件讀取到一個(gè)字符串中;readlines將文件讀取到一個(gè)字符串列表中,其中每個(gè)字符串都是一行。
使用fileinput實(shí)現(xiàn)延遲行迭代
延遲行迭代的方法:延遲是因?yàn)樗蛔x取實(shí)際需要的文本部分
import fileinput for line in fileinput.input(filename) print(line) # 模塊fileinput會(huì)負(fù)責(zé)打開文件,只需要給其提供一個(gè)文件名即可。
文件迭代器(最常見的方法)
文件實(shí)際上可迭代的(sys.stdin也是可迭代的),所以可以用下面的方法進(jìn)行讀取文件的內(nèi)容:
with open(filename) as f: for line in f: print(line)
1、在python2默認(rèn)編碼是ASCII, python3里默認(rèn)是unicode
2、unicode 分為 utf-32(占4個(gè)字節(jié)),utf-16(占兩個(gè)字節(jié)),utf-8(占1-4個(gè)字節(jié)), so utf-16就是現(xiàn)在最常用的unicode版本, 不過在文件里存的還是utf-8,因?yàn)閡tf8省空間
3、在py3中encode,在轉(zhuǎn)碼的同時(shí)還會(huì)把string 變成bytes類型,decode在解碼的同時(shí)還會(huì)把bytes變回string
轉(zhuǎn)碼過程如下圖:
in python2
#-*-coding:utf-8-*- import sys print(sys.getdefaultencoding()) msg = "我愛北京天安門" msg_gb2312 = msg.decode("utf-8").encode("gb2312") gb2312_to_gbk = msg_gb2312.decode("gbk").encode("gbk") print(msg) print(msg_gb2312) print(gb2312_to_gbk)
in python3
#-*-coding:gb2312 -*- #這個(gè)也可以去掉 import sys print(sys.getdefaultencoding()) msg = "我愛北京天安門" #msg_gb2312 = msg.decode("utf-8").encode("gb2312") msg_gb2312 = msg.encode("gb2312") #默認(rèn)就是unicode,不用再decode,喜大普奔 gb2312_to_unicode = msg_gb2312.decode("gb2312") gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8") print(msg) print(msg_gb2312) print(gb2312_to_unicode) print(gb2312_to_utf8)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42508.html
摘要:嘗射于家圃,有賣油翁釋擔(dān)而立,睨之,久而不去??得C問曰汝亦知射乎吾射不亦精乎翁曰無他,但手熟爾??得C忿然曰爾安敢輕吾射翁曰以我酌油知之。 開啟變身模式 大家好, 從這一期開始,我們會(huì)從小白變身為中等小白,在基礎(chǔ)起步階段有太多的東西我沒有講到,但是俗話說的好,無他,但手熟爾,只要多多練習(xí),時(shí)間會(huì)是最好的證明,相信我們終有一天會(huì)成為高手,因此從這一系列開始,讓我們一起更上一層樓,還是和往常...
前情回顧 大家好,我又回來了。今天我會(huì)繼續(xù)和大家分享itertools這個(gè)神奇的自帶庫,首先,讓我們回顧一下上一期結(jié)尾的時(shí)候我們講到的3個(gè)方法: combinations() combinations_with_replacement() permutations() 讓我們對(duì)這3個(gè)在排列組合中經(jīng)常會(huì)使用到的函數(shù)做個(gè)總結(jié) combinations() 基礎(chǔ)概念 模板:combinations...
前言 最近,我在群里答疑的時(shí)候,經(jīng)常碰到,小伙伴,再變量,縮進(jìn),參數(shù),方面使用錯(cuò)誤,導(dǎo)致程序運(yùn)行不來。 今天,打算自己寫一篇。 Python 變量作用域,和生命周期。 徹底弄懂變量該怎么使用。 知識(shí)點(diǎn) 變量的使用,有作用域區(qū)別,也有生命周期的區(qū)別。 1.變量作用域 局部變量 python能夠影響變量作用域的代碼段是def、class、lamda。 def scopeTest(): local...
摘要:然而為了讓我們更方便的使用這個(gè)常用功能,語言本身也在對(duì)字符串格式化方法進(jìn)行迭代。不少使用過的小伙伴會(huì)知道其中的模板字符串,采用直接在字符串中內(nèi)嵌變量的方式進(jìn)行字符串格式化操作,在版本中也為我們帶來了類似的功能字面量格式化字符串,簡(jiǎn)稱。 字符串格式化對(duì)于每個(gè)語言來說都是一個(gè)非?;A(chǔ)和常用的功能,學(xué)習(xí)Python的同學(xué)大概都知道可以用%語法來格式化字符串。然而為了讓我們更方便的使用這個(gè)常用...
摘要:另外,這些中的每一個(gè)都是純函數(shù),有返回值。例如,如果要計(jì)算整數(shù)列表的累積乘,或者求和等等基礎(chǔ)語法參數(shù)是連續(xù)作用于每一個(gè)元素的方法,新的參數(shù)為上一次執(zhí)行的結(jié)果,為被過濾的可迭代序列返回值最終的返回結(jié)果在中,是一個(gè)內(nèi)置函數(shù)。 簡(jiǎn)潔的內(nèi)置函數(shù) 大家好,我又回來了,今天我想和大家分享的是Python非常重要的幾個(gè)內(nèi)置函數(shù):map,filter,reduce, zip。它們都是處理序列的便捷函數(shù)...
閱讀 3610·2023-04-25 14:35
閱讀 3463·2021-11-15 18:00
閱讀 2797·2021-11-12 10:34
閱讀 2558·2021-11-11 16:54
閱讀 3531·2021-10-08 10:12
閱讀 2802·2021-09-06 15:02
閱讀 3371·2021-09-04 16:48
閱讀 2853·2019-08-29 14:02