上一節中全面講解了基礎知識,為了鞏固知識點,當然最好的方法就是練習了。
練習 1:變量類型轉換與算術運算
需求:接收用戶輸入的兩個數字(可能是整數或字符串格式),轉換為浮點數后計算 “冪運算、整除、取余” 結果,并打印類型信息。
def main():num1_str = input("first number:")num2_str = input("second number:")fnum1 = float(num1_str)fnum2 = float(num2_str)pow_result = fnum1 ** fnum2div_result = fnum1 // fnum2mod_result = fnum1 % fnum2# 打印結果與類型print(f"\n{fnum1} 的 {fnum2} 次冪:{pow_result},類型:{type(pow_result)}")print(f"{fnum1} 整除 {fnum2}:{div_result},類型:{type(div_result)}")print(f"{fnum1} 取余 {fnum2}:{mod_result},類型:{type(mod_result)}")if __name__ == "__main__":main()
結果:
練習 2:多條件判斷與循環
需求:遍歷 1~20 的整數,按以下規則分類打印:
能被 3 和 5 同時整除:打印 “[數字] 是 3 和 5 的倍數”
能被 3 整除:打印 “[數字] 是 3 的倍數”
能被 5 整除:打印 “[數字] 是 5 的倍數”
其余數字:打印 “[數字] 不是目標倍數”
def main():for i in range(1,21):if i % 3 == 0 and i %5 == 0:print(f"[{i}] 是 3 和 5 的倍數")elif i %3 == 0:print(f"[{i}] 是 3 的倍數")elif i % 5 == 0:print(f"[{i}] 是 5 的倍數")else:print(f"[{i}] 不是目標倍數")if __name__ == "__main__":main()
結果:
練習 3:可變參數與多返回值
需求:定義一個函數,接收 “固定參數(商品基礎價)+ 可變位置參數(折扣比例列表)+ 可變關鍵字參數(額外費用,如運費、服務費)”,計算并返回 “最低折扣價、最高折扣價、最終總價(基礎價 × 折扣 + 額外費用總和)”。
def calculate_price(base_price,*discount,**extra_fees):# 計算最低/最高折扣價min_discount_price = base_price * min(discount)max_discount_price = base_price * max(discount)# 計算額外費用總和(關鍵字參數的value求和)total_extra = sum(extra_fees.values())# 計算最終總價(取最低折扣價+額外費用)final_price = min_discount_price + total_extra# 多返回值(實際返回元組)return min_discount_price, max_discount_price, final_priceif __name__ == "__main__":min_p,max_p,final_p = calculate_price(100,0.8,0.9,ship = 10,servce=5)# 打印結果print(f"基礎價:100 元")print(f"最低折扣價:{min_p:.2f} 元")print(f"最高折扣價:{max_p:.2f} 元")print(f"最終總價(最低折扣+額外費用):{final_p:.2f} 元")
結果:
練習 4:函數裝飾器
需求:定義一個 “計時裝飾器”,用于統計任意函數的執行時間,并打印 “函數名、參數、返回值、執行耗時”。
import timeimport time# 定義計時裝飾器
def time_decorator(func):def wrapper(*args, **kwargs):# 執行前:記錄開始時間start_time = time.time()# 調用原函數,獲取返回值result = func(*args, **kwargs)# 執行后:計算耗時,打印信息end_time = time.time()cost_time = (end_time - start_time) * 1000 # 轉換為毫秒print(f"\n=== 函數執行報告 ===")print(f"函數名:{func.__name__}")print(f"位置參數:{args}")print(f"關鍵字參數:{kwargs}")print(f"返回值:{result}")print(f"執行耗時:{cost_time:.2f} 毫秒")return resultreturn wrapper# 使用裝飾器裝飾目標函數(計算1到n的和)
@time_decorator
def sum_to_n(n):total = 0for i in range(1, n+1):total += ireturn totalif __name__ == "__main__":sum_result = sum_to_n(100000)print(f"\n1到100000的和:{sum_result}")sum_result = sum_to_n(1000000)print(f"\n1到100000的和:{sum_result}")
結果:
練習 5:列表與字典操作
需求:
用列表存儲 5 個學生的姓名和成績(格式:["張三:90", "李四:85", ...])
將列表轉換為字典(鍵:姓名,值:成績)
篩選出成績≥85 的學生,按成績降序排序并打印
def main():students = ["張三:88","李四:66","王五:99","趙六:66","二蛋:85"]#2.轉換為字典score_dict = {}for text in students:key,value = text.split(":")score_dict[key] = int(value)high_score_student = [(name,score) for name,score in score_dict.items() if score >= 85]print(high_score_student)sorted_student = sorted(high_score_student,key = lambda x :x[1],reverse = True)print(sorted_student)if __name__ == "__main__":main()
結果:
練習 6:集合運算
需求:已知兩個集合(A:數學滿分學生,B:語文滿分學生),計算 “兩科都滿分(交集)、至少一科滿分(并集)、僅數學滿分(差集)” 的學生名單。
def main():# 定義兩個集合math_full = {"張三", "李四", "趙六"} # 數學滿分chinese_full = {"李四", "王五", "孫七"} # 語文滿分# 集合運算both_full = math_full & chinese_full # 交集:兩科都滿分any_full = math_full | chinese_full # 并集:至少一科滿分only_math = math_full - chinese_full # 差集:僅數學滿分# 打印結果print("數學滿分學生:", math_full)print("語文滿分學生:", chinese_full)print("兩科都滿分學生:", both_full)print("至少一科滿分學生:", any_full)print("僅數學滿分學生:", only_math)if __name__ == "__main__":main()
結果:
練習 7:字符串格式化與常用方法
需求:接收用戶輸入的 “姓名、年齡、身高(cm)”,按以下格式輸出個人信息,并統計 “姓名長度、身高是否≥170cm”:
def main():# 接收用戶輸入name = input("請輸入姓名:")age_str = input("請輸入年齡:")height_str = input("請輸入身高(cm):")# 數據處理:年齡轉整數,身高轉整數age = int(age_str)height = int(height_str)# 字符串格式化(f-string)info = f"""【個人信息卡】
姓名:{name}(長度:{len(name)}字)
年齡:{age}歲(明年:{age+1}歲)
身高:{height}cm(是否達標:{'是' if height >= 170 else '否'})"""# 打印結果print(info)if __name__ == "__main__":main()
結果:
練習 8:文件讀寫與內容統計
需求:
向 “student.txt” 文件寫入 3 行學生信息(格式:姓名,年齡,成績)
讀取文件內容,統計 “平均成績、最高成績及對應姓名”
將統計結果追加到文件末尾
def file_read_write_demo():# 1. 寫入文件(覆蓋模式,若文件不存在則創建)with open("student.txt", "w", encoding="utf-8") as f:f.write("張三,20,90\n")f.write("李四,19,85\n")f.write("趙六,21,95\n")print("已寫入學生信息到 student.txt")# 2. 讀取文件并統計names = []scores = []with open("student.txt", "r", encoding="utf-8") as f:for line in f:line = line.strip() # 去除換行符和空格if not line:continue # 跳過空行name, age_str, score_str = line.split(",")names.append(name)scores.append(int(score_str))# 計算統計結果avg_score = sum(scores) / len(scores)max_score = max(scores)max_score_name = names[scores.index(max_score)]# 3. 追加統計結果到文件with open("student.txt", "a", encoding="utf-8") as f:f.write("\n=== 成績統計結果 ===\n")f.write(f"平均成績:{avg_score:.1f}\n")f.write(f"最高成績:{max_score}({max_score_name})\n")print("已追加統計結果到 student.txt")# 驗證:讀取文件全部內容并打印with open("student.txt", "r", encoding="utf-8") as f:content = f.read()print("\n文件全部內容:")print(content)# 調用函數
file_read_write_demo()
結果:
練習 9:類的繼承與多態
需求:
定義父類 “Animal”,包含 “name” 屬性和 “make_sound” 方法(純虛函數風格)
定義子類 “Dog”“Cat”“Bird”,重寫 “make_sound” 方法(分別輸出 “汪汪”“喵喵”“嘰嘰”)
定義函數 “animal_sound_show”,接收任意 Animal 對象,調用其 “make_sound” 方法(多態)
class Animal:def __init__(self, name):self.name = name # 公開屬性def make_sound(self):# 父類方法:子類需重寫raise NotImplementedError("子類必須重寫 make_sound 方法")# 子類1:Dog
class Dog(Animal):def make_sound(self):print(f"{self.name} 叫:汪汪汪!")# 子類2:Cat
class Cat(Animal):def make_sound(self):print(f"{self.name} 叫:喵喵喵!")# 子類3:Bird
class Bird(Animal):def make_sound(self):print(f"{self.name} 叫:嘰嘰嘰!")# 多態函數:接收任意Animal子類對象
def animal_sound_show(animal):if isinstance(animal, Animal): # 檢查是否為Animal類型animal.make_sound()else:print("不是有效的Animal對象!")# 測試:創建對象并調用多態函數
dog = Dog("大黃")
cat = Cat("小白")
bird = Bird("啾啾")animal_sound_show(dog)
animal_sound_show(cat)
animal_sound_show(bird)
# 測試無效對象
animal_sound_show("不是動物")
練習 10:特性(property)與訪問控制
需求:定義 “Person” 類,用 “特性” 控制 “age” 屬性:
年齡必須是 0~150 的整數,否則報錯
提供 “get_age”(獲取年齡)和 “set_age”(設置年齡)的邏輯,外部通過 “p.age” 直接訪問
class Person:def __init__(self, name, age):self.name = name# 初始化時調用setter,確保年齡合法self.age = age# 特性:getter(獲取年齡)@propertydef age(self):return self._age # _age 是約定的私有變量# 特性:setter(設置年齡,帶驗證)@age.setterdef age(self, value):# 驗證:必須是整數,且在0~150之間if not isinstance(value, int):raise TypeError("年齡必須是整數!")if value < 0 or value > 150:raise ValueError("年齡必須在 0~150 之間!")self._age = value# 測試:正常情況
p1 = Person("張三", 25)
print(f"{p1.name} 的年齡:{p1.age}")# 測試:修改年齡(合法)
p1.age = 30
print(f"{p1.name} 修改后的年齡:{p1.age}")# 測試:非法情況(觸發異常,可注釋后運行)
# p2 = Person("李四", "20") # 類型錯誤
# p3 = Person("王五", 200) # 值錯誤
結果:
練習 11:自定義模塊調用
需求:
創建自定義模塊 “math_tools.py”,包含 “add(加法)、multiply(乘法)、is_prime(判斷質數)” 三個函數
在主腳本中導入該模塊,調用函數并測試
步驟 1:創建模塊文件 “math_tools.py”
# math_tools.py(自定義模塊)
def add(a, b):"""加法運算"""return a + bdef multiply(a, b):"""乘法運算"""return a * bdef is_prime(n):"""判斷n是否為質數(質數:大于1的整數,僅能被1和自身整除)"""if n <= 1:return Falseif n == 2:return Trueif n % 2 == 0:return False# 檢查3到sqrt(n)的奇數for i in range(3, int(n**0.5) + 1, 2):if n % i == 0:return Falsereturn True
步驟 2:主腳本調用模塊
# 主腳本 main.py
# 導入自定義模塊(三種方式任選)
import math_tools as mt
from math_tools import is_prime# 測試加法
print("3 + 5 =", mt.add(3, 5))# 測試乘法
print("4 × 6 =", mt.multiply(4, 6))# 測試質數判斷
test_nums = [7, 12, 17, 20]
for num in test_nums:print(f"{num} 是質數嗎?", is_prime(num))
結果:
練習 12:多線程與鎖同步
需求:創建 3 個線程,共享 “計數器” 變量,每個線程對計數器累加 1000 次,用鎖確保計數器最終結果正確(避免競態條件)。
import threading
import time
num =0
lock = threading.Lock()def increment_counter(thread_name):global numfor _ in range(1000):with lock:num+=1time.sleep(0.001)print(f"線程 {thread_name} 執行完畢,當前計數器:{num}")thread1 = threading.Thread(target=increment_counter,args=("thread1",))
thread2 = threading.Thread(target=increment_counter,args=("thread2",))
thread3 = threading.Thread(target=increment_counter,args=("thread3",))thread1.start()
thread2.start()
thread3.start()# 等待所有線程結束
thread1.join()
thread2.join()
thread3.join()print(f"\n所有線程執行完畢,最終計數器:{num}")
結果: