Python进阶教程:随机数、正则表达式与异常处理
在Python编程中,随机数生成、正则表达式和异常处理是三个非常重要的概念。本文将深入浅出地介绍这三个主题,帮助你掌握Python编程的核心技能。
文章目录
- 一、随机数生成:让程序充满不确定性
- 基本随机数函数
- 序列操作函数
- 实战应用:验证码生成器
- 二、正则表达式:文本处理的利器
- 核心函数对比
- 基础正则语法
- 量词和重复
- 实用案例
- 1. 电话号码验证
- 2. 邮箱验证
- 3. HTML内容提取
- 高级技巧
- 1. 编译正则表达式
- 2. 使用迭代器
- 3. 贪婪与非贪婪匹配
- 三、异常处理:让程序更健壮
- 基本异常处理结构
- 常见异常类型
- 多重异常处理
- 自定义异常
- 实际应用示例
- 总结
一、随机数生成:让程序充满不确定性
随机数在程序开发中有着广泛的应用,从游戏开发到数据科学,都离不开随机数的支持。Python的random
模块为我们提供了丰富的随机数生成功能。
基本随机数函数
import random# 生成0-1之间的小数
print(random.random())# 生成指定范围的小数
print(random.uniform(0, 4))# 生成指定范围的整数
print(random.randint(1, 5))# 生成指定范围和步长的数字
print(random.randrange(1, 10, 2)) # 1-10之间的奇数
print(random.randrange(2, 10, 2)) # 2-10之间的偶数
序列操作函数
# 随机选择一个元素
cards = ['梅花4', '黑桃Q', '方块K']
selected_card = random.choice(cards)
print(selected_card)# 随机选择多个元素(不重复)
deck = ['梅花A', '梅花2', '梅花3', '梅花4', '方块A']
a, b = random.sample(deck, 2)
print(a, b)# 随机打乱序列
items = ['梅花A', '梅花2', '梅花3', '梅花4', '方块A']
random.shuffle(items)
print(items)
实战应用:验证码生成器
让我们创建一个实用的验证码生成器,结合数字和字母:
import randomdef generate_verification_code():code = ''for i in range(4):num = random.randint(0, 9)letter = chr(random.randint(65, 90)) # A-Z的ASCII码add = random.choice([num, letter])code += str(add)return code# 生成验证码
verification_code = generate_verification_code()
print(verification_code) # 输出类似:A3K8
二、正则表达式:文本处理的利器
正则表达式是处理字符串的强大工具,可以进行复杂的模式匹配、查找和替换操作。Python的re
模块提供了完整的正则表达式支持。
核心函数对比
findall()
: 查找所有匹配项,返回列表search()
: 搜索整个字符串,返回第一个匹配对象match()
: 从字符串开头匹配,更加严格
基础正则语法
import re# 基本匹配
text = "abcdefghijklmn12345"
print(re.findall(r'jkl', text)) # ['jkl']# 位置匹配
print(re.findall(r'^abc', text)) # ['abc'] - 以abc开头
print(re.findall(r'45$', text)) # ['45'] - 以45结尾# 字符类匹配
print(re.findall(r'\d', text)) # 所有数字
print(re.findall(r'\D', text)) # 所有非数字
print(re.findall(r'\w', text)) # 所有字母和数字
量词和重复
text = "a ab abb abbbbb"
print(re.findall(r'ab*', text)) # a后跟0个或多个b
print(re.findall(r'ab+', text)) # a后跟1个或多个b
print(re.findall(r'ab?', text)) # a后跟0个或1个b
print(re.findall(r'ab{2,4}', text)) # a后跟2-4个b
实用案例
1. 电话号码验证
phone_pattern = r'^010-\d{8}$'
phone_number = "010-12345678"
if re.match(phone_pattern, phone_number):print("有效的电话号码")
2. 邮箱验证
email_pattern = r'^[a-zA-Z0-9]{4,20}@(163|126|qq|gmail)\.com$'
email = "user123@qq.com"
if re.match(email_pattern, email):print("有效的邮箱地址")
3. HTML内容提取
html = '<div><a href="https://www.baidu.com">去百度</a></div>'# 提取链接文本
text_pattern = r'<a.*?>(.*?)</a>'
texts = re.findall(text_pattern, html)
print(texts) # ['去百度']# 提取URL
url_pattern = r'<a.*?href="(.*?)".*?>'
urls = re.findall(url_pattern, html)
print(urls) # ['https://www.baidu.com']
高级技巧
1. 编译正则表达式
# 提高性能,特别是重复使用时
pattern = re.compile(r'\d{2}')
result = pattern.search("abc123def")
print(result.group()) # '12'
2. 使用迭代器
# 处理大量匹配时节省内存
iterator = re.finditer(r'\d{3}', 'abc123def456')
for match in iterator:print(match.group()) # '123', '456'
3. 贪婪与非贪婪匹配
text = "<h1>标题1</h1><h2>标题2</h2>"
greedy = re.findall(r'<.*>', text) # 贪婪匹配
non_greedy = re.findall(r'<.*?>', text) # 非贪婪匹配
print(greedy) # ['<h1>标题1</h1><h2>标题2</h2>']
print(non_greedy) # ['<h1>', '</h1>', '<h2>', '</h2>']
三、异常处理:让程序更健壮
异常处理是编写健壮程序的关键技能。Python的异常处理机制让我们能够优雅地处理运行时错误。
基本异常处理结构
try:# 可能出错的代码result = 10 / 0
except ZeroDivisionError:# 处理特定异常print("不能除以零")
except Exception as e:# 处理其他异常print(f"发生了未知错误: {e}")
finally:# 无论是否出错都会执行print("清理工作")
常见异常类型
# ValueError - 值错误
try:int("abc")
except ValueError as e:print(f"值转换错误: {e}")# KeyError - 键错误
try:data = {"name": "张三"}print(data["age"])
except KeyError as e:print(f"键不存在: {e}")# IndexError - 索引错误
try:lst = [1, 2, 3]print(lst[5])
except IndexError as e:print(f"索引超出范围: {e}")# FileNotFoundError - 文件不存在
try:with open("不存在的文件.txt", "r") as f:content = f.read()
except FileNotFoundError as e:print(f"文件未找到: {e}")
多重异常处理
def process_data(data):try:# 尝试转换数据number = int(data)# 尝试计算result = 100 / numberreturn resultexcept ValueError:print("输入的不是有效数字")except ZeroDivisionError:print("不能除以零")except Exception as e:print(f"其他错误: {e}")finally:print("数据处理完成")
自定义异常
class CustomError(Exception):def __init__(self, message):self.message = messagesuper().__init__(self.message)def check_balance(balance, amount):if balance < amount:raise CustomError("余额不足")return balance - amount# 使用自定义异常
try:result = check_balance(100, 150)
except CustomError as e:print(f"交易失败: {e}")
实际应用示例
import random
import redef safe_user_input():"""安全的用户输入处理"""try:age = input("请输入您的年龄: ")# 验证输入格式if not re.match(r'^\d+$', age):raise ValueError("年龄必须是数字")age_int = int(age)# 验证年龄范围if age_int < 0 or age_int > 150:raise ValueError("年龄必须在0-150之间")return age_intexcept ValueError as e:print(f"输入错误: {e}")return Noneexcept KeyboardInterrupt:print("\n用户取消了输入")return Noneexcept Exception as e:print(f"未知错误: {e}")return None# 使用示例
user_age = safe_user_input()
if user_age is not None:print(f"您的年龄是: {user_age}")
总结
本文介绍了Python编程中的三个重要概念:
- 随机数生成:掌握
random
模块的各种函数,能够生成不同类型的随机数据,应用于游戏、测试和数据模拟等场景。 - 正则表达式:学会使用
re
模块进行文本匹配和处理,这是数据处理和网页爬取的基础技能。 - 异常处理:通过
try-except-finally
结构编写健壮的程序,优雅地处理各种运行时错误。
这三个技能相互补充,在实际开发中经常配合使用。掌握它们将大大提升你的Python编程能力,让你能够编写更加专业和可靠的程序。
记住,编程是一个实践性很强的技能,建议你亲自动手编写和运行这些示例代码,在实践中加深理解和掌握这些重要概念。