引言:为什么选择Python作为你的编程起点
Python作为一种高级编程语言,凭借其简洁的语法、强大的生态系统和广泛的应用领域,已经成为全球最受欢迎的编程语言之一。无论你是完全的编程新手,还是希望从其他语言转向Python的开发者,本指南都将为你提供系统化的学习路径和实用的编程技巧。
Python的核心优势在于其可读性和多功能性。与其他编程语言相比,Python的语法更接近自然语言,这使得初学者能够更快地理解和编写代码。同时,Python在数据科学、人工智能、Web开发、自动化脚本、网络爬虫等众多领域都有着出色的表现,这为学习者提供了广阔的就业和发展空间。
Python基础语法详解
变量与数据类型
Python是动态类型语言,这意味着你不需要显式声明变量的类型。Python会根据赋值的值自动推断类型。让我们通过具体的例子来理解Python的基本数据类型:
# 整数类型
age = 25
student_count = 100
# 浮点数类型
height = 1.75
price = 99.99
# 字符串类型
name = "张三"
message = 'Hello, Python!'
# 布尔类型
is_student = True
is_active = False
# 列表(可变序列)
fruits = ["苹果", "香蕉", "橙子"]
numbers = [1, 2, 3, 4, 5]
# 字典(键值对)
person = {
"name": "李四",
"age": 30,
"city": "北京"
}
# 元组(不可变序列)
coordinates = (10.0, 20.0)
colors = ("红", "绿", "蓝")
# 集合(无序不重复元素)
unique_numbers = {1, 2, 3, 4, 5}
运算符与表达式
Python支持多种运算符,包括算术运算符、比较运算符、逻辑运算符等:
# 算术运算符
a = 10
b = 3
print(f"a + b = {a + b}") # 13
print(f"a - b = {a - b}") # 7
print(f"a * b = {a * b}") # 30
print(f"a / b = {a / b}") # 3.333...
print(f"a // b = {a // b}") # 3(整除)
print(f"a % b = {a % b}") # 1(取模)
print(f"a ** b = {a ** b}") # 1000(幂运算)
# 比较运算符
x = 5
y = 10
print(f"x > y: {x > y}") # False
print(f"x <= y: {x <= y}") # True
print(f"x == y: {x == y}") # False
print(f"x != y: {x != y}") # True
# 逻辑运算符
is_raining = True
has_umbrella = False
print(f"下雨且没伞: {is_raining and not has_umbrella}") # True
print(f"下雨或没伞: {is_raining or not has_umbrella}") # True
控制流结构
条件语句
条件语句允许程序根据不同的条件执行不同的代码块:
# 基本的if-elif-else结构
def check_temperature(temp):
if temp > 30:
return "天气炎热,注意防暑"
elif temp > 20:
return "天气舒适,适合户外活动"
elif temp > 10:
return "天气凉爽,建议携带外套"
else:
return "天气寒冷,注意保暖"
# 实际应用:成绩评级系统
def grade_score(score):
if score >= 90:
return "A"
elif score >= 80:
return "B"
elif score >= 70:
return "C"
elif score >= 60:
return "D"
else:
return "E"
# 嵌套条件语句
def can_vote(age, is_citizen):
if is_citizen:
if age >= 18:
return "您有投票权"
else:
return "您年龄未满18岁"
else:
return "您不是公民,没有投票权"
循环结构
Python提供了for循环和while循环两种主要的循环结构:
# for循环的基本用法
# 遍历列表
fruits = ["苹果", "香蕉", "橙子"]
for fruit in fruits:
print(f"我喜欢吃{fruit}")
# 使用range函数
for i in range(5): # 0,1,2,3,4
print(f"当前数字: {i}")
# 带索引的遍历(使用enumerate)
for index, fruit in enumerate(fruits):
print(f"第{index + 1}个水果: {fruit}")
# 字典遍历
student_scores = {"张三": 85, "李四": 92, "王五": 78}
for name, score in student_scores.items():
print(f"{name}的成绩是{score}分")
# while循环示例
count = 0
while count < 5:
print(f"计数器: {count}")
count += 1
# break和continue的使用
# break:立即终止循环
for i in range(10):
if i == 5:
break
print(i) # 输出0,1,2,3,4
# continue:跳过当前迭代,继续下一次
for i in range(5):
if i == 2:
continue
print(i) # 输出0,1,3,4
# 实际应用:猜数字游戏
import random
def guess_number():
secret_number = random.randint(1, 100)
attempts = 0
while True:
try:
guess = int(input("请输入1-100之间的数字: "))
attempts += 1
if guess < secret_number:
print("猜小了!")
elif guess > secret_number:
print("猜大了!")
else:
print(f"恭喜!你猜对了!总共用了{attempts}次")
break
except ValueError:
print("请输入有效的数字!")
函数与模块
函数定义与调用
函数是组织代码的基本单元,可以提高代码的复用性和可维护性:
# 基本函数定义
def greet(name):
"""向指定的人问好"""
return f"你好,{name}!"
# 带默认参数的函数
def create_person(name, age=0, city="未知"):
return {
"name": name,
"age": age,
"city": city
}
# 可变参数函数
def calculate_average(*numbers):
if len(numbers) == 0:
return 0
return sum(numbers) / len(numbers)
# 关键字参数函数
def print_profile(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
# 高级应用:装饰器
def timer(func):
import time
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"函数{func.__name__}执行耗时: {end - start:.4f}秒")
return result
return wrapper
@timer
def slow_function():
import time
time.sleep(1)
return "完成"
# 实际应用:数据处理函数
def process_student_data(students):
"""处理学生数据,计算平均分和优秀率"""
if not students:
return {"average": 0, "excellent_rate": 0}
scores = [student["score"] for student in students]
average = sum(scores) / len(scores)
excellent_count = sum(1 for s in scores if s >= 90)
excellent_rate = (excellent_count / len(scores)) * 100
return {
"average": round(average, 2),
"excellent_rate": round(excellent_rate, 2)
}
# 测试数据
sample_students = [
{"name": "张三", "score": 85},
{"name": "李四", "score": 92},
{"name": "王五", "score": 78},
{"name": "赵六", "score": 95}
]
result = process_student_data(sample_students)
print(result) # {'average': 87.5, 'excellent_rate': 50.0}
模块与包的使用
模块是Python代码组织的重要方式,允许你将相关功能组织在一起:
# 创建自定义模块
# 文件名: calculator.py
"""
这是一个简单的计算器模块
"""
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
if b == 0:
raise ValueError("除数不能为零")
return a / b
# 在主程序中使用模块
# 文件名: main.py
import calculator
from calculator import add, multiply
# 使用模块中的函数
result1 = calculator.add(10, 5)
result2 = multiply(3, 4)
print(f"加法结果: {result1}") # 15
print(f"乘法结果: {result2}") # 12
# 使用标准库模块
import math
import random
from datetime import datetime
# 数学计算
print(f"圆周率: {math.pi}")
print(f"平方根: {math.sqrt(16)}")
print(f"随机数: {random.randint(1, 100)}")
# 日期时间处理
current_time = datetime.now()
print(f"当前时间: {current_time}")
print(f"年份: {current_time.year}")
面向对象编程(OOP)
类与对象基础
面向对象编程是Python的重要范式,它通过类和对象的概念来组织代码:
# 基本类定义
class Dog:
# 类属性(所有实例共享)
species = "Canis familiaris"
# 初始化方法(构造函数)
def __init__(self, name, age, breed):
# 实例属性
self.name = name
self.age = age
self.breed = breed
# 实例方法
def bark(self):
return f"{self.name}正在汪汪叫!"
def describe(self):
return f"{self.name}是一只{self.age}岁的{self.breed}"
# 特殊方法(魔术方法)
def __str__(self):
return f"Dog(name={self.name}, age={self.age})"
def __len__(self):
return self.age
# 创建对象
dog1 = Dog("旺财", 3, "金毛")
dog2 = Dog("来福", 5, "哈士奇")
print(dog1.bark()) # 旺财正在汪汪叫!
print(dog1.describe()) # 旺财是一只3岁的金毛
print(len(dog1)) # 3
print(str(dog1)) # Dog(name=旺财, age=3)
继承与多态
继承允许子类继承父类的属性和方法,实现代码复用:
# 父类:动物
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self):
raise NotImplementedError("子类必须实现speak方法")
def describe(self):
return f"{self.name},{self.age}岁"
# 子类:猫
class Cat(Animal):
def __init__(self, name, age, color):
super().__init__(name, age)
self.color = color
def speak(self):
return "喵喵喵"
def describe(self):
return f"{super().describe()},毛色是{self.color}"
# 子类:狗
class Dog(Animal):
def __init__(self, name, age, breed):
super().__init__(name, age)
self.breed = breed
def speak(self):
return "汪汪汪"
def describe(self):
return f"{super().describe()},品种是{self.breed}"
# 多态示例
def animal_sound(animal):
"""多态函数:不同动物发出不同的声音"""
print(f"{animal.name}说: {animal.speak()}")
# 创建不同类型的动物
animals = [
Cat("咪咪", 2, "橘色"),
Dog("旺财", 4, "金毛")
]
for animal in animals:
animal_sound(animal)
print(animal.describe())
print("---")
封装与属性装饰器
封装是OOP的重要原则,通过私有属性和方法保护对象的内部状态:
class BankAccount:
def __init__(self, owner, initial_balance=0):
self.owner = owner
# 使用下划线表示受保护的属性(约定俗成)
self._balance = initial_balance
# 使用property装饰器创建只读属性
@property
def balance(self):
return self._balance
# 使用property装饰器创建计算属性
@property
def account_type(self):
if self._balance >= 10000:
return "VIP账户"
elif self._balance >= 1000:
return "普通账户"
else:
return "基础账户"
def deposit(self, amount):
if amount <= 0:
raise ValueError("存款金额必须大于0")
self._balance += amount
return self._balance
def withdraw(self, amount):
if amount <= 0:
raise ValueError("取款金额必须大于0")
if amount > self._balance:
raise ValueError("余额不足")
self._balance -= amount
return self._balance
def __str__(self):
return f"账户: {self.owner}, 余额: ¥{self._balance:.2f}"
# 使用示例
account = BankAccount("张三", 5000)
print(account) # 账户: 张三, 余额: ¥5000.00
print(f"当前余额: ¥{account.balance}") # 只读访问
print(f"账户类型: {account.account_type}") # 计算属性
account.deposit(2000)
print(f"存款后余额: ¥{account.balance}")
print(f"账户类型: {account.account_type}")
try:
account.withdraw(8000) # 余额不足
except ValueError as e:
print(f"错误: {e}")
数据结构与算法
列表推导式与生成器
Python提供了强大的数据处理工具,列表推导式和生成器可以高效地处理数据:
# 列表推导式基础
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 基本用法:平方数
squares = [x**2 for x in numbers]
print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 带条件的列表推导式
even_squares = [x**2 for x in numbers if x % 2 == 0]
print(even_squares) # [4, 16, 36, 64, 100]
# 嵌套列表推导式
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 字典推导式
word_frequency = {"apple": 3, "banana": 2, "cherry": 5}
inverted = {v: k for k, v in word_frequency.items()}
print(inverted) # {3: 'apple', 2: 'banana', 5: 'cherry'}
# 生成器表达式(节省内存)
def generate_numbers(n):
"""生成器函数"""
for i in range(n):
yield i**2
# 使用生成器
gen = generate_numbers(10)
for num in gen:
print(num, end=" ") # 0 1 4 9 16 25 36 49 64 81
# 生成器表达式(类似列表推导式,但返回生成器)
gen_expr = (x**2 for x in range(10))
print("\n生成器表达式:", list(gen_expr)) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
常用算法实现
# 排序算法
def bubble_sort(arr):
"""冒泡排序"""
n = len(arr)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
def quick_sort(arr):
"""快速排序"""
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
# 查找算法
def binary_search(arr, target):
"""二分查找"""
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1 # 未找到
# 实际应用:学生成绩管理系统
class StudentManager:
def __init__(self):
self.students = []
def add_student(self, name, score):
self.students.append({"name": name, "score": score})
def get_top_students(self, n=3):
"""获取前n名学生"""
sorted_students = sorted(self.students,
key=lambda x: x["score"],
reverse=True)
return sorted_students[:n]
def find_student(self, name):
"""查找学生(使用二分查找,需要先排序)"""
# 先按姓名排序
sorted_by_name = sorted(self.students, key=lambda x: x["name"])
names = [s["name"] for s in sorted_by_name]
index = binary_search(names, name)
if index != -1:
return sorted_by_name[index]
return None
# 使用示例
manager = StudentManager()
manager.add_student("张三", 85)
manager.add_student("李四", 92)
manager.add_student("王五", 78)
manager.add_student("赵六", 95)
manager.add_student("钱七", 88)
print("前三名:", manager.get_top_students(3))
print("查找李四:", manager.find_student("李四"))
文件操作与异常处理
文件读写
Python提供了简单而强大的文件操作功能:
# 写入文件
def write_to_file(filename, content):
"""写入文件(自动关闭文件)"""
try:
with open(filename, 'w', encoding='utf-8') as f:
f.write(content)
print(f"成功写入文件: {filename}")
except IOError as e:
print(f"写入文件时出错: {e}")
# 读取文件
def read_from_file(filename):
"""读取文件内容"""
try:
with open(filename, 'r', encoding='utf-8') as f:
content = f.read()
return content
except FileNotFoundError:
print(f"文件不存在: {filename}")
return None
except IOError as e:
print(f"读取文件时出错: {e}")
return None
# 处理CSV文件
import csv
def write_csv(filename, data):
"""写入CSV文件"""
with open(filename, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(["姓名", "年龄", "城市"]) # 表头
writer.writerows(data)
def read_csv(filename):
"""读取CSV文件"""
with open(filename, 'r', encoding='utf-8') as f:
reader = csv.reader(f)
return list(reader)
# JSON文件处理
import json
def save_json(filename, data):
"""保存数据为JSON"""
with open(filename, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
def load_json(filename):
"""从JSON文件加载数据"""
try:
with open(filename, 'r', encoding='utf-8') as f:
return json.load(f)
except FileNotFoundError:
return None
# 实际应用:学生数据管理系统
class StudentDataManager:
def __init__(self, data_file="students.json"):
self.data_file = data_file
self.students = self.load_data()
def load_data(self):
"""从JSON文件加载学生数据"""
data = load_json(self.data_file)
return data if data else []
def save_data(self):
"""保存学生数据到JSON文件"""
save_json(self.data_file, self.students)
print("数据已保存")
def add_student(self, name, age, score):
"""添加学生"""
student = {
"id": len(self.students) + 1,
"name": name,
"age": age,
"score": score
}
self.students.append(student)
self.save_data()
def display_students(self):
"""显示所有学生信息"""
if not self.students:
print("暂无学生数据")
return
print("\n学生信息列表:")
print("-" * 50)
for student in self.students:
print(f"ID: {student['id']}, 姓名: {student['name']}, "
f"年龄: {student['age']}, 成绩: {student['score']}")
print("-" * 50)
# 使用示例
manager = StudentDataManager()
manager.add_student("张三", 20, 85)
manager.add_student("李四", 21, 92)
manager.add_student("王五", 19, 78)
manager.display_students()
异常处理
异常处理是编写健壮程序的关键:
# 基本异常处理
def divide_numbers(a, b):
"""安全的除法运算"""
try:
result = a / b
return result
except ZeroDivisionError:
print("错误:除数不能为零!")
return None
except TypeError:
print("错误:请输入数字!")
return None
except Exception as e:
print(f"未知错误: {e}")
return None
# 自定义异常
class InvalidScoreError(Exception):
"""自定义异常:成绩无效"""
def __init__(self, score, message="成绩必须在0-100之间"):
self.score = score
self.message = message
super().__init__(self.message)
def validate_score(score):
"""验证成绩"""
if not (0 <= score <= 100):
raise InvalidScoreError(score)
return True
# 实际应用:用户注册系统
def register_user(username, password, age):
"""用户注册,包含完整的异常处理"""
try:
# 验证用户名
if len(username) < 3:
raise ValueError("用户名至少需要3个字符")
# 验证密码
if len(password) < 6:
raise ValueError("密码至少需要6个字符")
# 验证年龄
if not isinstance(age, int) or age < 0:
raise ValueError("年龄必须是正整数")
# 验证成绩(使用自定义异常)
validate_score(age) # 这里用年龄模拟成绩
# 模拟保存到数据库
user_data = {
"username": username,
"password": password, # 实际应用中应该加密
"age": age
}
print(f"用户 {username} 注册成功!")
return user_data
except ValueError as e:
print(f"输入错误: {e}")
return None
except InvalidScoreError as e:
print(f"数据验证错误: {e}")
return None
except Exception as e:
print(f"注册过程中出现未知错误: {e}")
return None
Python标准库与第三方库
标准库常用模块
Python拥有丰富的标准库,以下是几个常用模块的示例:
# 1. collections模块:扩展的数据结构
from collections import defaultdict, Counter, namedtuple
# defaultdict:带默认值的字典
word_count = defaultdict(int)
words = ["apple", "banana", "apple", "cherry", "banana", "apple"]
for word in words:
word_count[word] += 1
print(dict(word_count)) # {'apple': 3, 'banana': 2, 'cherry': 1}
# Counter:计数器
counter = Counter(words)
print(counter.most_common(2)) # [('apple', 3), ('banana', 2)]
# namedtuple:命名元组
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(f"坐标: x={p.x}, y={p.y}")
# 2. itertools模块:迭代器工具
import itertools
# 无限迭代器
counter = itertools.count(start=1, step=2)
print("计数器:", list(itertools.islice(counter, 5))) # [1, 3, 5, 7, 9]
# 组合迭代器
letters = ['A', 'B', 'C']
combinations = list(itertools.combinations(letters, 2))
print("组合:", combinations) # [('A', 'B'), ('A', 'C'), ('B', 'C')]
# 3. datetime模块:日期时间处理
from datetime import datetime, timedelta
now = datetime.now()
print(f"当前时间: {now}")
print(f"明天: {now + timedelta(days=1)}")
print(f"上周: {now - timedelta(weeks=1)}")
# 4. re模块:正则表达式
import re
def validate_email(email):
"""验证邮箱格式"""
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
return bool(re.match(pattern, email))
emails = ["test@example.com", "invalid-email", "user@domain.co.uk"]
for email in emails:
print(f"{email}: {'有效' if validate_email(email) else '无效'}")
# 5. random模块:随机数生成
import random
# 随机选择
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
print("随机水果:", random.choice(fruits))
# 随机打乱
cards = list(range(1, 11))
random.shuffle(cards)
print("洗牌后:", cards)
# 6. os和pathlib模块:文件路径操作
import os
from pathlib import Path
# 使用pathlib(推荐)
current_dir = Path.cwd()
print(f"当前目录: {current_dir}")
print(f"目录是否存在: {current_dir.exists()}")
# 创建目录
new_dir = current_dir / "test_folder"
if not new_dir.exists():
new_dir.mkdir()
print(f"创建目录: {new_dir}")
# 遍历目录
for file in new_dir.glob("*.txt"):
print(f"找到文件: {file}")
第三方库安装与使用
Python的强大之处在于其丰富的第三方库生态系统:
# 安装第三方库的命令(在终端中运行)
# pip install requests beautifulsoup4 pandas numpy matplotlib
# 1. requests库:HTTP请求
import requests
def get_weather(city):
"""获取天气信息(示例)"""
# 注意:这里使用免费API,实际使用需要申请API key
try:
# 示例:使用免费的天气API
url = f"https://wttr.in/{city}?format=j1"
response = requests.get(url, timeout=5)
if response.status_code == 200:
data = response.json()
current = data['current_condition'][0]
print(f"{city}当前天气:")
print(f"温度: {current['temp_C']}°C")
print(f"天气: {current['weatherDesc'][0]['value']}")
return current
else:
print(f"获取天气失败: {response.status_code}")
return None
except requests.RequestException as e:
print(f"请求错误: {e}")
return None
# 2. pandas库:数据处理
import pandas as pd
def analyze_student_data():
"""使用pandas分析学生成绩"""
# 创建DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'年龄': [20, 21, 19, 22, 20],
'数学': [85, 92, 78, 95, 88],
'英语': [78, 85, 82, 90, 84],
'物理': [88, 90, 75, 92, 86]
}
df = pd.DataFrame(data)
# 基本统计
print("数据概览:")
print(df.describe())
# 计算总分和平均分
df['总分'] = df['数学'] + df['英语'] + df['物理']
df['平均分'] = df[['数学', '英语', '物理']].mean(axis=1)
# 排序
df_sorted = df.sort_values('总分', ascending=False)
print("\n按总分排序:")
print(df_sorted[['姓名', '总分', '平均分']])
# 筛选
excellent = df[df['平均分'] >= 85]
print("\n优秀学生(平均分≥85):")
print(excellent[['姓名', '平均分']])
return df
# 3. matplotlib库:数据可视化
import matplotlib.pyplot as plt
def plot_student_scores(df):
"""绘制学生成绩图表"""
# 设置中文字体(根据系统可能需要调整)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 创建图表
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# 柱状图:各科平均成绩
subjects = ['数学', '英语', '物理']
averages = [df[subject].mean() for subject in subjects]
ax1.bar(subjects, averages, color=['skyblue', 'lightgreen', 'lightcoral'])
ax1.set_title('各科平均成绩')
ax1.set_ylabel('分数')
ax1.set_ylim(0, 100)
# 折线图:个人总分
ax2.plot(df['姓名'], df['总分'], marker='o', linewidth=2, markersize=8)
ax2.set_title('个人总分')
ax2.set_ylabel('总分')
ax2.tick_params(axis='x', rotation=45)
plt.tight_layout()
plt.show()
# 4. BeautifulSoup库:网页爬虫
from bs4 import BeautifulSoup
import requests
def scrape_quotes():
"""爬取名言(示例网站)"""
try:
url = "http://quotes.toscrape.com"
response = requests.get(url, timeout=5)
soup = BeautifulSoup(response.text, 'html.parser')
quotes = []
for quote in soup.find_all('div', class_='quote'):
text = quote.find('span', class_='text').text
author = quote.find('small', class_='author').text
quotes.append({"text": text, "author": author})
return quotes
except Exception as e:
print(f"爬取失败: {e}")
return []
# 使用示例(需要先安装相应库)
# weather = get_weather("北京")
# df = analyze_student_data()
# plot_student_scores(df)
# quotes = scrape_quotes()
实战项目:构建一个完整的学生管理系统
项目架构设计
让我们通过一个完整的项目来整合前面学到的所有知识:
"""
学生管理系统 v1.0
功能:添加学生、查询学生、成绩统计、数据持久化
"""
import json
import os
from datetime import datetime
from typing import List, Dict, Optional
class Student:
"""学生类"""
def __init__(self, student_id: str, name: str, age: int,
math: float, english: float, python: float):
self.student_id = student_id
self.name = name
self.age = age
self.math = math
self.english = english
self.python = python
@property
def total_score(self) -> float:
"""总分"""
return self.math + self.english + self.python
@property
def average_score(self) -> float:
"""平均分"""
return self.total_score / 3
@property
def grade(self) -> str:
"""等级评定"""
avg = self.average_score
if avg >= 90:
return "A"
elif avg >= 80:
return "B"
elif avg >= 70:
return "C"
elif avg >= 60:
return "D"
else:
return "E"
def to_dict(self) -> Dict:
"""转换为字典"""
return {
"student_id": self.student_id,
"name": self.name,
"age": self.age,
"math": self.math,
"english": self.english,
"python": self.python,
"created_at": datetime.now().isoformat()
}
def __str__(self) -> str:
return (f"学号: {self.student_id}, 姓名: {self.name}, "
f"年龄: {self.age}, 平均分: {self.average_score:.1f}, "
f"等级: {self.grade}")
class StudentManager:
"""学生管理器"""
def __init__(self, data_file: str = "students.json"):
self.data_file = data_file
self.students: List[Student] = []
self.load_data()
def load_data(self) -> None:
"""从文件加载数据"""
if not os.path.exists(self.data_file):
return
try:
with open(self.data_file, 'r', encoding='utf-8') as f:
data = json.load(f)
for item in data:
student = Student(
item['student_id'],
item['name'],
item['age'],
item['math'],
item['english'],
item['python']
)
self.students.append(student)
print(f"已加载 {len(self.students)} 条学生记录")
except Exception as e:
print(f"加载数据失败: {e}")
def save_data(self) -> None:
"""保存数据到文件"""
try:
data = [student.to_dict() for student in self.students]
with open(self.data_file, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print("数据已保存")
except Exception as e:
print(f"保存数据失败: {e}")
def add_student(self) -> None:
"""添加学生"""
print("\n=== 添加学生 ===")
try:
student_id = input("请输入学号: ").strip()
# 检查学号是否已存在
if any(s.student_id == student_id for s in self.students):
print("错误:学号已存在!")
return
name = input("请输入姓名: ").strip()
age = int(input("请输入年龄: "))
math = float(input("请输入数学成绩: "))
english = float(input("请输入英语成绩: "))
python = float(input("请输入Python成绩: "))
# 验证成绩范围
for score in [math, english, python]:
if not (0 <= score <= 100):
print("错误:成绩必须在0-100之间!")
return
student = Student(student_id, name, age, math, english, python)
self.students.append(student)
self.save_data()
print(f"成功添加学生: {student}")
except ValueError as e:
print(f"输入错误: {e}")
except Exception as e:
print(f"添加学生时出错: {e}")
def find_student(self) -> None:
"""查询学生"""
print("\n=== 查询学生 ===")
keyword = input("请输入学号或姓名: ").strip()
results = []
for student in self.students:
if (keyword.lower() in student.student_id.lower() or
keyword.lower() in student.name.lower()):
results.append(student)
if results:
print(f"找到 {len(results)} 个匹配的学生:")
for student in results:
print(student)
else:
print("未找到匹配的学生")
def show_all_students(self) -> None:
"""显示所有学生"""
print("\n=== 所有学生 ===")
if not self.students:
print("暂无学生数据")
return
# 按平均分排序
sorted_students = sorted(self.students,
key=lambda s: s.average_score,
reverse=True)
print(f"{'学号':<10} {'姓名':<8} {'年龄':<4} {'数学':<6} {'英语':<6} {'Python':<6} {'平均':<6} {'等级':<4}")
print("-" * 60)
for student in sorted_students:
print(f"{student.student_id:<10} {student.name:<8} {student.age:<4} "
f"{student.math:<6.1f} {student.english:<6.1f} {student.python:<6.1f} "
f"{student.average_score:<6.1f} {student.grade:<4}")
def show_statistics(self) -> None:
"""显示统计信息"""
print("\n=== 统计信息 ===")
if not self.students:
print("暂无学生数据")
return
total = len(self.students)
avg_total = sum(s.total_score for s in self.students) / total
avg_math = sum(s.math for s in self.students) / total
avg_english = sum(s.english for s in self.students) / total
avg_python = sum(s.python for s in self.students) / total
grade_count = {"A": 0, "B": 0, "C": 0, "D": 0, "E": 0}
for student in self.students:
grade_count[student.grade] += 1
print(f"学生总数: {total}")
print(f"平均总分: {avg_total:.1f}")
print(f"数学平均: {avg_math:.1f}")
print(f"英语平均: {avg_english:.1f}")
print(f"Python平均: {avg_python:.1f}")
print("\n等级分布:")
for grade, count in grade_count.items():
if count > 0:
print(f" {grade}: {count}人 ({count/total*100:.1f}%)")
def delete_student(self) -> None:
"""删除学生"""
print("\n=== 删除学生 ===")
student_id = input("请输入要删除的学号: ").strip()
for i, student in enumerate(self.students):
if student.student_id == student_id:
confirm = input(f"确认删除 {student.name} 吗? (y/n): ").lower()
if confirm == 'y':
del self.students[i]
self.save_data()
print("删除成功")
else:
print("已取消删除")
return
print("未找到该学号的学生")
def export_data(self) -> None:
"""导出数据到CSV"""
print("\n=== 导出数据 ===")
try:
import csv
filename = f"students_export_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
with open(filename, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(["学号", "姓名", "年龄", "数学", "英语", "Python", "平均分", "等级"])
for student in self.students:
writer.writerow([
student.student_id,
student.name,
student.age,
student.math,
student.english,
student.python,
f"{student.average_score:.1f}",
student.grade
])
print(f"数据已导出到: {filename}")
except Exception as e:
print(f"导出失败: {e}")
def main():
"""主程序"""
manager = StudentManager()
while True:
print("\n" + "="*40)
print("学生管理系统 v1.0")
print("="*40)
print("1. 添加学生")
print("2. 查询学生")
print("3. 显示所有学生")
print("4. 统计信息")
print("5. 删除学生")
print("6. 导出数据")
print("0. 退出")
print("="*40)
choice = input("请选择操作 (0-6): ").strip()
if choice == '1':
manager.add_student()
elif choice == '2':
manager.find_student()
elif choice == '3':
manager.show_all_students()
elif choice == '4':
manager.show_statistics()
elif choice == '5':
manager.delete_student()
elif choice == '6':
manager.export_data()
elif choice == '0':
print("感谢使用,再见!")
break
else:
print("无效的选择,请重新输入")
input("\n按回车键继续...")
if __name__ == "__main__":
main()
Python学习建议与最佳实践
代码风格与规范
编写高质量的Python代码需要遵循一些最佳实践:
# 1. 遵循PEP 8风格指南
# 好的命名示例
def calculate_student_average(scores: list) -> float:
"""计算学生平均分
Args:
scores (list): 学生分数列表
Returns:
float: 平均分,保留两位小数
Raises:
ValueError: 当分数列表为空时
"""
if not scores:
raise ValueError("分数列表不能为空")
return round(sum(scores) / len(scores), 2)
# 2. 使用类型提示(Python 3.5+)
from typing import List, Dict, Optional
def process_data(data: List[Dict[str, int]]) -> Optional[float]:
"""处理数据并返回平均值"""
if not data:
return None
total = sum(item['value'] for item in data)
return total / len(data)
# 3. 使用f-string进行字符串格式化(Python 3.6+)
name = "张三"
age = 20
score = 85.5
# 推荐
message = f"学生{name},年龄{age},成绩{score:.1f}"
# 不推荐
message_old = "学生%s,年龄%d,成绩%.1f" % (name, age, score)
# 4. 使用上下文管理器处理资源
# 推荐
with open('file.txt', 'r') as f:
content = f.read()
# 不推荐
f = open('file.txt', 'r')
content = f.read()
f.close() # 可能忘记关闭
# 5. 使用enumerate而不是range(len())
fruits = ["苹果", "香蕉", "橙子"]
# 推荐
for i, fruit in enumerate(fruits, 1):
print(f"{i}. {fruit}")
# 不推荐
for i in range(len(fruits)):
print(f"{i+1}. {fruits[i]}")
# 6. 使用列表推导式替代循环
numbers = [1, 2, 3, 4, 5]
# 推荐
squares = [x**2 for x in numbers]
# 不推荐
squares = []
for x in numbers:
squares.append(x**2)
# 7. 使用字典的get()方法处理键不存在的情况
data = {"name": "张三", "age": 20}
# 推荐
city = data.get("city", "未知") # 如果city不存在,返回"未知"
# 不推荐
city = data["city"] if "city" in data else "未知"
# 8. 使用any()和all()简化条件判断
numbers = [1, 2, 3, 4, 5]
# 推荐
has_even = any(n % 2 == 0 for n in numbers)
all_positive = all(n > 0 for n in numbers)
# 不推荐
has_even = False
for n in numbers:
if n % 2 == 0:
has_even = True
break
all_positive = True
for n in numbers:
if n <= 0:
all_positive = False
break
调试与测试
# 1. 使用print调试(简单但有效)
def debug_function(data):
print(f"DEBUG: data type = {type(data)}")
print(f"DEBUG: data = {data}")
# 你的代码
result = sum(data)
print(f"DEBUG: result = {result}")
return result
# 2. 使用logging模块(推荐用于生产环境)
import logging
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('app.log'),
logging.StreamHandler()
]
)
def process_with_logging(data):
logging.info(f"开始处理数据,长度: {len(data)}")
try:
result = sum(data)
logging.info(f"处理完成,结果: {result}")
return result
except Exception as e:
logging.error(f"处理失败: {e}")
raise
# 3. 使用断言进行调试
def divide(a, b):
assert b != 0, "除数不能为零"
assert isinstance(a, (int, float)), "a必须是数字"
assert isinstance(b, (int, float)), "b必须是数字"
return a / b
# 4. 使用pdb调试器(交互式调试)
import pdb
def complex_calculation(x, y, z):
# 设置断点
pdb.set_trace()
temp = x * y
result = temp + z
return result
# 5. 单元测试示例
import unittest
class TestStudentManager(unittest.TestCase):
def setUp(self):
"""测试前设置"""
self.manager = StudentManager("test_students.json")
def test_add_student(self):
"""测试添加学生"""
initial_count = len(self.manager.students)
self.manager.add_student("S001", "测试", 20, 80, 85, 90)
self.assertEqual(len(self.manager.students), initial_count + 1)
def test_student_properties(self):
"""测试学生属性计算"""
student = Student("S001", "测试", 20, 80, 85, 90)
self.assertEqual(student.total_score, 255)
self.assertAlmostEqual(student.average_score, 85.0)
self.assertEqual(student.grade, "B")
# 运行测试
# python -m unittest test_student_manager.py
总结与进阶学习路径
学习路线图
基础阶段(1-2周)
- 掌握基本语法和数据类型
- 理解控制流和函数
- 熟悉文件操作和异常处理
进阶阶段(2-4周)
- 深入面向对象编程
- 学习常用标准库
- 掌握数据结构和算法基础
应用阶段(1-2个月)
- 选择专业方向(Web开发、数据分析、自动化等)
- 学习相关框架和工具
- 完成实际项目
高级阶段(持续学习)
- 性能优化和并发编程
- 设计模式
- 源码阅读和贡献
推荐资源
- 官方文档: docs.python.org
- 在线教程: Real Python, Python官方教程
- 练习平台: LeetCode, HackerRank, Codewars
- 社区: Stack Overflow, Python中文社区
常见问题解决
# 问题1:中文编码问题
# 解决方案:始终指定encoding='utf-8'
with open('file.txt', 'r', encoding='utf-8') as f:
content = f.read()
# 问题2:循环导入
# 解决方案:重构代码,或将导入放在函数内部
# 问题3:内存占用过大
# 解决方案:使用生成器而不是列表
# 不好:large_list = [x**2 for x in range(1000000)]
# 好:large_gen = (x**2 for x in range(1000000))
# 问题4:浮点数精度问题
# 解决方案:使用decimal模块
from decimal import Decimal, getcontext
getcontext().prec = 2
result = Decimal('0.1') + Decimal('0.2') # 精确的0.3
# 问题5:多线程与GIL
# 解决方案:使用多进程(multiprocessing)或异步编程(asyncio)
通过本指南的学习,你应该已经掌握了Python编程的核心概念和实用技巧。记住,编程是一门实践性很强的技能,理论学习必须配合大量的编码练习。建议你从简单的项目开始,逐步挑战更复杂的任务,同时保持持续学习的习惯,关注Python社区的最新发展。
祝你Python学习之旅顺利!
