一、深浅拷贝的区别?
浅拷⻉: 拷⻉的是对象的引⽤,如果原对象改变,相应的拷⻉对象也会发⽣改变。
深拷⻉: 拷⻉对象中的每个元素,拷⻉对象和原有对象不在有关系,两个是独⽴的对象。
浅拷⻉(copy):拷⻉⽗对象,不会拷⻉对象的内部的⼦对象。
深拷⻉(deepcopy): copy 模块的 deepcopy ⽅法,完全拷⻉了⽗对象及其⼦对象。
二、装饰器及其应用场景?
装饰器(Decorator)是⼀种结构型设计模式,它可以动态地给⼀个对象添加额外的职责,同时⼜不改变其原有的接⼝和实现。通俗地说,就是通过组合的⽅式,为对象添加新的⾏为或特性。
- ⽇志记录:可以定义⼀个装饰器函数,⽤于在函数调⽤时记录⽇志信息,如函数的参数、返回值等。
- 性能分析:可以定义⼀个装饰器函数,⽤于在函数调⽤时计算函数的执⾏时间,以便进⾏性能优化。
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 result
return 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
异常。
迭代器常⽤于遍历序列、集合、字典等容器类型数据。它的优点是可以惰性计算,只有在需要时才会计算,避免了⼀次性加载所有数据的开销,同时也可以节省内存空间。
例⼦:
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语句,然后返回⼀个值,并再次暂停。
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
fib = 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,如视频通话。