当前位置: 首页 > ds >正文

人工智能学习:Python相关面试题

1、Python与其他语言(如Java/C++)的核心区别是什么?

        Python是动态类型的解释型语言,语法简洁,支持多种编程范式(面向对象、函数式、过程式)。与Java相比, Python无需编译且语法更简洁;与C++相比,Python开发效率高但运行速度较慢,且通过解释器执行而非直接编译为机器码。

2、列表和元组的核心区别是什么?

        列表可变 ,用[]定义 ,适用于动态数据集合(如增删元素);

        元组不可变 ,用()定义 ,适用于固定数据(如字典键或配置项 且内存占用更小。

3、在异常处理中 ,else和finally块分别何时执行?举例说明其适用场景。

        else在无异常时执行(如资源初始化成功后的操作);

        finally无论是否异常均执行(如释放文件锁)。

4、解释  Python 中的三元表达式

        与 C++不同, 在  Python  中我们不需要使?符号 使如下语法:  

 [on true] if [expression]else [on false]

        如果  [expression]  为真, 则  [on true]  部分被执。如果表示为假则  [on false]  部分被执

5、Python的可变类和不可变类

(1)不可变类型 :指一旦创建 ,其值就不能被修改的类型。 当对不可变类型的数据进行操作时 ,实际上是创建了一个新的对象。Python  中常见的不可变类型有:数字(Number):包括整数(int)、浮点数(float)、复数( complex);

(2) 可变类型:指在创建后,其值可以被修改的类型。对可变类型的数据进行操作时,是在原对象上进行修改 ,不会创建新的对象。 Python  中常见的可变类型有 :列表、字典、集合

6、解释装饰器的作用及典型应用场景

        装饰器用于在不修改原函数代码的情况下扩展功能(如日志记录、性能统计、权限校验)。通过闭包实现,接收函数作为参数并返回增强后的函数。例如缓存装饰器可优化递归性能。

7、__new__和__init__的区别是什么?

__new__是类方法 ,负责创建实例并返回;

__init__是实例方法 ,负责初始化实例属性。重写__new__常用于单例模式或不可变对象定制。

8、深拷贝与浅拷贝的区别是什么?

        浅拷贝( copy.copy)仅复制对象外层引用,若对象包含可变元素(如嵌套列表),修改拷贝对象会影响原对象。深拷贝( copy.deepcopy)递归复制所有层级元素 ,完全独立于原对象。

9、什么是闭包? Python中如何实现?

        闭包是嵌套函数捕获外层作用域变量的机制。例如计数器函数可通过闭包保留计数状态 ,而无需全局变量。

        在Python中,迭代器(Iterator)是— 个可以迭代访问序列元素的对象。迭代器对象实现了两个 法:__iter__()__next__()。__iter__() 法返回迭代器对象本身 __next__() 法返回下 个元素。

        迭代器常用于遍历序列、集合、字典等容器类型数据。它的优点是可以惰性计算(lazy evaluation 即只有在需要时才会计算 ,避免了一次性加载所有数据的开销, 同时也可以节省内存空间。

Python ,使迭代器通常有以下场景:

(1)遍历 量数据集合: 当需要处理 量的数据集合时 ,使迭代器可以避免 次性加载所有数据,节省内存空间。

(2)实现自定义迭代器: 当需要遍历自定义数据结构时 ,可以通过实现迭代器对象的__iter__()__next__()方法实现自定义迭代器;

(3)实现惰性计算:当需要进行惰性计算时 ,可以使用迭代器来实现,例如通过filter()、map()等高阶函数返回一个迭代器对象来进行惰性计算。

  个使迭代器遍历列表的例 

my_list = [1, 2, 3, 4, 5]
my_iterator = iter (my_list)
while True:try:item = next (my_iterator)print (item)except StopIteration:break

10、Python生成器是什么?什么场景用到生成器?举一个例子?

        在Python  成器( Generator)是 种特殊的迭代器 ,它使用生 成器函数来 成序列中的元素  不是在内存中 次性 成所有元素。

        生成器函数是使yield关键字定义的函数 ,每次调用 生 成器函数时 ,它会返回 个迭代器对象,调next() 法时, 它会从上次暂停的位置继续执,直到遇到下 yield语句 ,然后返回 个值 ,并再次暂停。 因此,  成器可以惰性地 成序列中的元素 ,并在需要时逐个 成元素 ,避免了 次性 成所有元素所带来的内存消耗。

使用 生 成器的场景包括:

(1)   量的数据集合: 当需要  量数据时 ,使用生 成器可以避免 次性占用大 量内存空间;

(2)实现定义的迭代器 :当需要定义迭代器对象时 ,可以使用 生 成器函数来实现 ,避免了繁琐的迭代器对象的定义;

(3)实现惰性计算:当需要进 惰性计算时 可以使用 生 成器来实现 ,例如通过filter()、map()等阶函数返回  成器对象来进 惰性计算。

  个使用生 成器函数 成斐波那契数列的例 


def fibonacci (n) :a, b = 0, 1for i in range (n):yield aa, b = b, a + b
fib = fibonacci (10)
for num in fib:print (num)

        在这个例子 中,我们定义了  成器函数fibonacci(),它的参数n表示需要 成的斐波那契数列的 度。在函数中 ,我们使yield语句返回斐波那契数列中的每 个元素 ,这样每次调next()函数时, 会返回下个元素 ,并在下次调时从上次暂停的位置继续执 。最后 ,我们使for循环遍历 成器对象 ,并打印出每个元素。

11、Python多线程与多进程的区别

        在UNIX平台上,当某个进程终结之后,该进程需要被其 进程调wait,否则进程成为僵进程  (Zombie)。所以 ,有必要对每个Process对象调join() 法  (实际上等同于wait)。对于多线程来说,  由于只有 个进 ,所以不存在此必要性。

        多进程应该避免共享资源。在多线程中,我们可以 较容易地共享资源, 如使全局变量或者传 递参数。在多进程情况下, 由于每个进程有自 己 的内存空间 ,以上 法并不合适。此时我们可  以通过共享内存Manager 法来共享资源。但这样做提了程序的复杂度 ,并因为同步的需要  降低了程序的效率

12、装饰器的实质是什么?

        或者说为什么装饰器要写2层嵌套函数,里 层函数完全就已经实现了装饰的功能为什么不直接用里 层函数名作为装饰器名称?

 :装饰器是要把原来的函数装饰成新的函数 ,并且返回这个函数本身的阶函数

13、Python下多线程的限制以及多进程中传递参数的方式

        python多线程有个全局解释器锁(global interpreter lock 这个锁的意思是任时间只能有 个线程使解释器 ,跟单cpu跑多个程序 个意思,  家都是轮着 ,这叫“并发”,不是“并 ”。

        多进程间共享数据 ,可以使用   multiprocessing.Value  和  multiprocessing.Array

14、Python是如何进行内存管理的?

        Python引用  个内存池(memory pool)机制 ,即Pymalloc机制(malloc:n.分配内存) 于管理对 块内存的申请和释放内存池( memory pool 的概念:

        当创建大 量消耗内存的对象时 ,频繁调new/malloc会导致 量的内存碎 ,致使效率降低。 内存池的概念就是预先在内存中申请 定数量的 大小 相等  的内存块留作备 ,当有新的内存需求 ,就先从内存池中分配内存给这个需求 ,不够了之后再申请新的内存。这样做最显著的优势就是能够减少内存碎 ,提升效率。

        内存池的实现方 式有很多 ,性能和适范围也不 样。 python中的内存管理机制——Pymalloc

        python中的内存管理机制都有两套实现, 套是针对 对象,就是大小 小 于256bits时,pymalloc会在内存池中申请内存空间;  于256bits ,则会直接new/malloc为来申请内存空间。

        关于释放内存方面 ,当 个对象的引计数变为0时 python就会调它的析构函数。在析构时,也采了内存池机制 ,从内存池来的内存会被归还到内存池中 以避免频繁地释放动作。

15、Python里面如何拷贝—个对象?

        标准库中的copy模块提供了两个 法来实现拷.   法是copy,它返回和参数包含内容 样的对象,使deepcopy法,对象中的属性也被复制

16、Python里面search()和match()的区别?

        match()函数只检测re是不是在string的开始位置匹配, search()会扫描整个string查找匹配, 也就是说match()只有在0位置匹配成功的话才有返回 ,如果不是开始位置匹配成功的话, match()就返回none

17、lambda表达式格式以及应用场景?

        lambda函数就是可以接受任意多个参数(包括可选参数)并且返回单个表达式值得函数。

语法:

        lambda [arg1 [,arg2,  argn]]:expression

1) lambda函数 较轻便, 即仍 ,适合完成只在 处使的简单功能。

2) 匿名函数,  来给filter map这样的函数式编程服务

3)作为回调函数 ,传递给某些应  如消息处理。

18、*args和**kwarg作用

        *args代表位置参数, 它会接收任意多个参数并把这些参数作为元组传递给函数。

        **kwargs代表的关键字参数 ,允许你使没有事先定义的参数名。位置参数 定要放在关键字参数的前 

作用 

        使用 *args和**kwargs可以 便的定义函数, 同时可以加强扩展性, 以便后的代码维护。

http://www.xdnf.cn/news/19432.html

相关文章:

  • 零基础学C++,函数篇~
  • Visual Studio内置环境变量有哪些
  • MQTT 连接建立与断开流程详解(一)
  • Redission 实现延迟队列
  • Verilog 硬件描述语言自学——重温数电之典型组合逻辑电路
  • 基于 Spring Boot3 的ZKmall开源商城分层架构实践:打造高效可扩展的 Java 电商系统
  • 大语言模型的“可解释性”探究——李宏毅大模型2025第三讲笔记
  • Linux kernel 多核启动
  • Tomcat 企业级运维实战系列(六):综合项目实战:Java 前后端分离架构部署
  • 〔从零搭建〕数据中枢平台部署指南
  • 汽车加气站操作工证考试的复习重点是什么?
  • 如何取得专案/设计/设定/物件的属性
  • ETCD学习笔记
  • 手表--带屏幕音响-时间制切换12/24小时
  • 从零开始学习单片机18
  • 《云原生架构从崩溃失控到稳定自愈的实践方案》
  • 消费 $83,用Claude 实现临床护理系统记录单(所见即所得版)
  • C++三方服务异步拉起
  • MySQL函数 - String函数
  • Google Protobuf初体验
  • 深层语义在自然语言处理中的理论框架与技术融合研究
  • 使用电脑操作Android11手机,连接步骤
  • Python爬虫实战:研究统计学方法,构建电商平台数据分析系统
  • 面经分享--小米Java一面
  • 具有类人先验知识的 Affordance-觉察机器人灵巧抓取
  • STM32 之GP2Y1014AU0F的应用--基于RTOS的环境
  • 老题新解|不与最大数相同的数字之和
  • PCB 局部厚铜工艺:技术升级与新兴场景应用,猎板加工亮点
  • 同步/异步日志库
  • 响应式编程框架Reactor【4】