面试 Python 基础八股文十问十答第二期

面试 Python 基础八股文十问十答第二期

作者:程序员小白条个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)为什么有了GIL还要关注线程安全?

尽管GIL(Global Interpreter Lock,全局解释器锁)在Python中限制了同一时刻只有一个线程能够执行Python字节码,但在多线程编程中仍然需要关注线程安全的问题。这是因为:

  • 共享数据: 多线程程序中的线程通常会共享数据,如果不加以控制,多个线程同时对同一数据进行读写操作可能导致数据不一致或损坏。
  • 原子操作: 即使是简单的操作也可能不是原子性的,例如在多线程环境下的赋值操作可能会被打断,导致不可预料的结果。
  • 竞态条件: 当多个线程同时竞争访问共享资源时,由于执行顺序不确定,可能会导致出现竞态条件(race condition),进而产生意外结果。

因此,即使GIL存在,仍然需要在多线程编程中关注线程安全,采取适当的同步机制(如锁、信号量、条件变量等)来保护共享资源,避免出现数据竞争和不一致的情况。

2)什么是迭代器和生成器?

  • 迭代器(Iterator): 迭代器是一种对象,它能够逐个地访问集合中的元素而不暴露其内部的实现方式。迭代器对象通常通过调用 iter() 函数来创建,然后使用 next() 方法逐个访问元素,直到遍历完所有元素或发生 StopIteration 异常。
  • 生成器(Generator): 生成器是一种特殊的迭代器,它可以在迭代过程中动态地生成值,而不需要在内存中保存完整的集合。生成器函数是使用关键字 yield 来定义的函数,每次调用生成器函数时,会返回一个迭代器对象,然后可以通过迭代器的 next() 方法来获取生成的值。

迭代器和生成器都能够实现惰性求值(lazy evaluation),即只在需要时才生成元素,这种特性在处理大量数据或无限序列时非常有用,可以节省内存并提高性能。

3)什么是协程?

  • 协程(Coroutine): 协程是一种轻量级的并发处理方式,它可以在单个线程中实现多个任务之间的切换执行,从而实现并发的效果。协程与线程不同,它是在用户空间中管理的,不需要操作系统的线程切换开销,因此可以实现更高效的并发。

协程通常具有以下特点:

  • 非抢占式: 协程的切换是由程序员显式控制的,而不是由操作系统调度器决定的,因此不存在抢占式调度和上下文切换的开销。
  • 协作式: 多个协程之间通过协作的方式共享执行时间,需要在合适的时机主动让出 CPU 控制权,以便其他协程可以执行。
  • 状态保存: 在协程切换时,当前协程的状态会被保存下来,下次切换回来时可以继续执行,这种状态的保存使得协程可以实现异步编程和任务调度。

Python中的协程通过 asyncio 模块提供的 asyncawait 关键字来实现,可以轻松地编写异步IO的程序,提高程序的并发性能。

4)什么是闭包?

闭包(Closure) 是指在函数内部定义的函数,并且该内部函数可以访问其外部函数的作用域中定义的变量。闭包通常用于保持函数的状态信息,使得函数可以记住并访问其创建时的环境,即使该环境在函数返回后已经销毁。

闭包的特点包括:

  • 内部函数可以访问外部函数的变量和参数。
  • 外部函数的变量值在内部函数中是可变的,并且在函数调用之间是保持状态的。
  • 闭包使得函数可以保存局部状态,实现更灵活和高效的编程。
def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

closure = outer_function(5)
print(closure(3))  # 输出结果为 8

在上面的例子中,inner_function 是一个闭包,它可以访问外部函数 outer_function 中定义的变量 x,即使在 outer_function 调用之后,inner_function 仍然可以使用 x 的值。

5)什么是Python深拷贝和浅拷贝?

浅拷贝(Shallow Copy)深拷贝(Deep Copy) 是在 Python 中用于复制对象的两种不同方式:

  • 浅拷贝: 浅拷贝创建一个新的对象,但是新对象中的元素是对原对象中元素的引用。换句话说,它只是复制了对象的顶层结构,而不会递归地复制其内部的对象。浅拷贝可以使用 copy() 函数来实现,或者通过切片操作符 [:] 进行复制。
  • 深拷贝: 深拷贝创建一个全新的对象,并且递归地复制原对象中的所有子对象。这意味着原对象和新对象是完全独立的,修改一个对象的内容不会影响到另一个对象。深拷贝可以使用 copy.deepcopy() 函数来实现。
import copy

# 浅拷贝示例
list1 = [[1, 2, 3], [4, 5, 6]]
list2 = copy.copy(list1)
list1[0][0] = 0
print(list2)  # 输出结果为 [[0, 2, 3], [4, 5, 6]]

# 深拷贝示例
list3 = copy.deepcopy(list1)
list1[0][1] = 9
print(list3)  # 输出结果为 [[0, 2, 3], [4, 5, 6]]

在上面的示例中,浅拷贝创建了一个新的列表 list2,但它仍然共享原列表 list1 中子列表的引用。而深拷贝创建了一个全新的列表 list3,它与原列表完全独立,修改其中一个列表不会影响另一个列表。

6)Python的内存管理

Python的内存管理主要包括内存分配和垃圾回收两个方面:

  • 内存分配: Python的内存管理器负责动态分配内存给对象,并在对象不再使用时将其释放。Python使用了一种称为“引用计数”的技术来追踪对象的引用数量,当一个对象的引用计数变为零时,内存管理器会立即释放该对象所占用的内存。
  • 垃圾回收: 除了引用计数之外,Python还使用了垃圾回收(Garbage Collection)来处理循环引用等情况下的内存泄漏问题。Python的垃圾回收器使用了一种称为“标记-清除”的算法来检测并清理不再使用的对象,确保内存被有效地回收和重复利用。

