视频链接:

不如语冰

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])):

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