Python面试十问

server/2024/9/23 20:11:28/

a9868a9756cb4d63a6674550c3b372aa.png

一、深浅拷贝的区别?

浅拷⻉: 拷⻉的是对象的引⽤,如果原对象改变,相应的拷⻉对象也会发⽣改变。

深拷⻉: 拷⻉对象中的每个元素,拷⻉对象和原有对象不在有关系,两个是独⽴的对象。

浅拷⻉(copy):拷⻉⽗对象,不会拷⻉对象的内部的⼦对象。

深拷⻉(deepcopy): copy 模块的 deepcopy ⽅法,完全拷⻉了⽗对象及其⼦对象。

二、装饰器及其应用场景?

装饰器(Decorator)是⼀种结构型设计模式,它可以动态地给⼀个对象添加额外的职责,同时⼜不改变其原有的接⼝和实现。通俗地说,就是通过组合的⽅式,为对象添加新的⾏为或特性。

  • ⽇志记录:可以定义⼀个装饰器函数,⽤于在函数调⽤时记录⽇志信息,如函数的参数、返回值等。
  • 性能分析:可以定义⼀个装饰器函数,⽤于在函数调⽤时计算函数的执⾏时间,以便进⾏性能优化。
python">import time
def time_it(func):def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()print(f"函数 {func.__name__} 执⾏时间为:{end_time - start_time} 秒")return resultreturn wrapper
@time_it
def my_function():time.sleep(2)print("Hello, World!")
my_function()

我们定义了⼀个装饰器函数time_it,它接受⼀个函数作为参数,并返回⼀个新的函数
wrapper。wrapper函数可以记录函数执⾏前后的时间,并输出执⾏时间信息。在my_function函数前⾯加上@time_it装饰器,表示对my_function函数应⽤time_it装饰器。

当调用my_function函数时,实际上会调⽤被time_it装饰过的wrapper函数,从⽽记录函数的执⾏时间。

三、装饰器的实质是什么 

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

四、Python迭代器及场景?

Python中的迭代器是一个可以记住遍历的位置的对象,它实现了两个方法:__iter__()__next__()__iter__() 方法返回迭代器对象本身,__next__() 方法返回容器中的下一个值。当没有更多的元素时,__next__() 方法会抛出 StopIteration 异常。

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

例⼦:

python">my_list = [1, 2, 3, 4, 5]
my_iterator = iter(my_list)
while True:try:item = next(my_iterator)print(item)except StopIteration:break
# 我们通过 iter() 函数将列表 my_list 转化为⼀个迭代器对象 my_iterator

五、Python⽣成器是什么

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

 ⽣成器函数是使⽤yield关键字定义的函数,每次调⽤⽣成器函数时,它会返回⼀个迭代器对象,调⽤next()⽅法时,它会从上次暂停的位置继续执⾏,直到遇到下⼀个yield语句,然后返回⼀个值,并再次暂停。 

python">def fibonacci():a, b = 0, 1while True:yield aa, b = b, a + bfib = fibonacci()
for i in range(10):print(next(fib))

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

多线程中的多个线程共享同一个进程的内存空间,因此它们可以访问相同的变量和数据结构。这意味着线程之间的数据共享和通信比较容易,但也可能导致竞争条件和线程安全问题。相反,多进程中的每个进程有自己的独立内存空间,进程间的数据共享需要借助于进程间通信(IPC)机制,如管道、队列或共享内存等。创建和管理线程的开销通常小于进程,因为进程间的独立性使得它们需要更多的资源来维护。然而,由于线程之间共享内存,同步和协调线程的操作可能比在进程之间进行通信更复杂。

七、*args和**kwarg作⽤

*args代表位置参数,它会接收任意多个参数并把这些参数作为元组传递给函数。**kwargs代表的关键字参数,允许你使⽤没有事先定义的参数名。位置参数⼀定要放在关键字参数的前⾯

八、is和==的区别

