python面试-理论面试题

1.变量与值在内存中的关系

变量通过变量指针,引用对象变量指针指向具体对象的内存空间,取对象的值。

1. 对象,类型已知,每个对象都包含一个头部信息(头部信息:类型标识符和引用计数器)
#注意:变量名没有类型,类型属于对象(因为变量引用对象,所以类型随对象),变量引用什么类型的对象,变量就是什么类型的。

2. 在Python中,每个对象都有指向该对象的引用总数---引用计数。可以使用sys.getrefcount()查看该数值。
#注意: 当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。因此,getrefcount()所得到的结果,会比期望的多1。

3. 当我们销毁一个变量时,该变量指向的对象的引用次数将减少一次。

4. 当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾。

 

2.is 与 == 区别

is 用于判断两个变量,引用对象是否为同一个地址
== 用于判断引用变量的,值是否相等。

#结论:
a.==比较的是内容,is比较的是地址
b.两个变量的地址相同,则两个变量的内容一定相同的
  两个变量的内容相同,则地址不一定相同。

 

3.简述深拷贝和浅拷贝的区别

浅拷贝是拷贝一层,深层次的对象级别的就拷贝引用;
深拷贝是拷贝多层,每一级别的数据都会拷贝出来

 

4.在 Python 中,如何使用socket模块来进行网络编程?

创建套接字:使用socket.socket()函数创建一个套接字对象。
绑定地址:使用socket.bind()函数将套接字绑定到一个特定的地址和端口。
监听连接:使用socket.listen()函数开始监听连接请求。
接受连接:使用socket.accept()函数接受客户端的连接请求,并返回一个新的套接字对象用于与客户端通信。
发送和接收数据:使用套接字对象的send()和recv()方法来发送和接收数据。
关闭套接字:使用socket.close()函数关闭套接字。

 

 

5.如何使用__slots__来限制对象的属性

class MyClass:
    __slots__ = ('attr1', 'attr2')

obj = MyClass()
obj.attr1 = 10
obj.attr2 = 20
# 尝试添加不在 __slots__ 中的属性会引发错误
# obj.attr3 = 30

 

 

6.如何使用@property装饰器来实现属性的访问控制?

class MyClass:
    def __init__(self):
        self._value = 0

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, new_value):
        if new_value >= 0:
            self._value = new_value
        else:
            raise ValueError("Value must be non-negative")

obj = MyClass()
print(obj.value)  
obj.value = 5
print(obj.value)  
# 尝试设置负数值会引发 ValueError
# obj.value = -1

 

 

7.在 Python 中,如何使用装饰器来实现函数的缓存?

from functools import lru_cache

@lru_cache(maxsize=None)
def my_function(n):
    # 这里是函数的具体逻辑
    return n ** 2

print(my_function(5))  
print(my_function(5))  

 

 

8.如何使用json模块来进行 JSON 数据的编码和解码?

import json

# 编码 JSON 数据
data = {"name": "Alice", "age": 25}
json_data = json.dumps(data)
print(json_data)

# 解码 JSON 数据
loaded_data = json.loads(json_data)
print(loaded_data)

 

posted @ 2022-10-22 19:18  zwx901323  阅读(33)  评论(0)    收藏  举报