第9課:常用內置模塊進階
課程目標
- 深入學習Python常用內置模塊
- 掌握collections、itertools、functools等模塊
- 學習json、csv、pickle等數據處理模塊
1. collections模塊
1.1 Counter類
from collections import Counter# 統計元素出現次數
text = "hello world python programming"
char_count = Counter(text)
print("字符統計:", char_count)# 統計單詞出現次數
words = text.split()
word_count = Counter(words)
print("單詞統計:", word_count)# 獲取最常見的元素
print("最常見的3個字符:", char_count.most_common(3))
1.2 defaultdict類
from collections import defaultdict# 默認字典,自動創建默認值
d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(3)
print("defaultdict:", dict(d))# 統計單詞首字母
words = ['apple', 'banana', 'apricot', 'blueberry']
letter_words = defaultdict(list)
for word in words:letter_words[word[0]].append(word)
print("按首字母分組:", dict(letter_words))
1.3 namedtuple類
from collections import namedtuple# 創建命名元組
Point = namedtuple('Point', ['x', 'y'])
p1 = Point(3, 4)
p2 = Point(6, 8)print(f"點1: ({p1.x}, {p1.y})")
print(f"點2: ({p2.x}, {p2.y})")# 創建學生記錄
Student = namedtuple('Student', ['name', 'age', 'grade'])
students = [Student('張三', 20, 85),Student('李四', 19, 92),Student('王五', 21, 78)
]for student in students:print(f"{student.name}: {student.age}歲,成績{student.grade}")
2. itertools模塊
2.1 無限迭代器
import itertools# 無限計數
counter = itertools.count(1, 2) # 從1開始,步長為2
print("前5個偶數:")
for i, num in enumerate(counter):if i >= 5:breakprint(num, end=" ")
print()# 無限循環
cycle_items = itertools.cycle(['A', 'B', 'C'])
print("循環前10次:")
for i, item in enumerate(cycle_items):if i >= 10:breakprint(item, end=" ")
print()
2.2 組合迭代器
import itertools# 排列
items = ['a', 'b', 'c']
permutations = list(itertools.permutations(items, 2))
print("2個元素的排列:", permutations)# 組合
combinations = list(itertools.combinations(items, 2))
print("2個元素的組合:", combinations)# 笛卡爾積
colors = ['紅', '藍']
sizes = ['S', 'M', 'L']
products = list(itertools.product(colors, sizes))
print("顏色和尺寸的笛卡爾積:", products)
3. functools模塊
3.1 partial函數
from functools import partial# 創建偏函數
def greet(greeting, name):return f"{greeting}, {name}!"hello = partial(greet, "Hello")
goodbye = partial(greet, "Goodbye")print(hello("張三"))
print(goodbye("李四"))
3.2 reduce函數
from functools import reduce# 計算列表元素的和
numbers = [1, 2, 3, 4, 5]
total = reduce(lambda x, y: x + y, numbers)
print(f"總和: {total}")# 計算列表元素的最大值
max_num = reduce(lambda x, y: x if x > y else y, numbers)
print(f"最大值: {max_num}")# 階乘計算
def factorial(n):return reduce(lambda x, y: x * y, range(1, n + 1))print(f"5的階乘: {factorial(5)}")
4. json模塊
4.1 基本操作
import json# Python對象轉JSON字符串
data = {'name': '張三','age': 25,'city': '北京','skills': ['Python', 'Java', 'SQL'],'married': False,'salary': None
}json_string = json.dumps(data, ensure_ascii=False, indent=2)
print("JSON字符串:")
print(json_string)# JSON字符串轉Python對象
parsed_data = json.loads(json_string)
print("\n解析后的數據:")
print(f"姓名: {parsed_data['name']}")
print(f"技能: {', '.join(parsed_data['skills'])}")# 寫入JSON文件
with open('data.json', 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=2)
5. csv模塊
5.1 讀寫CSV文件
import csv# 寫入CSV文件
students = [['姓名', '年齡', '成績', '城市'],['張三', 20, 85, '北京'],['李四', 19, 92, '上海'],['王五', 21, 78, '廣州']
]with open('students.csv', 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerows(students)print("CSV文件寫入完成")# 讀取CSV文件
with open('students.csv', 'r', encoding='utf-8') as f:reader = csv.reader(f)for row in reader:print(row)
6. 練習項目
項目:數據分析工具
from collections import Counter, defaultdict
import json
import csvclass DataAnalyzer:def __init__(self):self.data = []def load_from_csv(self, filename):"""從CSV文件加載數據"""with open(filename, 'r', encoding='utf-8') as f:reader = csv.DictReader(f)self.data = list(reader)print(f"從{filename}加載了{len(self.data)}條數據")def analyze_numeric_field(self, field_name):"""分析數值字段"""values = [float(item[field_name]) for item in self.data if item[field_name].replace('.', '').isdigit()]if not values:return Noneanalysis = {'count': len(values),'sum': sum(values),'average': sum(values) / len(values),'min': min(values),'max': max(values)}return analysisdef analyze_categorical_field(self, field_name):"""分析分類字段"""values = [item[field_name] for item in self.data if item[field_name]]counter = Counter(values)analysis = {'unique_count': len(counter),'most_common': counter.most_common(5),'total_count': len(values)}return analysisdef group_by_field(self, group_field, value_field):"""按字段分組統計"""grouped_data = defaultdict(list)for item in self.data:if item[group_field] and item[value_field]:try:value = float(item[value_field])grouped_data[item[group_field]].append(value)except ValueError:continue# 計算每組的統計信息group_stats = {}for group, values in grouped_data.items():group_stats[group] = {'count': len(values),'average': sum(values) / len(values),'min': min(values),'max': max(values)}return group_statsdef main():"""主程序"""print("=== 數據分析工具 ===")analyzer = DataAnalyzer()# 創建示例數據sample_data = [{'姓名': '張三', '年齡': 25, '工資': 8000, '部門': '技術部', '城市': '北京'},{'姓名': '李四', '年齡': 30, '工資': 12000, '部門': '技術部', '城市': '上海'},{'姓名': '王五', '年齡': 28, '工資': 10000, '部門': '銷售部', '城市': '廣州'},{'姓名': '趙六', '年齡': 35, '工資': 15000, '部門': '管理部', '城市': '北京'}]# 保存示例數據到CSVwith open('sample_data.csv', 'w', newline='', encoding='utf-8') as f:fieldnames = ['姓名', '年齡', '工資', '部門', '城市']writer = csv.DictWriter(f, fieldnames=fieldnames)writer.writeheader()writer.writerows(sample_data)print("示例數據已保存到sample_data.csv")# 加載數據analyzer.load_from_csv('sample_data.csv')# 分析數值字段print("\n=== 年齡分析 ===")age_analysis = analyzer.analyze_numeric_field('年齡')if age_analysis:print(f"年齡統計: {age_analysis}")print("\n=== 工資分析 ===")salary_analysis = analyzer.analyze_numeric_field('工資')if salary_analysis:print(f"工資統計: {salary_analysis}")# 分析分類字段print("\n=== 部門分析 ===")dept_analysis = analyzer.analyze_categorical_field('部門')if dept_analysis:print(f"部門統計: {dept_analysis}")# 分組分析print("\n=== 按部門分組分析工資 ===")dept_salary = analyzer.group_by_field('部門', '工資')for dept, stats in dept_salary.items():print(f"{dept}: {stats}")if __name__ == "__main__":main()
7. 總結
本節課我們學習了:
- collections模塊的高級數據結構
- itertools模塊的迭代器工具
- functools模塊的函數工具
- json、csv等數據處理模塊
- 編寫了數據分析工具
8. 下節課預告
下節課我們將學習:
- 第三方庫的安裝和使用
- 項目實戰練習
- Python編程最佳實踐