AI-Agent 面试题汇总 - Python基础
1. Python 与 Java/C++ 的核心区别是什么?
答案:
- Python 是解释型、动态类型语言;Java/C++通常是编译型(Java半编译半解释)、静态类型。
- Python 语法简洁,开发效率高;Java/C++执行性能通常更高。
- Python 更适合脚本、数据分析、AI、快速开发;Java/C++常用于大型工程、底层和高性能场景。
- Python 内存管理自动(GC+引用计数),C++可手动控制内存。
2. Python 是编译型还是解释型语言?如何理解?
答案:Python通常称为解释型语言,但严格讲是“先编译为字节码,再由解释器执行”。
流程:
- 源码 .py
- 编译成字节码 .pyc
- Python虚拟机(PVM)解释执行字节码
3. Python 的动态类型是什么意思?优缺点是什么?
答案:动态类型指:变量类型在运行时确定,变量本身不绑定固定类型。
优点:
- 开发快、写法灵活
缺点:
- 运行时才发现部分类型错误
- 大型项目类型约束弱(可用 type hint 改善)
4. Python 中标识符命名规则有哪些?
答案:
- 由字母、数字、下划线组成
- 不能以数字开头
- 区分大小写
- 不能使用关键字(如 if, for, class)
- 推荐:变量/函数小写下划线,类名驼峰(PascalCase)
5. Python 中 is 和 == 的区别是什么?
答案:
- ==:比较值是否相等
- is:比较是否是同一个对象(内存地址)
a = [1, 2] b = [1, 2] print(a == b) # True print(a is b) # False
6. Python 中 None、False、0、空字符串的区别是什么?
答案:它们含义不同:
- None:空对象/无值
- False:布尔假
- 0:数值零
- "":空字符串
在布尔上下文中都为假,但互不等价(除部分宽松比较场景)。
print(bool(None), bool(False), bool(0), bool("")) # 全是 False
print(None == 0) # False
print(False == 0) # True(布尔是整型子类)
7. Python 的三元表达式怎么写?
答案:语法:值1 if 条件 else 值2
age = 20 msg = "成年" if age >= 18 else "未成年" print(msg)
8. *args 和 **kwargs 的作用是什么?
答案:
- *args:接收任意数量的位置参数(元组)
- **kwargs:接收任意数量的关键字参数(字典)
def func(*args, **kwargs):
print(args) # tuple
print(kwargs) # dict
func(1, 2, 3, name="Tom", age=18)
9. Python 中常见的数据类型有哪些?
答案:
- 数值:int, float, bool, complex
- 序列:str, list, tuple
- 集合:set
- 映射:dict
- 空类型:NoneType
10. Python 中如何进行输入输出?print() 常用参数有哪些?
答案:
- 输入:input()
- 输出:print()
print() 常用参数:
- sep:分隔符
- end:结尾符
- file:输出到文件
- flush:是否立即刷新缓冲区
name = input("请输入姓名: ")
print("你好", name, sep="-", end="!\n")
11. 列表(list)和元组(tuple)的核心区别是什么?
答案:
- list 可变,tuple 不可变
- list 用 [],tuple 用 ()
- tuple 在只读场景更安全,且通常更省内存
12. Python 的可变类型和不可变类型有哪些?
答案:
- 可变:list, dict, set
- 不可变:int, float, bool, str, tuple
13. 字典(dict)的底层结构是什么?查找为什么快?
答案:dict 底层是哈希表。 通过 key 计算哈希值直接定位槽位,平均时间复杂度接近 O(1),所以查找/插入快。
14. 集合(set)的主要特点和使用场景是什么?
答案:特点:
- 元素无序、不重复
- 基于哈希表,查找快
- 支持交并差等集合运算
场景:
- 去重
- 成员快速判断
- 标签/ID集合计算
15. 如何删除 list 中的重复元素?请给出多种方式。
答案:
lst = [1, 2, 2, 3, 1, 4]
# 方法1:set去重(不保证顺序)
print(list(set(lst)))
# 方法2:保持顺序
print(list(dict.fromkeys(lst)))
# 方法3:手动遍历
res = []
for x in lst:
if x not in res:
res.append(x)
print(res)
16. 列表推导式的语法是什么?相比 for 循环的优势?
答案:语法:[表达式 for 变量 in 可迭代对象 if 条件] 优势:代码更简洁、可读性高,通常性能略优。
nums = [1, 2, 3, 4, 5] squares = [x * x for x in nums if x % 2 == 1] print(squares) # [1, 9, 25]
17. 什么是浅拷贝和深拷贝?两者区别是什么?
答案:
- 浅拷贝:只拷贝最外层,内部嵌套对象共享
- 深拷贝:递归拷贝所有层,互不影响
import copy a = [[1, 2], [3, 4]] b = copy.copy(a) # 浅拷贝 c = copy.deepcopy(a) # 深拷贝
18. Python 中如何拷贝一个对象?
答案:
- 赋值:b = a(不是拷贝,是同一对象引用)
- 浅拷贝:copy.copy(a) / 切片 a[:](部分类型)
- 深拷贝:copy.deepcopy(a)
19. Python 中 break、continue、pass 的区别?
答案:
- break:直接终止当前循环
- continue:跳过本次循环后续语句,进入下一轮
- pass:占位语句,什么都不做
20. 函数参数传递是值传递还是引用传递?
答案:Python 采用“对象引用传递”(传对象的引用副本)。
- 对不可变对象,看起来像值传递
- 对可变对象,函数内修改可能影响外部
def f(x):
x.append(4)
a = [1, 2, 3]
f(a)
print(a) # [1, 2, 3, 4]
21. 默认参数为什么建议不要使用可变对象?
答案:默认参数在函数定义时只创建一次,可变对象会被多次调用共享,导致“脏数据”。
def bad_func(x, lst=[]):
lst.append(x)
return lst
print(bad_func(1)) # [1]
print(bad_func(2)) # [1, 2] (通常不是期望行为)
正确写法:
def good_func(x, lst=None):
if lst is None:
lst = []
lst.append(x)
return lst
22. lambda 表达式格式是什么?常见应用场景有哪些?
答案:格式:lambda 参数: 表达式 常见场景:排序 key、map/filter/reduce、短小回调函数。
students = [("Tom", 90), ("Amy", 95), ("Bob", 85)]
students.sort(key=lambda x: x[1], reverse=True)
print(students)
23. 如何判断一个数是否为素数(手写函数)?
答案:思路:只需检查 2 ~ sqrt(n) 是否有因子。
def is_prime(n: int) -> str:
if n <= 1:
return "NO"
if n == 2:
return "YES"
if n % 2 == 0:
return "NO"
i = 3
while i * i <= n:
if n % i == 0:
return "NO"
i += 2
return "YES"
print(is_prime(17)) # YES
print(is_prime(18)) # NO
24. 如何模拟实现一个 sorted() 函数(思路题)?
答案:可手写冒泡/选择/快速排序;面试中常写快速排序或归并排序。下面给出简洁版快速排序:
def my_sorted(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr)//2]
left = [x for x in arr if x < pivot]
mid = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return my_sorted(left) + mid + my_sorted(right)
print(my_sorted([3, 1, 5, 2, 4]))
25. try-except-else-finally 的执行顺序是什么?
答案:
- 先执行 try
- 若异常:执行匹配的 except
- 若无异常:执行 else
- 无论是否异常,最后都执行 finally
26. else 和 finally 分别在什么场景使用?
答案:
- else:仅在 try 无异常时执行(放成功逻辑)
- finally:一定执行(资源释放,如文件关闭、数据库连接关闭)
try:
f = open("a.txt", "r", encoding="utf-8")
except FileNotFoundError:
print("文件不存在")
else:
print("读取成功")
finally:
print("结束处理(可做清理)")
27. 如何捕获多个异常?如何自定义异常?
答案:
# 捕获多个异常
try:
x = int("abc")
except (ValueError, TypeError) as e:
print("异常:", e)
# 自定义异常
class MyError(Exception):
pass
def check_age(age):
if age < 0:
raise MyError("年龄不能为负数")
try:
check_age(-1)
except MyError as e:
print(e)
28. 如何在 D 盘创建 test.txt 并写入 helloworld?
答案:
path = r"D:\test.txt"
with open(path, "w", encoding="utf-8") as f:
f.write("helloworld")
print("写入完成")
29. 文件打开模式 r / w / a / a+ 的区别是什么?
答案:
- r:只读,文件不存在报错
- w:只写,存在则清空,不存在则创建
- a:追加写,不清空
- a+:追加读写,写入在末尾
30. 什么是迭代器(iterator)?适合用在什么场景?
答案:迭代器是实现了 __iter__() 和 __next__() 的对象,可逐个返回元素。 适合:大数据量、惰性遍历、节省内存场景。
nums = iter([1, 2, 3]) print(next(nums)) print(next(nums))
31. 什么是生成器(generator)?和迭代器的关系是什么?
答案:生成器是特殊迭代器,使用 yield 产生值,按需生成,不一次性占用大量内存。 所有生成器都是迭代器。
def gen():
for i in range(3):
yield i
g = gen()
for x in g:
print(x)
32. yield 和 return 的区别是什么?
答案:
- return:函数结束并返回一个值
- yield:返回一个值并“暂停”函数状态,下次继续执行
33. 什么是闭包?Python 中如何实现闭包?
答案:闭包:内部函数引用了外部函数作用域变量,并在外部函数返回后仍可访问这些变量。
def outer(x):
def inner(y):
return x + y
return inner
add10 = outer(10)
print(add10(5)) # 15
34. __new__ 和 __init__ 的区别是什么?
答案:
- __new__:创建对象(返回实例)
- __init__:初始化对象属性(对象创建后调用)
__new__ 先于 __init__ 执行,常用于单例、不可变对象子类化等高级场景。
35. 装饰器的本质是什么?常见应用场景有哪些?
答案:本质:接收函数并返回新函数的高阶函数,用于不修改原函数代码前提下增强功能。 常见场景:日志、鉴权、性能统计、缓存、重试。
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
print(f"耗时: {time.time() - start:.6f}s")
return res
return wrapper
@timer
def work():
sum(range(1000000))
work()
本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以“原理+场景+实战”为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.
查看6道真题和解析
拼多多集团-PDD公司氛围 753人发布