==是python标准操作符中的⽐较操作符,⽤来⽐较判断两个对象的value(值)是否相等(布尔计算);

is:用于判断两个变量是否引用自相同的对象,即它们在内存中的地址是否相同。当使用 is 进行比较时,只有当两个变量指向同一个内存地址时,结果才为 True

九、Python垃圾回收机制

  • 每个对象都有一个引用计数,当引用计数变为0时,对象会被立即回收。
  • 对于一组对象互相引用形成闭环的情况,Python会定期检查并回收这些无法通过简单引用计数回收的对象。
  • Python对每一代采用不同的回收策略,通常年轻代的对象更频繁地进行垃圾回收。

十、TCP和UDP的特点及区别

☆ TCP采用发送应答机制:

通过TCP这种方式发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传送成功

☆ 超时重传

发送端发送一个报文之后就会启动定时器,如果指定时间内没有得到应答就会重新发送这个报文段

☆ 错误校验

TCP用一个校验和函数来校验数据是否有错误,在发送和接收时都要计算校验和

☆ 流量控制和阻塞管理

流量控制用来避免发送端发送过快而使得接收方来不及接收

UDP协议(不可靠传输协议):

UDP不可靠协议(只能保证速度,但是没办法保证数据传输质量,发送5M => 接收3.75M)

有些情况下,我们对数据的质量没有要求,可以考虑使用UDP,如视频通话。


http://www.ppmy.cn/server/30183.html

相关文章

【redis】redix在Linux下的环境配置和redis的全局命令

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

为何软件IT行业重视创新而不是稳定?

为何软件IT行业重视创新而不是稳定?用户为此受苦:用户体验差! 彼得-蒂尔有一句名言:"竞争是失败者的事"。 如果没有必要,就不要把自己置于被迫竞争的境地。 我给年轻程序员的建议是,如果你想创…

gitlab设置保护分支

gitlab设置保护分支方法 进入代码仓库首页,找到settings下的repository并点击进入 找到Protected Branches 下的Exoand按钮,并点击展开 可以看到已经存在默认的保护分支,通常是master/main分支,也可以添加新的保护分支 新建保护分…

后台架构总结

前言 疫情三年,全国各地的健康码成为了每个人的重要生活组成部分。虽然过去一年,但是回想起来任然历历在目。 今天我就通过当时基于小程序的健康码架构,来给大家讲一下如何基于java,springboot等技术来快速搭建一个后台业务系统…

Apache DolphinScheduler支持Flink吗?

随着大数据技术的快速发展,很多企业开始将Flink引入到生产环境中,以满足日益复杂的数据处理需求。而作为一款企业级的数据调度平台,Apache DolphinScheduler也跟上了时代步伐,推出了对Flink任务类型的支持。 Flink是一个开源的分…

如何在 Ubuntu 14.04 上使用 Heartbeat 和保留 IP 创建高可用性设置

简介 Heartbeat 是一个开源程序,为客户端服务器提供集群基础设施功能——集群成员资格和消息传递,这是高可用性(HA)服务器基础设施中的关键组件。通常,Heartbeat 与集群资源管理器(CRM)&#x…

android studio项目实战——备忘录(附源码)

成果展示&#xff1a; 1.前期准备 &#xff08;1&#xff09;在配置文件中添加权限及启动页面顺序 ①展开工程&#xff0c;打开app下方的AndroidManifest.xml,添加权限&#xff0c;如下&#xff1a; <uses-permission android:name"android.permission.CAMERA"…

服务器根据功能划分有哪几种?

服务器根据功能来进行划分的话有邮件服务器、代理服务器和FTP服务器等多种类型&#xff0c;接下来就主要来了解一下这些服务器的作用有哪些吧&#xff01; 一、邮件服务器 邮件服务器是电子邮件系统的核心组件&#xff0c;主要负责电子邮件的发送和接收&#xff0c;当用户创建…