Python - 習題練習(1-3)

一、前言

  接下來通過一些習題練習下代碼感,以及熟悉解題思路和基本函數使用,參考博客: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 文件對象:

文件對象.方法()
由此可見:with自帶回收機制,代碼更加簡潔、優美,不必調用close()方法。

 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']


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章