Python的内存管理机制使得开发者无需手动管理内存,大大降低了编程的复杂性,并且可以确保程序在运行过程中不会出现内存泄漏等问题。

7)Python的垃圾回收机制

Python的垃圾回收机制主要依靠引用计数和垃圾回收器两种方式来管理内存。

  • 引用计数: Python 中的每个对象都会记录着一个引用计数器,用来统计有多少个引用指向该对象。当引用计数为零时,说明该对象不再被使用,Python 解释器会立即将其所占用的内存释放。
  • 垃圾回收器: 除了引用计数之外,Python 还有一个垃圾回收器,用来处理循环引用等引用计数无法解决的情况。Python 的垃圾回收器采用了“标记-清除”算法来检测并清理不再使用的对象。

垃圾回收器会定期扫描内存中的所有对象,并标记那些仍然可达的对象,然后清理掉那些没有被标记的对象,以释放它们所占用的内存空间。

8)什么是组合和继承?

  • 继承(Inheritance): 继承是面向对象编程中一种重要的概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以重用父类的代码,并且可以通过添加新的方法或修改现有方法来扩展或定制父类的行为。继承可以形成类之间的层次结构,提高代码的重用性和可维护性。
  • 组合(Composition): 组合是指一个类中包含另一个类的实例作为其成员变量的情况。通过组合,一个类可以利用其他类的功能,而无需继承其所有属性和方法。组合通常用于表示“has-a”关系,即一个类“has-a”另一个类的实例作为其一部分。通过组合,可以灵活地构建复杂的对象结构,同时避免了继承可能引入的耦合性和复杂性。

9)类变量和实例变量的区别?

  • 类变量(Class Variable): 类变量是属于类的变量,在类的所有实例之间共享。它通常在类的内部定义,但在所有实例之外。类变量可以通过类名访问,也可以通过类的实例访问。类变量的值在所有实例之间是共享的。
  • 实例变量(Instance Variable): 实例变量是属于每个类实例的变量,每个实例都有自己的一组实例变量。它们通常在类的构造函数 __init__() 中定义,并且通过 self 关键字来访问。每个实例变量的值是独立的,不同实例之间互不影响。
class MyClass:
    class_variable = 0

    def __init__(self, instance_variable):
        self.instance_variable = instance_variable

# 类变量示例
print(MyClass.class_variable)  # 输出结果为 0

# 实例变量示例
obj1 = MyClass(1)
obj2 = MyClass(2)
print(obj1.instance_variable)  # 输出结果为 1
print(obj2.instance_variable)  # 输出结果为 2

10)classmethod和staticmethod区别?

  • classmethod: classmethod 是一个装饰器,用来定义类方法。类方法可以通过类调用,也可以通过类的实例调用,但第一个参数始终是类本身,通常命名为 cls。类方法可以访问和修改类的属性,但不能访问实例的属性。
  • staticmethod: staticmethod 也是一个装饰器,用来定义静态方法。静态方法与类无关,它们既不需要类作为参数,也不需要实例作为参数。静态方法可以通过类调用,也可以通过实例调用,但在调用时不会传递类或实例的参数。
class MyClass:
    class_variable = 0

    def __init__(self, instance_variable):
        self.instance_variable = instance_variable

    @classmethod
    def class_method(cls):
        return cls.class_variable

    @staticmethod
    def static_method():
        return "This is a static method"

# 调用类方法
print(MyClass.class_method())  # 输出结果为 0

# 调用静态方法
print(MyClass.static_method())  # 输出结果为 "This is a static method"

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

前后端总计已经 1100+ Star,2W+ 访问!

⭐点赞⭐收藏⭐不迷路!⭐

  • 16
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python面试八股文是一种常见的面试准备方法,可以帮助你系统地复习Python基础知识和常见题。以下是一个简单的Python面试八股文的框架: 1. Python基础知识: - Python的特点和优势 - Python的数据类型和变量命名规则 - Python的运算符和表达式 - Python的条件语句和循环语句 - Python的函数和模块 - Python的面向对象编程 2. 常用的Python库和框架: - NumPy:用于科学计算和数据分析 - Pandas:用于数据处理和分析 - Matplotlib:用于数据可视化 - Django:用于Web开发 - Flask:用于Web开发和API构建 - TensorFlow或PyTorch:用于机器学习和深度学习 3. Python的异常处理: - Python中常见的异常类型及其处理方法 - try-except语句的使用及注意事项 - finally语句的作用和使用场景 4. 数据库操作: - Python连接数据库的方式和常用的库(如MySQL、SQLite) - SQL语句在Python中的执行方法 - 数据库事务处理和连接池的概念 5. 多线程和多进程: - 多线程和多进程的概念和区别 - Python中实现多线程和多进程的方式(如threading和multiprocessing库) - 多线程和多进程的应用场景和注意事项 6. Web开发相关: - HTTP协议的基本原理和常见请求方法 - Python的Web框架(如Django和Flask)的使用和特点 - RESTful API的设计和实现 7. 测试和调试: - 单元测试和集成测试的概念和区别 - Python中常用的测试框架(如unittest和pytest) - Python中的调试方法和工具(如pdb和print语句) 8. 代码优化和性能调优: - Python中常见的代码优化技巧(如避免不必要的循环、使用生成器等) - Python中常用的性能调优工具和技术(如时间复杂度分析、使用C扩展库等) 以上是一个简单的Python面试八股文的框架,你可以根据自己的情况进行适当的调整和扩展。希望对你的面试准备有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小白条

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值