一、前言
接下來通過一些習題練習下代碼感,以及熟悉解題思路和基本函數使用,參考博客:https://www.cnblogs.com/poloyy/p/15255670.html
二、習題實戰
1、open函數、字典.items()、with open() as f 、f格式化字符串
題目1:
有一個數據list of dict如下 lists = [ {"test1": "1111"}, {"test2": "2222"}, ] 寫入到本地一個txt文件,內容格式如下: test1,1111 test2,2222
答案:
''' 解題思路: 打開文件 循環列表,提取字典 提取key,value 寫入文件 ''' lists = [ {"test1": "1111"}, {"test2": "2222"}, ] with open("test.txt","w+",encoding="utf-8") as f: for i in lists: for key,value in i.items(): # python的字符串前面加f表示格式化字符串,加f後可以在字符串裏面使用用花括號括起來的變量和表達式 f.write(f"{key},{value}\n")
1)open() 函數的語法爲:
f = open(file, mode, encoding)
file:表示要保存或要打開的文件的路徑,可以是相對路徑,也可以是絕對路徑。
mode:表示數據以何種方式打開、寫入文本。
encoding:指定了文件的編碼方式。
2)字典 items() 函數
該函數是以列表返回可遍歷的(鍵, 值) 元組數組,可以用於 for 來循環遍歷;items() 方法把字典中每對 key 和 value 組成一個元組,並把這些元組放在列表中返回。
--使用語法:dict.items()
--返回值:返回列表
3)with open() as f
在操作文件完成之後,需要調用close()方法關閉文件。因爲文件對象會佔用操作系統的資源,並且操作系統同一時間能打開的文件數量也是有限的。由於文件讀寫時有可能產生IOError,一旦出錯,後面的f.close()就不會調用。所以,爲了保證無論是否出錯都能正確地關閉文件,我們可以使用try ... finally通過捕捉異常、處理異常來實現。如果能保證文件打開沒有異常的情況下,我們每次都這麼寫,實在太繁瑣。所以,Python引入了with語句來自動幫我們調用close()方法。也就是說:文件讀取的這個操作,只有在with語句內部纔會生效,不會離開。
語法:
with
open
(文件名, 模式) as 文件對象:
文件對象.方法()
4)f格式化字符串:
python的字符串前面加f表示格式化字符串,加f後可以在字符串裏面使用用花括號括起來的變量和表達式
2、列表index()、列表append()、len()函數、range()函數
題目2:
a = [1, 2, 3, 4, 5] b = ["a", "b", "c", "d", "e"] 如何得出c = ["a1", "b2", "c3", "d4", "e5"]
答案:
''' 解題思路: a、b兩個列表長度一致,獲取長度 一個for循環,每次獲取同下標值 字符串拼接,添加到c列表 ''' a = [1,2,3,4,5] b = ["a","b","c","d","e"] c = [] # 方案一 for i in a: # 循環a列表,1-5 inx = a.index(i) # a.index(1),用index函數獲取值1在a列表的位置:0,即inx=0 # 循環後inx輸出結果爲:0 1 2 3 4 d = b[inx] # 直接用下標獲取b列表值,比如b[0]即等於"a" # 循環後d輸出的結果爲:a b c d e if d != -1: # d != -1 判斷是起到什麼作用?如果b[inx]不存在,那麼d=-1 c.append(f"{d}{i}") print(c) # 方案二 e = [] for i in range(0,len(a)): # a的len=5,range(0,5) 輸出結果爲[0,1,2,3,4] ,i從range範圍循環,即i從0-4循環 a1 = a[i] # a[0]=1 b1 = b[i] # b[0]=a e.append(f"{b1}{a1}") print(e)
1)列表index()
index()方法搜索列表中的元素並返回其索引值,注意: Python中的索引從0開始,而不是1。還有 index() 方法僅返回值的首次出現
fruits = ['apple', 'banana', 'cherry'] x = fruits.index("cherry")
值 "cherry" 的位置是:2
2)列表append()
append() 函數可以向列表末尾添加元素。語法:list.append(element),
- element:任何類型的元素,比如普通類型:數值、字符串,集合類型:元組(1,2,3)、列表[a,c,b]
- 使用 append() 函數添加列表時,是添加列表的「引用地址」而不是添加列表內容,當被添加的列表發生變化時,添加後的列表也會同步發生變化。
3)len()函數
1:作用:返回字符串、列表、字典、元組等長度
2:語法:len(str)
3:參數:
str:要計算的字符串、列表、字典、元組等
4:返回值:字符串、列表、字典、元組等元素的長度
4)range()函數
range()函數:用於生成一個整數序列,打印時 print(list(a))
range()的三種創建方式:
第一種:只有一個參數(小括號中只給了一個數)即range(stop) ,比如range(10),指的是默認從0開始,步長爲1,不包括10,則輸出[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
第二種:range(start,stop) (給了兩個參數,即小括號中給了兩個數),比如range(1,10),則輸出[1, 2, 3, 4, 5, 6, 7, 8, 9]
第三種:range(start,stop,step):創建一個在[start,stop)之間,步長爲step; 比如range(1,10,2),則輸出[1, 3, 5, 7, 9]
range()函數中可以使用in 和not in 判斷整數序列中是否存在(不存在)指定的整數,例如:
在上面第三種的基礎上 print(10 in r) 運行結果爲False; print(9 in r)運行結果爲True ;print(10 not in r)運行結果爲True;print(9 not in r)的運行結果爲False;
range類型的優點:不管range對象表示的整數序列有多長,所有range對象佔用的內存空間都是相同的,因爲僅僅需要儲存start,stop,step,只有當用到range對象時,纔會去計算序列中的相關元素
3、split()函數、正則表達式re模式re.findall()函數
題目3:
寫一個小程序:控制檯輸入郵箱地址(格式爲 [email protected]), 程序識別用戶名和公司名後,將用戶名和公司名輸出到控制檯。 要求: 1. 校驗輸入內容是否符合規範([email protected]), 如是進入下一步,如否則拋出提 示"incorrect email format"。注意必須以.com 結尾 2. 可以循環“輸入--輸出判斷結果”這整個過程 3. 按字母 Q(不區分大小寫)退出循環,結束程序
答案:
''' 解題思路: 固定以.com結尾,用正則匹配 以 @ 和 . 分割字符串 提取username和companyname ''' import re while True: email = input("請輸入郵箱:") if email.upper() == "Q": # upper() 方法將字符串中的小寫字母轉爲大寫字母 break # 若用戶輸入字母Q或q,則中斷退出 # findall(pattern, string, flags=0),返回string中所有與pattern匹配的全部字串,返回形式爲數組 # 用$符號表示以.com結尾的字符串返回,判斷是否字符串結束的字符串 res = re.findall(".com$", email) # 輸出結果爲:['.com'] if not res: print("incorrect email format") else: temp = email.split("@") # 若用戶輸入[email protected],則輸出結果爲['11', 'qq.com'] name = temp[0] com = temp[1].split(".")[0] print(f"username:{name} , companyName:{com}") # 輸出結果爲 username:11 , companyName:qq
1)split()函數
split() 通過指定分隔符對字符串進行切片。返回值:返回分割後的字符串列表。
2)re.findall()函數
findall(pattern,string,flags=0)返回string中所有與pattern匹配的全部字符串,返回形式爲數組。
re.search()返回的是匹配的字符串,只匹配第一個;re.findall()匹配上幾個就返回幾個,用數組形式返回。
import re str = 'aabbabaabbaa' # 一個"."就是匹配除 \n (換行符)以外的任意一個字符 print(re.findall(r'a.b', str)) # ['aab', 'aab'] # *前面的字符出現0次或以上 print(re.findall(r'a*b', str)) # ['aab', 'b', 'ab', 'aab', 'b'] # 貪婪,匹配從.*前面爲開始到後面爲結束的所有內容 print(re.findall(r'a.*b', str)) # ['aabbabaabb'] # 非貪婪,遇到開始和結束就進行截取,因此截取多次符合的結果,中間沒有字符也會被截取 print(re.findall(r'a.*?b', str)) # ['aab', 'ab', 'aab'] # 非貪婪,與上面一樣,只是與上面的相比多了一個括號,只保留括號的內容 print(re.findall(r'a(.*?)b', str)) # ['a', '', 'a'] str = '''aabbab aabbaa bb''' # 後面多加了2個b # 沒有把最後一個換行的aab算進來 print(re.findall(r'a.*?b', str)) # ['aab', 'ab', 'aab'] # re.S不會對\n進行中斷 print(re.findall(r'a.*?b', str, re.S)) # ['aab', 'ab', 'aab', 'aa\n b']