1287 字
4 分钟
Python进阶教程(第二阶段)
Python进阶教程(第二阶段)
欢迎来到Python进阶教程的第二阶段!在第一阶段中,我们学习了Python的基础知识,包括环境搭建、语法基础、数据类型、控制流等内容。在本阶段中,我们将深入学习Python的高级特性,包括面向对象编程进阶、异常处理、正则表达式、数据库操作、Web开发等内容,帮助你成为一名更专业的Python开发者。
1. 面向对象编程进阶
1.1 类的高级特性
类方法和静态方法:
class Person: # 类变量 species = "Homo sapiens"
def __init__(self, name, age): self.name = name self.age = age
# 实例方法 def greet(self): return f"Hello, my name is {self.name}."
# 类方法 @classmethod def from_birth_year(cls, name, birth_year): current_year = 2026 age = current_year - birth_year return cls(name, age)
# 静态方法 @staticmethod def is_adult(age): return age >= 18
# 使用类方法person1 = Person.from_birth_year("John", 1996)print(person1.name)print(person1.age)
# 使用静态方法print(Person.is_adult(18))print(Person.is_adult(17))属性装饰器:
class Person: def __init__(self, name, age): self.name = name self._age = age # 私有变量(约定)
@property def age(self): return self._age
@age.setter def age(self, value): if value < 0: raise ValueError("Age cannot be negative") self._age = value
@age.deleter def age(self): del self._age
person = Person("John", 30)print(person.age) # 使用@property获取值person.age = 31 # 使用@age.setter设置值print(person.age)# person.age = -1 # 会报错# del person.age # 使用@age.deleter删除属性抽象基类:
from abc import ABC, abstractmethod
class Animal(ABC): @abstractmethod def speak(self): pass
class Dog(Animal): def speak(self): return "Woof!"
class Cat(Animal): def speak(self): return "Meow!"
# animal = Animal() # 会报错,抽象类不能实例化dog = Dog()print(dog.speak())cat = Cat()print(cat.speak())1.2 继承和多态进阶
多重继承:
class A: def method(self): print("Method from A")
class B: def method(self): print("Method from B")
class C(A, B): pass
class D(B, A): pass
c = C()c.method() # 输出"Method from A",因为A在B之前
d = D()d.method() # 输出"Method from B",因为B在A之前
# 查看方法解析顺序(MRO)print(C.mro())print(D.mro())方法重写:
class Animal: def speak(self): return "Some generic sound"
class Dog(Animal): def speak(self): return "Woof!"
class Cat(Animal): def speak(self): return "Meow!"
animal = Animal()print(animal.speak())
dog = Dog()print(dog.speak())
cat = Cat()print(cat.speak())super()函数:
class Parent: def __init__(self, name): self.name = name print(f"Parent initialized with name: {self.name}")
class Child(Parent): def __init__(self, name, age): super().__init__(name) # 调用父类的__init__方法 self.age = age print(f"Child initialized with age: {self.age}")
child = Child("John", 10)print(child.name)print(child.age)1.3 特殊方法
常用特殊方法:
class Vector: def __init__(self, x, y): self.x = x self.y = y
# 字符串表示 def __str__(self): return f"Vector({self.x}, {self.y})"
def __repr__(self): return f"Vector({self.x}, {self.y})"
# 算术运算 def __add__(self, other): return Vector(self.x + other.x, self.y + other.y)
def __sub__(self, other): return Vector(self.x - other.x, self.y - other.y)
def __mul__(self, scalar): return Vector(self.x * scalar, self.y * scalar)
# 比较运算 def __eq__(self, other): return self.x == other.x and self.y == other.y
# 容器操作 def __len__(self): return 2
def __getitem__(self, index): if index == 0: return self.x elif index == 1: return self.y else: raise IndexError("Vector index out of range")
v1 = Vector(1, 2)v2 = Vector(3, 4)
print(v1) # 使用__str__print(repr(v1)) # 使用__repr__
v3 = v1 + v2 # 使用__add__print(v3)
v4 = v1 - v2 # 使用__sub__print(v4)
v5 = v1 * 2 # 使用__mul__print(v5)
print(v1 == v2) # 使用__eq__print(len(v1)) # 使用__len__print(v1[0]) # 使用__getitem__print(v1[1]) # 使用__getitem__2. 异常处理
2.1 异常类型
常见异常:
- SyntaxError:语法错误
- NameError:名称错误(变量未定义)
- TypeError:类型错误(操作不支持)
- ValueError:值错误(值不合法)
- ZeroDivisionError:除零错误
- IndexError:索引错误(索引超出范围)
- KeyError:键错误(字典键不存在)
- FileNotFoundError:文件未找到错误
- ImportError:导入错误
2.2 异常处理机制
try-except:
try: # 可能引发异常的代码 result = 10 / 0except ZeroDivisionError: # 处理特定异常 print("Cannot divide by zero")except Exception as e: # 处理其他所有异常 print(f"An error occurred: {e}")else: # 没有异常时执行 print(f"Result: {result}")finally: # 无论是否有异常都执行 print("Execution completed")嵌套try-except:
try: try: result = 10 / 0 except ZeroDivisionError: print("Inner except: Cannot divide by zero") raise # 重新抛出异常except Exception as e: print(f"Outer except: An error occurred: {e}")2.3 自定义异常
class MyError(Exception): """自定义异常类""" def __init__(self, message): self.message = message super().__init__(self.message)
class ValueTooSmallError(MyError): """值太小异常""" pass
class ValueTooLargeError(MyError): """值太大异常""" pass
# 使用自定义异常def check_value(value): if value < 0: raise ValueTooSmallError("Value is too small") elif value > 100: raise ValueTooLargeError("Value is too large") else: print("Value is within range")
try: check_value(-1)except ValueTooSmallError as e: print(f"Error: {e}")except ValueTooLargeError as e: print(f"Error: {e}")try: check_value(200)except ValueTooSmallError as e: print(f"Error: {e}")except ValueTooLargeError as e: print(f"Error: {e}")try: check_value(50)except ValueTooSmallError as e: print(f"Error: {e}")except ValueTooLargeError as e: print(f"Error: {e}")3. 正则表达式
3.1 正则表达式基础
正则表达式语法:
- .:匹配任意字符(除换行符)
- ^:匹配字符串开头
- $:匹配字符串结尾
- \d:匹配数字
- \D:匹配非数字
- \w:匹配字母、数字、下划线
- \W:匹配非字母、数字、下划线
- \s:匹配空白字符
- \S:匹配非空白字符
- [abc]:匹配方括号内的任意字符
- [^abc]:匹配除方括号内的任意字符
- a|b:匹配a或b
- a*:匹配0个或多个a
- a+:匹配1个或多个a
- a?:匹配0个或1个a
- a{n}:匹配n个a
- a{n,}:匹配至少n个a
- a{n,m}:匹配n到m个a
- (abc):捕获组,匹配abc并捕获
3.2 re模块
常用函数:
import re
# 1. match():从字符串开头匹配pattern = r"\d+"text = "123abc"match = re.match(pattern, text)if match: print(f"Match found: {match.group()}")else: print("No match")
# 2. search():在整个字符串中查找匹配pattern = r"\d+"text = "abc123def"search = re.search(pattern, text)if search: print(f"Search found: {search.group()}")else: print("No match")
# 3. findall():查找所有匹配pattern = r"\d+"text = "abc123def456ghi"findall = re.findall(pattern, text)print(f"Findall found: {findall}")
# 4. finditer():查找所有匹配并返回迭代器pattern = r"\d+"text = "abc123def456ghi"for match in re.finditer(pattern, text): print(f"Match found at {match.start()}-{match.end()}: {match.group()}")
# 5. sub():替换匹配pattern = r"\d+"text = "abc123def456ghi"replaced = re.sub(pattern, "X", text)print(f"Replaced text: {replaced}")
# 6. split():根据匹配分割字符串pattern = r"\d+"text = "abc123def456ghi"split = re.split(pattern, text)print(f"Split text: {split}")编译正则表达式:
import re
# 编译正则表达式(提高性能)pattern = re.compile(r"\d+")
# 使用编译后的正则表达式text = "abc123def456ghi"print(pattern.findall(text))print(pattern.sub("X", text))3.3 正则表达式示例
验证邮箱:
import re
def validate_email(email): pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$") return bool(re.match(pattern, email))
emails = [ "user@example.com", "user.name@example.com", "user_name@example.com", "user@example.co.uk", "user@", "@example.com", "user@.com"]
for email in emails: print(f"{email}: {validate_email(email)}")验证电话号码:
import re
def validate_phone(phone): pattern = r"^\+?[1-9]\d{1,14}$" return bool(re.match(pattern, phone))
phones = [ "+1234567890", "1234567890", "+12345678901234", "123", "+0123456789", "abc123456789"]
for phone in phones: print(f"{phone}: {validate_phone(phone)}")提取URL:
import re
def extract_urls(text): pattern = r"https?://[\w\-._~:/?#[\]@!$&'()*+,;=.]+" return re.findall(pattern, text)
text = "Visit https://www.example.com and https://google.com for more information."urls = extract_urls(text)print(f"Extracted URLs: {urls}")4. 数据库操作
4.1 SQLite
SQLite简介:
SQLite是一种轻量级的嵌入式数据库,不需要单独的服务器进程,数据存储在单个文件中。Python内置了对SQLite的支持,无需安装额外的库。
基本操作:
import sqlite3
# 连接到SQLite数据库(如果不存在则创建)conn = sqlite3.connect('example.db')
# 创建游标cursor = conn.cursor()
# 创建表cursor.execute('''CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, age INTEGER)''')
# 插入数据cursor.execute('''INSERT INTO users (name, email, age) VALUES (?, ?, ?)''', ('John', 'john@example.com', 30))
cursor.execute('''INSERT INTO users (name, email, age) VALUES (?, ?, ?)''', ('Jane', 'jane@example.com', 25))
# 提交事务conn.commit()
# 查询数据cursor.execute('SELECT * FROM users')rows = cursor.fetchall()print("All users:")for row in rows: print(row)
# 条件查询cursor.execute('SELECT * FROM users WHERE age > ?', (26,))rows = cursor.fetchall()print("\nUsers older than 26:")for row in rows: print(row)
# 更新数据cursor.execute('UPDATE users SET age = ? WHERE id = ?', (31, 1))conn.commit()
# 删除数据cursor.execute('DELETE FROM users WHERE id = ?', (2,))conn.commit()
# 再次查询cursor.execute('SELECT * FROM users')rows = cursor.fetchall()print("\nUsers after update and delete:")for row in rows: print(row)
# 关闭游标和连接cursor.close()conn.close()4.2 MySQL
安装依赖:
pip install mysql-connector-python基本操作:
import mysql.connector
# 连接到MySQL数据库conn = mysql.connector.connect( host="localhost", user="username", password="password", database="mydatabase")
# 创建游标cursor = conn.cursor()
# 创建表cursor.execute('''CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, age INT)''')
# 插入数据cursor.execute('''INSERT INTO users (name, email, age) VALUES (%s, %s, %s)''', ('John', 'john@example.com', 30))
cursor.execute('''INSERT INTO users (name, email, age) VALUES (%s, %s, %s)''', ('Jane', 'jane@example.com', 25))
# 提交事务conn.commit()
# 查询数据cursor.execute('SELECT * FROM users')rows = cursor.fetchall()print("All users:")for row in rows: print(row)
# 条件查询cursor.execute('SELECT * FROM users WHERE age > %s', (26,))rows = cursor.fetchall()print("\nUsers older than 26:")for row in rows: print(row)
# 更新数据cursor.execute('UPDATE users SET age = %s WHERE id = %s', (31, 1))conn.commit()
# 删除数据cursor.execute('DELETE FROM users WHERE id = %s', (2,))conn.commit()
# 再次查询cursor.execute('SELECT * FROM users')rows = cursor.fetchall()print("\nUsers after update and delete:")for row in rows: print(row)
# 关闭游标和连接cursor.close()conn.close()4.3 PostgreSQL
安装依赖:
pip install psycopg2-binary基本操作:
import psycopg2
# 连接到PostgreSQL数据库conn = psycopg2.connect( host="localhost", user="username", password="password", database="mydatabase")
# 创建游标cursor = conn.cursor()
# 创建表cursor.execute('''CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, age INTEGER)''')
# 插入数据cursor.execute('''INSERT INTO users (name, email, age) VALUES (%s, %s, %s)''', ('John', 'john@example.com', 30))
cursor.execute('''INSERT INTO users (name, email, age) VALUES (%s, %s, %s)''', ('Jane', 'jane@example.com', 25))
# 提交事务conn.commit()
# 查询数据cursor.execute('SELECT * FROM users')rows = cursor.fetchall()print("All users:")for row in rows: print(row)
# 条件查询cursor.execute('SELECT * FROM users WHERE age > %s', (26,))rows = cursor.fetchall()print("\nUsers older than 26:")for row in rows: print(row)
# 更新数据cursor.execute('UPDATE users SET age = %s WHERE id = %s', (31, 1))conn.commit()
# 删除数据cursor.execute('DELETE FROM users WHERE id = %s', (2,))conn.commit()
# 再次查询cursor.execute('SELECT * FROM users')rows = cursor.fetchall()print("\nUsers after update and delete:")for row in rows: print(row)
# 关闭游标和连接cursor.close()conn.close()5. Web开发
5.1 Flask
安装Flask:
pip install flask基本应用:
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
# 路由@app.route('/')def index(): return 'Hello, World!'
@app.route('/hello/<name>')def hello(name): return f'Hello, {name}!'
@app.route('/form', methods=['GET', 'POST'])def form(): if request.method == 'POST': name = request.form['name'] return redirect(url_for('hello', name=name)) return ''' <form method="post"> <input type="text" name="name" placeholder="Enter your name"> <input type="submit" value="Submit"> </form> '''
if __name__ == '__main__': app.run(debug=True)模板:
创建templates目录,添加index.html文件:
<!DOCTYPE html><html><head> <title>Flask App</title></head><body> <h1>Hello, {{ name }}!</h1> <form method="post"> <input type="text" name="name" placeholder="Enter your name"> <input type="submit" value="Submit"> </form></body></html>修改Flask应用:
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])def index(): if request.method == 'POST': name = request.form['name'] return render_template('index.html', name=name) return render_template('index.html', name='World')
if __name__ == '__main__': app.run(debug=True)5.2 Django
安装Django:
pip install django创建Django项目:
django-admin startproject myprojectcd myprojectpython manage.py startapp myapp基本配置:
- 修改
myproject/settings.py,添加myapp到INSTALLED_APPS:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'myapp',]- 修改
myapp/views.py:
from django.shortcuts import renderfrom django.http import HttpResponse
def index(request): return HttpResponse("Hello, World!")
def hello(request, name): return HttpResponse(f"Hello, {name}!")- 创建
myapp/urls.py:
from django.urls import pathfrom . import views
urlpatterns = [ path('', views.index, name='index'), path('hello/<str:name>/', views.hello, name='hello'),]- 修改
myproject/urls.py:
from django.contrib import adminfrom django.urls import path, include
urlpatterns = [ path('admin/', admin.site.urls), path('', include('myapp.urls')),]- 运行开发服务器:
python manage.py runserver6. 并发编程
6.1 线程
基本使用:
import threadingimport time
def worker(name, delay): print(f"Worker {name} started") time.sleep(delay) print(f"Worker {name} finished")
# 创建线程thread1 = threading.Thread(target=worker, args=('A', 2))thread2 = threading.Thread(target=worker, args=('B', 1))
# 启动线程thread1.start()thread2.start()
# 等待线程完成thread1.join()thread2.join()
print("All workers finished")线程安全:
import threading
counter = 0lock = threading.Lock()
def increment(): global counter for _ in range(100000): with lock: # 使用锁确保线程安全 counter += 1
# 创建线程threads = []for i in range(10): thread = threading.Thread(target=increment) threads.append(thread) thread.start()
# 等待所有线程完成for thread in threads: thread.join()
print(f"Final counter value: {counter}")6.2 进程
基本使用:
import multiprocessingimport time
def worker(name, delay): print(f"Worker {name} started") time.sleep(delay) print(f"Worker {name} finished")
if __name__ == '__main__': # 创建进程 process1 = multiprocessing.Process(target=worker, args=('A', 2)) process2 = multiprocessing.Process(target=worker, args=('B', 1))
# 启动进程 process1.start() process2.start()
# 等待进程完成 process1.join() process2.join()
print("All workers finished")进程池:
import multiprocessingimport time
def worker(name): print(f"Worker {name} started") time.sleep(1) print(f"Worker {name} finished") return f"Result from worker {name}"
if __name__ == '__main__': # 创建进程池 with multiprocessing.Pool(processes=4) as pool: # 映射函数到多个参数 results = pool.map(worker, [1, 2, 3, 4, 5]) print(f"Results: {results}")
print("All workers finished")6.3 异步编程
asyncio:
import asyncio
async def worker(name, delay): print(f"Worker {name} started") await asyncio.sleep(delay) print(f"Worker {name} finished") return f"Result from worker {name}"
async def main(): # 并发执行多个协程 tasks = [ worker('A', 2), worker('B', 1), worker('C', 3) ]
# 等待所有任务完成 results = await asyncio.gather(*tasks) print(f"Results: {results}")
# 运行主协程asyncio.run(main())7. 数据分析
7.1 NumPy
安装NumPy:
pip install numpy基本操作:
import numpy as np
# 创建数组arr1 = np.array([1, 2, 3, 4, 5])arr2 = np.array([[1, 2, 3], [4, 5, 6]])print(f"arr1 shape: {arr1.shape}")print(f"arr2 shape: {arr2.shape}")
# 数组操作print(f"arr1 + 1: {arr1 + 1}")print(f"arr1 * 2: {arr1 * 2}")print(f"arr1 mean: {arr1.mean()}")print(f"arr1 sum: {arr1.sum()}")print(f"arr1 max: {arr1.max()}")print(f"arr1 min: {arr1.min()}")
# 矩阵运算arr3 = np.array([[1, 2], [3, 4]])arr4 = np.array([[5, 6], [7, 8]])print(f"arr3 + arr4:\n{arr3 + arr4}")print(f"arr3 * arr4:\n{arr3 * arr4}") # 元素级乘法print(f"arr3 @ arr4:\n{arr3 @ arr4}") # 矩阵乘法
# 数组索引和切片print(f"arr1[0]: {arr1[0]}")print(f"arr1[1:4]: {arr1[1:4]}")print(f"arr2[0, 1]: {arr2[0, 1]}")print(f"arr2[:, 1]: {arr2[:, 1]}")
# 特殊数组print(f"Zeros:\n{np.zeros((2, 3))}")print(f"Ones:\n{np.ones((2, 3))}")print(f"Identity matrix:\n{np.eye(3)}")print(f"Range: {np.arange(10)}")print(f"Linspace: {np.linspace(0, 1, 5)}")7.2 Pandas
安装Pandas:
pip install pandas基本操作:
import pandas as pd
# 创建Seriess = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])print(f"Series:\n{s}")
# 创建DataFramedata = { 'name': ['John', 'Jane', 'Bob', 'Alice'], 'age': [30, 25, 35, 28], 'city': ['New York', 'London', 'Paris', 'Tokyo']}df = pd.DataFrame(data)print(f"DataFrame:\n{df}")
# 数据访问print(f"df['name']:\n{df['name']}")print(f"df.loc[0]:\n{df.loc[0]}")print(f"df.iloc[0, 1]: {df.iloc[0, 1]}")
# 数据过滤print(f"df[df['age'] > 28]:\n{df[df['age'] > 28]}")
# 数据排序print(f"df sorted by age:\n{df.sort_values('age')}")
# 数据分组print(f"Mean age by city:\n{df.groupby('city')['age'].mean()}")
# 数据统计print(f"df describe:\n{df.describe()}")
# 缺失值处理df.loc[0, 'age'] = Noneprint(f"df with NaN:\n{df}")print(f"df filled:\n{df.fillna(0)}")print(f"df dropped:\n{df.dropna()}")
# 读取和写入数据# df.to_csv('data.csv', index=False)# df_read = pd.read_csv('data.csv')7.3 Matplotlib
安装Matplotlib:
pip install matplotlib基本绘图:
import matplotlib.pyplot as pltimport numpy as np
# 折线图x = np.linspace(0, 10, 100)y = np.sin(x)
plt.plot(x, y)plt.title('Sine Wave')plt.xlabel('x')plt.ylabel('sin(x)')plt.grid(True)plt.show()
# 散点图x = np.random.rand(100)y = np.random.rand(100)colors = np.random.rand(100)sizes = 1000 * np.random.rand(100)
plt.scatter(x, y, c=colors, s=sizes, alpha=0.5)plt.title('Scatter Plot')plt.xlabel('x')plt.ylabel('y')plt.show()
# 柱状图categories = ['A', 'B', 'C', 'D', 'E']values = [10, 20, 15, 25, 30]
plt.bar(categories, values)plt.title('Bar Chart')plt.xlabel('Category')plt.ylabel('Value')plt.show()
# 直方图data = np.random.randn(1000)
plt.hist(data, bins=30)plt.title('Histogram')plt.xlabel('Value')plt.ylabel('Frequency')plt.show()8. 学习资源推荐
8.1 Python官方文档
8.2 B站Python视频(播放量高于50W)
- Python高级编程技巧 - 黑马程序员 - 播放量超100W
- Python全栈开发教程 - 尚硅谷 - 播放量超300W
- Python数据分析与可视化 - 黑马程序员 - 播放量超50W
- Python Web开发从入门到精通 - 尚硅谷 - 播放量超100W
8.3 推荐书籍
- 《流畅的Python》
- 《Python Cookbook》
- 《Effective Python》
- 《Python编程:从入门到实践》
- 《Python数据科学手册》
- 《Django实战》
- 《Flask Web开发》
9. 总结
本教程介绍了Python的高级特性,包括:
- 面向对象编程进阶(类方法、静态方法、属性装饰器、抽象基类、多重继承等)
- 异常处理(异常类型、异常处理机制、自定义异常)
- 正则表达式(语法、re模块、常见应用)
- 数据库操作(SQLite、MySQL、PostgreSQL)
- Web开发(Flask、Django)
- 并发编程(线程、进程、异步编程)
- 数据分析(NumPy、Pandas、Matplotlib)
通过本教程的学习,你应该已经掌握了Python的高级特性,可以开始编写更复杂、更专业的Python程序了。在接下来的教程中,我们将学习Python的实际应用场景和项目实战。
祝你学习愉快!
提示:本教程是Python学习的第二阶段,后续将推出Python项目实战教程,包括Web应用开发、数据分析项目、爬虫项目等内容。
Python进阶教程(第二阶段)
https://sakumonet.top/posts/python-advanced-tutorial/ 部分信息可能已经过时









