Python正则表达式re模块核心功能详解
在Python中,处理正则表达式的标准库是re。你可以把它想象成一把文本处理的“瑞士军刀”,专门用来在海量文本中查找、提取、替换或验证特定格式的字符串。 一、核心工具箱:5个最常用的方法在使用前,记得先导入模块:import re 方法 作用 形象比喻 返回值 re.match() 从开头匹配 “必须从门口进入” 匹配成功返回对象,失败返回None re.search() 扫描全文找第一个 “在屋里找一遍,找到就停” 匹配成功返回对象,失败返回None re.findall() 找到所有匹配项 “把所有符合条件的都抓出来” 列表 ['a', 'b', ...] re.sub() 替换文本 “把这里的A换成B” 替换后的新字符串 re.split() 按规则分割 “按这个符号切开” 分割后的列表 二、代码实战:一看就懂1. 查找与提取(search vs findall)如果你想提取文本中的手机号或数字: 123456789101112import retext = "我的手机号是 13800138000,备...
Python正则表达式re.IGNORECASE使用指南
一、什么是re.IGNORECASE?re.IGNORECASE是Python re模块中的一个标志(Flag),用于在执行正则表达式匹配时忽略字母的大小写。它的简写形式是re.I。 二、为什么使用它?默认情况下,正则表达式是区分大小写的。例如,模式python只能匹配小写的"python",无法匹配"Python"或"PYTHON"。使用re.IGNORECASE可以解决这个问题,让匹配过程对大小写不敏感,这在处理用户输入、日志分析或关键词搜索时非常实用。 三、如何使用?1. 在函数中直接使用123456789101112import retext = "The quick Brown fox jumps over the lazy dog."pattern = "brown"# 不加re.IGNORECASE,匹配失败result1 = re.search(pattern, text)print(result1) # 输出: None# 加上re.IGNORECASE,成功匹...
Python模块与包深度解析
一、什么是模块?在Python中,模块是一个包含Python定义和语句的文件。文件名就是模块名加上.py后缀。例如,一个名为my_module.py的文件就是一个名为my_module的模块。 二、导入模块1. 基本导入1234import my_module# 使用模块中的函数my_module.say_hello() 2. 导入特定函数1234from my_module import say_hello# 直接使用函数say_hello() 3. 导入所有函数1234from my_module import *# 直接使用模块中的所有函数say_hello() 4. 导入并别名12345678910import my_module as mm# 使用别名访问模块mm.say_hello()# 或者from my_module import say_hello as sh# 使用别名访问函数sh() 三、模块的搜索路径当你导入一个模块时,Python会按照以下顺序搜索模块: 当前目录 PYTHONPATH环境变量中指定的目录 标准库目录 任何.pth文件中指定的目...
Python文件操作深度解析
一、文件操作的基本概念在Python中,文件操作是一个非常基础但重要的功能。Python提供了多种方式来处理文件,包括打开、读取、写入、关闭等操作。 二、文件的打开与关闭1. 基本打开方式12345# 打开文件f = open('file.txt', 'r')# 关闭文件f.close() 2. 使用with语句为了避免忘记关闭文件,我们可以使用with语句,它会自动处理文件的关闭: 1234with open('file.txt', 'r') as f: # 处理文件 pass# 文件会自动关闭 三、文件的读取1. 读取整个文件123with open('file.txt', 'r') as f: content = f.read() print(content) 2. 逐行读取123with open('file.txt', 'r') as f: for line in f: ...
Python海象运算符深度解析
一、什么是海象运算符?海象运算符(Walrus Operator)是Python 3.8引入的新特性,它的语法是:=,读作“赋值表达式”。这个运算符的名字来源于它的外观,:= 看起来像一只眼睛和两颗长牙的海象。 二、与C++=运算符的区别与C++中=运算符不同,Python中的:=运算符在赋值后返回结果,而不是赋值前返回结果: C++:=运算符在赋值前返回结果,而不是赋值后返回结果 Python::=运算符在赋值后返回结果,而不是赋值前返回结果 三、海象运算符的使用场景1. 在if语句中12345678# 传统写法user_input = input("请输入:")if user_input: print(f"你输入了:{user_input}")# 使用海象运算符if (user_input := input("请输入:")): print(f"你输入了:{user_input}") 2. 在while循环中123456789# 传...
Python异常继承体系深度解析
一、异常继承体系的基本结构Python的内置异常继承体系是一个典型的“基类-派生类”家族结构。这个体系设计得非常精巧,它允许我们在写代码时,既可以抓具体的错,也可以抓“一类”错。 1. 核心继承关系 BaseException:所有异常的基类,包含系统退出相关的异常(如SystemExit) Exception:所有用户代码可处理的异常的基类 常见的派生异常: ArithmeticError:算术错误(如ZeroDivisionError) LookupError:查找错误(如KeyError, IndexError) ValueError:值错误 TypeError:类型错误 ImportError:导入错误 二、多态(Polymorphism)的绝佳体现Python的异常处理机制底层利用了“子类对象可以被视为父类对象”的多态特性。 1. 示例:捕获LookupError12345678data = {"name": "Alice"}try: # 尝试访问不存在的键 print(data["...
Python异常处理深度解析
一、异常的基本概念在Python中,异常是指程序执行过程中发生的错误。当程序遇到错误时,会抛出异常,如果不处理这些异常,程序会终止执行。 二、异常处理的基本语法1. try-except语句123456try: # 可能会抛出异常的代码 result = 10 / 0except ZeroDivisionError: # 处理ZeroDivisionError异常 print("除数不能为零") 2. 捕获多个异常12345678910try: # 可能会抛出异常的代码 result = int(input("请输入一个数字")) print(10 / result)except ZeroDivisionError: # 处理ZeroDivisionError异常 print("除数不能为零")except ValueError: # 处理ValueError异常 print("请输入有效的数字") 3. 捕获所有异常123456t...
Python的“欺骗性”语法:为什么说 obj.name 本质上就是 obj.getter()?
一、引言:一个“错误”的直觉从初学者的视角切入:我们通常认为 self.name = name 就是把数据存进字典,self.name 就是把数据取出来。但在处理复杂对象(如Django模型、Pydantic、@property)时,这种理解是完全错误的。在Python的高级世界里,. 和 = 只是表象,真正的幕后黑手是 Getter 和 Setter。 二、第一层洋葱:@property 的伪装展示一段标准的 @property 代码: 12345678910111213141516class Student: def __init__(self, name): self.name = name @property def name(self): return self._name @name.setter def name(self, value): self._name = value# 看起来像是在访问属性,但实际上是在调用方法s = Student("Alice")print(s...
Python多进程编程深度解析
一、多进程的基本概念在Python中,进程是程序执行的独立单元。多进程编程允许程序同时执行多个任务,充分利用多核CPU的性能。与多线程不同,多进程不受GIL(全局解释器锁)的限制,可以真正实现并行执行。 二、进程的创建与启动1. 使用multiprocessing模块123456789101112131415161718192021import multiprocessingimport timedef task(name): print(f"Task {name} started") time.sleep(2) print(f"Task {name} completed")# 创建进程process1 = multiprocessing.Process(target=task, args=('A',))process2 = multiprocessing.Process(target=task, args=('B',))# 启动进程proce...
Python多线程编程深度解析
一、多线程的基本概念在Python中,线程是程序执行的最小单位。多线程编程允许程序同时执行多个任务,提高程序的执行效率。 二、线程的创建与启动1. 使用threading模块123456789101112131415161718192021import threadingimport timedef task(name): print(f"Task {name} started") time.sleep(2) print(f"Task {name} completed")# 创建线程thread1 = threading.Thread(target=task, args=('A',))thread2 = threading.Thread(target=task, args=('B',))# 启动线程thread1.start()thread2.start()# 等待线程完成thread1.join()thread2.join()print(&q...
Python函数式编程入门:高阶函数与“回调”机制的深度解析
一、引言:从“万物皆对象”切入在Python中,我们常说“万物皆对象”。整数是对象,字符串是对象,那么函数呢?答案是肯定的。既然函数也是对象,它就可以像变量一样被赋值、被传递。这就引出了Python中极具威力的概念——高阶函数。 二、什么是高阶函数?简单来说,如果一个函数满足以下任一条件,它就是高阶函数: 接收一个或多个函数作为输入参数 返回一个函数作为输出结果 今天我们要重点讨论的是第一种情况:把函数当作参数传递。 三、核心疑问:参数到底由谁决定?当你把一个函数(比如my_func)传递给另一个函数(比如executor)时,很多初学者会困惑:my_func需要的参数是谁给的? 答案是:由调用它的高阶函数(executor)决定。 这就好比你在C++中传递一个函数指针。你把“枪”(函数)交给了“士兵”(高阶函数),至于士兵什么时候开枪(调用函数)、朝哪里开枪(传入什么参数),完全由士兵的逻辑决定,而不是由枪自己决定。 在Python中,这被称为“回调”机制的一种体现。被传递的函数处于“被动”地位,它等待着高阶函数在特定的时机,用特定的数据来激活它。 四、实战演练:从内置函数...
Python @property高级应用技巧
一、数据校验与约束这是@property最常见的用途。当你需要确保某个属性的值符合特定规则时(例如,年龄不能为负数),可以使用它: 传统方式:需要显式调用set_age()方法 使用@property:可以像给普通属性赋值一样obj.age = 25,但赋值操作会触发你预设的校验逻辑 1234567891011121314151617181920class 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): """设置年龄,并进行校验""" ...
技术笔记:Python与C++函数参数传递机制差异
技术笔记:Python与C++函数参数传递机制差异在跨语言开发中,函数参数处理是一个常见的痛点。当函数拥有多个默认参数时,如何优雅地调用它?这是本文要探讨的核心问题。 一、Python的关键字参数机制Python的关键字参数机制允许开发者通过参数名直接指定值,而不必严格按照函数定义的顺序传递参数: 12345678def configure_connection(host="localhost", port=8080, timeout=30, retry=False, ssl=True): print(f"Configuring connection: host={host}, port={port}, timeout={timeout}, retry={retry}, ssl={ssl}")# 只修改timeout参数configure_connection(timeout=60)# 跳跃式修改多个参数configure_connec...
Python self与cls的区别深度解析
一、核心区别对比 特性 self (实例方法) cls (类方法 @classmethod) 代表对象 实例对象 (具体的某一个) 类对象 (整个类别/图纸) 第一个参数 接收调用该方法的实例 接收调用该方法的类 访问权限 访问实例属性(self.name) 和类属性 只能访问类属性(cls.count) 主要职责 处理具体业务逻辑,修改个体状态 修改全局状态、工厂模式创建实例 调用方式 通常通过 实例.方法() 调用 通常通过 类.方法() 调用 二、形象类比:汽车工厂为了更直观地理解,我们可以把类想象成一个汽车工厂,把实例想象成造出来的汽车: 1. self (实例方法) — 针对具体的车 场景:给车喷漆、踩油门、换轮胎 逻辑:你必须先有一辆车(实例),才能做这些操作。你不能对着空气踩油门 代码体现:self.color = "Red"(把这一辆车喷红,不影响别的车) 2. cls (类方法) — 针对工厂/图纸 场景:修改出厂默认颜色、统计总共造了多少辆车、决定下一代车型的引擎规格 逻辑:这些操作不需要...
Python @property装饰器核心机制解析
引言"明明定义了@property,为什么在init里给它赋值却提示can't set attribute?"——这是无数Python初学者踩过的坑。今天,我们从这个报错出发,彻底搞懂@property的底层逻辑。 一、错误现场:一个"只读"的陷阱先看这段看似合理的代码: 1234567class Student: def __init__(self, name): self.name = name # 这里会报错! @property def name(self): return self._name 运行后抛出AttributeError: can't set attribute。为什么?因为Python将@property装饰的name视为"只读属性"——你只定义了"读取方法"(getter),却没提供"写入方法"(setter),就像给变量装了个"只读开关",自然无法赋值。 二、核心机制:...
Python sorted函数key参数深度解析
在Python中,sorted函数是一个强大的排序工具,而其中的key参数更是其最核心、最灵活的功能之一。本文将深入解析key参数的工作原理和使用技巧,帮助你在各种场景下优雅地实现排序需求。 一、key参数的基本原理key参数接收一个函数,这个函数会被应用到列表中的每一个元素上。sorted不会直接比较元素本身,而是比较这个函数处理元素后返回的"结果"。你可以把它想象成给每个元素贴一个"标签",排序是根据"标签"的内容来排,而不是根据元素本身。 二、key参数的三种传参方式1. 使用lambda表达式(最常用)当你需要快速定义一个简单的规则(比如按字典的某个键、按对象的某个属性)时,lambda是最方便的。 1234567891011users = [ {"name": "Alice", "age": 25}, {"name": "Bob", "age": 20...
Python @classmethod 本质上就是C++ 的静态成员?
一、引言:一个跨语言的困惑当Python 中看到@classmethod 和cls 参数时,C++ 程序员的第一反应是“这有什么用?不就是个普通函数吗?”。但实际上,@classmethod 的存在是为了解决“类级别”的数据共享和操作,这与 C++ 的static 不谋而合。 二、 相同点:都属于“类”而非“对象”无论是Python 的@classmethod 还是 C++ 的static 函数,它们的核心特征都是一致的: 调用方式:都可以不创建实例,直接通过类名来调用 职责范围:它们处理的是与整个类相关的事务,而不是某个具体对象的私有数据 Python 的实现(@classmethod)12345678910111213141516171819202122232425class Person: # 类变量,所有实例共享 count = 0 def __init__(self, name): self.name = name # 每创建一个实例,就调用类方法来增加计数 Person.increment_count()...
Python函数:平方函数的完整实现
Python函数:平方函数的完整实现在Python中,函数是代码组织的基本单位。本文将介绍一个完整的Python平方函数实现,包括参数验证、异常处理和类型注解。 一、函数定义12345678910111213def square(n: int) -> int: """ 计算一个整数的平方 :param n: 输入整数 :type n: int :return: 输入整数的平方 :rtype: int :raise: ValueError """ if not isinstance(n, int): raise ValueError("Input must be an integer") return n * n 二、函数分析1. 函数签名1def square(n: int) -> int: 函数名:square,直观表示函数功能 参数:n,类型注解为int,表示接受一个整数 返回类型:-> in...
Python库与模块解析
哈佛CS50P课程的第四周专注于"资源库(Libraries)"主题,教授如何利用Python标准库和第三方包来提高开发效率。本文将详细介绍这一周的核心内容。 一、核心理念:代码复用1. 为什么要使用资源库David Malan教授指出:编程不应该总是从零开始。资源库是别人(或自己)编写的代码文件,旨在通过模块化(Modules)鼓励代码复用,避免机械的复制粘贴。 12345678# 不推荐:重复造轮子def calculate_circle_area(radius): import math return math.pi * radius ** 2# 推荐:使用已有的模块import matharea = math.pi * 5 ** 2 2. 模块化的优势 代码复用:避免重复编写相同的代码 维护性好:集中管理,便于更新 可读性高:代码结构清晰,易于理解 协作方便:团队成员可以共享使用 二、导入的艺术:import vs from1. import模块123456# 导入整个模块import random# 调用函数时需要带前缀random_...
Python测试框架:pytest与assert断言
Python提供了多种测试工具,其中pytest是最流行的单元测试框架之一。本文将介绍Python中的assert语句以及pytest框架的基本用法。 一、assert语句1. 基本用法1234567# assert 条件x = 10assert x > 0 # 条件为True,无输出# assert 条件, 错误信息x = -5assert x > 0, "x必须大于0" # 抛出AssertionError 2. 常见用途12345678910def divide(a, b): assert b != 0, "除数不能为零" return a / bdef validate_age(age): assert 0 <= age <= 150, "年龄必须在0到150之间" return ageprint(validate_age(25)) # 正常# validate_age(-5) # 抛出AssertionError 二、pytest框架1. 基本安装和使...
Python引用机制:无指针设计与内存管理
Python是一种高级编程语言,其设计理念之一就是让开发者无需关心底层的内存管理。因此,Python中没有像C或C++那样的指针概念。本文将介绍Python的引用机制以及它与指针的区别。 一、Python的引用机制1. 变量即引用在Python中,变量更像是标签或引用,而不是存储数据的容器: 1234567891011# 创建变量x = 10y = xprint(x) # 10print(y) # 10# x和y指向同一个对象y = 20print(x) # 10(x不受影响)print(y) # 20 2. 对象与引用Python中的每个对象都有: 身份(id):对象的唯一标识 类型(type):对象的类型 值(value):对象的值 123456x = [1, 2, 3]y = xprint(id(x)) # 对象身份print(id(y)) # 相同身份print(x is y) # True:x和y指向同一对象 二、可变对象与不可变对象1. 不可变对象不可变对象包括:整数、浮点数、字符串、元组等 1234567# 不可变对象x = 10y = xy ...
Python IO操作:文件读写与标准输入输出
Python的IO(输入/输出)操作是编程中非常基础且重要的部分,它允许程序与外部世界进行交互。本文将详细介绍Python中的文件读写操作、标准输入输出以及相关的最佳实践。 一、文件读写操作1. 打开和关闭文件在Python中,使用open()函数打开文件,使用close()方法关闭文件。 123456789# 打开文件file = open('example.txt', 'r')# 操作文件content = file.read()print(content)# 关闭文件file.close() 2. 文件打开模式 模式 描述 r 只读模式(默认) w 写入模式,会覆盖现有文件 a 追加模式,在文件末尾添加内容 x 独占创建模式,如果文件已存在则报错 b 二进制模式 t 文本模式(默认) + 读写模式 12345678# 二进制模式打开with open('image.jpg', 'rb') as f: data = f.read()# 读写模...
Python数据结构:列表与字典操作
Python中的列表(List)和字典(Dictionary)是两种最常用的数据结构。列表类似于数组,字典是一种键值对数据结构。本文将详细介绍这两种数据结构的用法。 一、列表(List)1. 基本操作123456789101112# 创建列表fruits = ["apple", "banana", "cherry"]numbers = [1, 2, 3, 4, 5]mixed = [1, "hello", 3.14, True]# 访问元素print(fruits[0]) # appleprint(fruits[-1]) # cherry# 修改元素fruits[0] = "orange"print(fruits) # ['orange', 'banana', 'cherry'] 2. 列表方法12345678910111213141516# 添加元素fruits = ["apple", &q...
Python循环结构:while与for迭代器详解
Python提供了两种主要的循环结构:while循环和for循环。本文将详细介绍这两种循环的使用方法,以及range()迭代器的使用。 一、while循环1. 基本语法12345count = 0while count < 5: print(count) count += 1# 输出:0, 1, 2, 3, 4 2. while-else结构123456count = 0while count < 5: print(count) count += 1else: print("循环正常结束") # 循环正常结束时执行 3. 无限循环12345while True: user_input = input("输入 'quit' 退出: ") if user_input == "quit": break print(f"你输入了: {user_input}") 二、for循环1. 基本语法...
Python匹配语句:match-case与switch对比
Python 3.10引入了match语句,这是一种强大的模式匹配机制,类似于其他语言中的switch语句,但功能更加强大。本文将详细介绍Python中match语句的用法。 一、match语句的基本用法1. 基本语法1234567891011121314def http_status(status): match status: case 200: return "OK" case 404: return "Not Found" case 500: return "Internal Server Error" case _: return "Unknown"print(http_status(200)) # 输出:OKprint(http_status(404)) # 输出:Not Foundprint(http_status(999)) ...

