AI-Agent 面试题汇总 - Python基础

1. Python 与 Java/C++ 的核心区别是什么?

答案:

  1. Python 是解释型、动态类型语言;Java/C++通常是编译型(Java半编译半解释)、静态类型。
  2. Python 语法简洁,开发效率高;Java/C++执行性能通常更高。
  3. Python 更适合脚本、数据分析、AI、快速开发;Java/C++常用于大型工程、底层和高性能场景。
  4. Python 内存管理自动(GC+引用计数),C++可手动控制内存。

2. Python 是编译型还是解释型语言?如何理解?

答案:Python通常称为解释型语言,但严格讲是“先编译为字节码,再由解释器执行”。

流程:

  1. 源码 .py
  2. 编译成字节码 .pyc
  3. Python虚拟机(PVM)解释执行字节码

3. Python 的动态类型是什么意思?优缺点是什么?

答案:动态类型指:变量类型在运行时确定,变量本身不绑定固定类型。

优点:

  • 开发快、写法灵活

缺点:

  • 运行时才发现部分类型错误
  • 大型项目类型约束弱(可用 type hint 改善)

4. Python 中标识符命名规则有哪些?

答案:

  1. 由字母、数字、下划线组成
  2. 不能以数字开头
  3. 区分大小写
  4. 不能使用关键字(如 if, for, class)
  5. 推荐:变量/函数小写下划线,类名驼峰(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)的核心区别是什么?

答案:

  1. list 可变,tuple 不可变
  2. list 用 [],tuple 用 ()
  3. tuple 在只读场景更安全,且通常更省内存

12. Python 的可变类型和不可变类型有哪些?

答案:

  • 可变:list, dict, set
  • 不可变:int, float, bool, str, tuple

13. 字典(dict)的底层结构是什么?查找为什么快?

答案:dict 底层是哈希表。 通过 key 计算哈希值直接定位槽位,平均时间复杂度接近 O(1),所以查找/插入快。

14. 集合(set)的主要特点和使用场景是什么?

答案:特点:

  1. 元素无序、不重复
  2. 基于哈希表,查找快
  3. 支持交并差等集合运算

场景:

  • 去重
  • 成员快速判断
  • 标签/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 中如何拷贝一个对象?

答案:

  1. 赋值:b = a(不是拷贝,是同一对象引用)
  2. 浅拷贝:copy.copy(a) / 切片 a[:](部分类型)
  3. 深拷贝: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 的执行顺序是什么?

答案:

  1. 先执行 try
  2. 若异常:执行匹配的 except
  3. 若无异常:执行 else
  4. 无论是否异常,最后都执行 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面试实战专栏 文章被收录于专栏

本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以&ldquo;原理+场景+实战&rdquo;为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.

全部评论

相关推荐

哈哈哈,你是老六:百度去年裁员分评不好,赶紧弄点红包
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务