AI大模型入门-Python进阶-常用函数
视频链接:
不如语冰
https://space.bilibili.com/70431433?spm_id_from=333.1007.0.0
文章代码链接:
GitHub - zyf-ngu/Qmatter: 跟着问题学-AI大模型入门系列笔记和代码 · GitHub
10常用函数
==None,is None
copy与deepcopy
在Python中,copy()和deepcopy()都是用于创建对象副本的函数,核心差别在于创建的副本和原来对象之间的关系,即改变副本影不影响原来对象。
浅拷贝(copy()):只拷贝父对象,不会拷贝对象的内部的子对象。拷贝后的对象与原对象共享子对象,所以如果原始对象中的子对象是可变的,改变它将会影响拷贝后的对象。
深拷贝(deepcopy()):拷贝父对象和所有子对象。因此,深拷贝后的对象与原始对象没有任何关联。
使用copy模块中的copy()和deepcopy()函数。需要先导入copy模块。
import copy
# 原始列表
original = [1, 2, [3, 4]]
print("原始列表:", original)
# 浅拷贝
shallow = copy.copy(original)
shallow[0] = 10 # 修改第一层元素
shallow[2][0] = 30 # 修改第二层元素
print("浅拷贝后修改:")
print("原始列表:", original) # [1, 2, [30, 4]] - 内部子对象列表被修改,数值1不变
print("浅拷贝列表:", shallow) # [10, 2, [30, 4]]-
original = [1, 2, [3, 4]]# 重置
# 深拷贝
deep = copy.deepcopy(original)
deep[0] = 10 # 修改第一层元素
deep[2][0] = 30 # 修改第二层元素
print("\n深拷贝后修改:")
print("原始列表:", original) # [1, 2, [3, 4]] - 完全不受影响
print("深拷贝列表:", deep) # [10, 2, [30, 4]]
海象运算符-冒号等号(:=)
冒号等号(:=)是Python 3.8版本引入的“海象运算符”,用于将表达式的值赋给变量并同时使用该值。它可以在条件表达式、循环条件和列表解析中使用,
length = len(my_list):是赋值语句(statement),只能作为独立的一行代码存在,不能直接放在表达式中(如条件判断、函数参数里)。
# 正确:作为独立语句
length = len([1,2,3])
# 错误:不能直接放在表达式中if length = len([1,2,3]) > 0: # SyntaxError: invalid syntax
print("非空")
使用海象运算符 (:=) 实现 条件判断与赋值同时进行
length := len(my_list):是赋值表达式(expression),可以嵌入到其他表达式中(如条件判断、循环、函数调用等),同时完成赋值和使用。
# 正确:嵌入到条件表达式中
if (length := len([1,2,3])) > 0:
print(f"长度为:{length}") # 输出:长度为:3
getattr和 setattr
getattr和 setattr 是 Python 内置函数,用于动态地获取和设置对象的属性。它们允许在运行时通过字符串来操作属性。
这2个函数是在代码运行过程中,手动地获取和设置类的属性,为什么不直接通过类名.属性操作呢?其中一个可能的原因是:比如通过config批量传递字典参数时,便可以通过setattr批量设置类的属性。
1. getattr 函数
功能:动态获取对象的属性值 语法:getattr(object, attribute_name[, default])
object:目标对象
attribute_name:属性名字符串
default:可选,属性不存在时返回的默认值
class User:
def __init__(self, name, age):
self.name = name
self.age = age
# 创建对象
user = User("Alice", 30)
# 获取存在的属性
name= getattr(user, "name") # 等效于 user.name
print(f"Name: {name}") # 输出: Name: Alice
# 获取不存在的属性(提供默认值)
gender= getattr(user, "gender", "Unknown")
print(f"Gender: {gender}") # 输出: Gender: Unknown
# 获取不存在的属性(无默认值)
try:
getattr(user, "address") # 触发 AttributeError
except AttributeError as e:
print(f"Error: {e}") # 输出: Error: 'User' object has no attribute 'address'
2. setattr 函数
功能:动态设置对象的属性值 语法:setattr(object, attribute_name, value)
object:目标对象
attribute_name:属性名字符串
value:要设置的值
class Config:
pass
# 创建空对象
config = Config()
# 设置新属性
setattr(config, "timeout", 10) # 等效于 config.timeout = 10
print(f"Timeout: {config.timeout}") # 输出: Timeout: 10
# 修改现有属性
setattr(config, "timeout", 20)
print(f"Updated Timeout: {config.timeout}") # 输出: Updated Timeout: 20
# 动态添加方法
def log_message(self, msg):
return f"LOG: {msg}"
setattr(Config, "log", log_message) # 添加到类(所有实例共享)
print(config.log("Test")) # 输出: LOG: Test
isinstance()
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
isinstance() 与 type() 区别:
- type() 不会认为子类是一种父类类型,不考虑继承关系。
- isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
isinstance(object, classinfo)
参数
- object -- 实例对象。
- classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。
返回值
如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。
list1=[1,2,3,4]
print(isinstance(list1,list))
Zip
把两个可迭代对象按照对应顺序组成元组,然后返回一个可迭代对象。
在 Python 中,zip() 函数用于将多个可迭代对象(如列表、元组等)中的元素按位置配对,生成一个元组构成的迭代器(逐次生成数据,如需直接查看结果需用 list() 转换)。如果两个对象元素数量不相同,按照少的数量匹配,多余的会被忽略。语法为:
zip(iterable1, iterable2, ...)
假设 _splits 是一个列表,zip(_splits[0::2], _splits[1::2]):
切片提取元素得到2个列表:
_splits[0::2] → 取索引为 0, 2, 4, ... 的元素(偶数索引)
_splits[1::2] → 取索引为 1, 3, 5, ... 的元素(奇数索引)
配对元素:
zip() 将两个切片列表按顺序配对,形成 (第0个元素, 第1个元素), (第2个元素, 第3个元素), ...
示例 1:列表长度为偶数
_splits = [10, 20, 30, 40, 50, 60]
# 切片结果:
# _splits[0::2] = [10, 30, 50] ← 偶数索引
# _splits[1::2] = [20, 40, 60] ← 奇数索引
result = list(zip(_splits[0::2], _splits[1::2]))print(result) # 输出: [(10, 20), (30, 40), (50, 60)]
示例 2:列表长度为奇数(多余元素被忽略)
_splits = [10, 20, 30, 40, 50]
# 切片结果:
# _splits[0::2] = [10, 30, 50] ← 3个元素
# _splits[1::2] = [20, 40] ← 2个元素
result = list(zip(_splits[0::2], _splits[1::2]))print(result) # 输出: [(10, 20), (30, 40)] (50 被忽略)
这种操作常用于:
将相邻元素配对:
nums = [1, 2, 3, 4, 5, 6]
pairs = list(zip(nums[0::2], nums[1::2]))# 结果: [(1, 2), (3, 4), (5, 6)]
构建键值对:
keys = ["a", "b", "c"]
values = [1, 2, 3]
dict(zip(keys, values)) # → {'a': 1, 'b': 2, 'c': 3}
在rag中,可以将返回的距离和id绑定元组同时返回。
for i, (dist, idx) in enumerate(zip(distances[0], indices[0])):
更多推荐




所有评论(0)