面试 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+ 访问!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/560383.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot的社区疫情返乡管控系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的社区疫情返乡管控系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系…

OpenHarmony 上传和下载(API 10)教程~

介绍 本示例使用ohos.request接口创建上传和下载任务,实现上传、下载功能,hfs作为服务器,实现了文件的上传和下载和任务的查询功能。 效果预览 使用说明 1.本示例功能需要先配置服务器环境后使用,具体配置见上传下载服务配置。…

中颖51芯片学习7. printf重定向到串口与自定义日志输出函数

中颖51芯片学习7. printf重定向到串口与自定义日志输出函数 一、 printf 重定向1. 概念2. 实现方式3. C51 中printf数值格式化 二、日志函数1. 实现方案分析2. 代码(1)log_utils.h(2)main.c 3. 通过预定义宏实现日志分级输出&…

汇编语言88888

汇编语言安装指南 第一步:在github上下载汇编语言的安装包 网址:GitHub - HaiPenglai/bilibili_assembly: B站-汇编语言-pdf、代码、环境等资料B站-汇编语言-pdf、代码、环境等资料. Contribute to HaiPenglai/bilibili_assembly development by creat…

Flyweight 享元

意图 运用共享技术有效地支持大量细粒度的对象。 结构 其中 Flyweight描述一个接口,通过这个接口Flyweight可以接受并作用于外部状态。ConcreteFlyweight实现Flyweight接口,并作为内部状态(如果有)增加存储空间。ConcreteFlywe…

数字阅览室解决方案

一、方案概述 “数字阅览室”概念一经提出,就得到了广泛的关注,纷纷组织力量进行探讨、研究和开发,进行各种模型的试验。随着数字地球概念、技术、应用领域的发展,数字阅览室已成为数字地球家庭的成员,为信息高速公路…

vue3:树的默认勾选和全选、取消全选

实现的功能&#xff0c;上面有个选择框&#xff0c;当选中全部时&#xff0c;下方树被全选 代码&#xff1a; <template><div><el-select v-model"selectAll" style"margin-bottom: 10px;" change"handleSelectAllChange">&…

运行transformers报错check_min_version(“4.40.0.dev0“)

在huggingface &#xff08;transformers项目地址&#xff09;下载transformers的项目 并 python /transformers/examples/pytorch/language-modeling/run_clm.py 时报错 报错如下&#xff1a; 安装的 transformers 版本不对&#xff0c;这里安装了 4.39.3&#xff0c;实际想…

网站备案期间怎么关闭首页显示无法访问-文章及其它页面正常访问

自从做了开发者之后才发现每个人博主的需求都是不同的&#xff0c;的的确确颠覆了我的观点&#xff0c;无论是页面布局还是SEO相关的设置&#xff0c;可能是因为站点属性不同所以需求不同&#xff0c;慢慢的就会在主题加入一些自定接口来满足不同人的需求&#xff0c;有人需要P…

双链表的实现

我们知道链表其实有很多种&#xff0c;什么带头&#xff0c;什么双向啊&#xff0c;我们今天来介绍双向带头循环链表&#xff0c;了解了这个其他种类的链表就很简单了。冲冲冲&#xff01;&#xff01;&#xff01; 链表的简单分类 链表有很多种&#xff0c;什么带头循环链表&…

【c基础】文件操作

1.fopen和fclose函数 函数原型 FILE *fopen(const char *path, const char *mode); 参数解释&#xff1a; 返回值&#xff1a;fopen打开成功&#xff0c;则返回有效file的有效地址&#xff0c;失败返回NULL。path是文件路径&#xff0c;可以相对路径&#xff0c;可以绝对路径…

“手撕“三大特性之一的<继承>(上)

目录 一、为什么需要继承 二、什么是继承 三、继承怎么写 四、成员的访问 1.父类与子类的成员变量不同名 2.父类与子类的成员变量同名 3.父类与子类的成员方法不同名 4.父类与子类的成员方法同名 五、super关键字 一、为什么需要继承 先让我们看一段Java代码&#…

Unity地形关联出错的解决办法以及地形深度拷贝

问题 最近发现unity地形系统的一个bug&#xff0c;导入的场景地形数据关联错乱了&#xff0c;关联到别的场景的地形数据了&#xff0c;meta替换了也没用&#xff0c;不清楚它具体是怎么关联的。 看下面的案例&#xff1a; 可以看到正常这个场景的地形数据应该关联的是Scene_E…

力扣HOT100 - 142. 环形链表 II

解题思路&#xff1a; public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();while (head ! null) {if (!set.add(head)) {return head;}head head.next;}return null;} }

文心一言 VS 讯飞星火 VS chatgpt (241)-- 算法导论17.3 7题

七、为动态整数多重集 S (允许包含重复值)设计一种数据结构&#xff0c;支持如下两个操作&#xff1a;① INSERT(S,x) 将 x 插入 S 中&#xff1b;② DELETE-LARGER-HALF(S) 将最大的 ⌈|S|/2⌉ 个元素从S中删除。解释如何实现这种数据结构&#xff0c;使得任意 m 个 INSERT 和…

Linux的firewalld防火墙

介绍firewalld&#xff1a; ①、firewalld&#xff08;Dynamic Firewall Manager of Linux systems&#xff0c;Linux系统的动态防火墙管理器&#xff09;服务是默认的防火墙配置管理工具&#xff0c;它拥有基于CLI&#xff08;命令行界面&#xff09;和基于GUI&#xff08;图…

Web Tours系统使用说明书

1.系统简介 产品名称&#xff1a;LoadRunner的Web Tours系统 产品功能&#xff1a;注册和登录用户信息、订票办理、退片办理、查询已定票信息、退出系统 系统默认用户&#xff1a;用户名jojo 密码&#xff1a;bean 2. 功能简介 2.1 注册用户信息 点击 sign up now&#xff…

(自学用)正演理论

基于波动方程如何解决数值频散问题——快速正演方法 NAD方法&#xff1a; 怎样离散/逼近高阶偏导数&#xff08;如何采样&#xff09;&#xff1a; 传统方法是用某一点及其周围点的函数f的线性组合来逼近导数。只有函数值&#xff0c;要想提高精度&#xff0c;压制数值频散就必…

(C语言)fscanf与fprintf函数详解

目录 1 fprintf详解 1.1 向文件流中输入数据 1.2 向标准输入流写数据 2. fscanf函数详解 2.1 从文件中读取格式化数据 2.2 从标准输入流中读取格式化数据 1 fprintf详解 头文件&#xff1a;stdio.h 该函数和printf的参数特别像&#xff0c;只是多了一个参数stream&#…

Unity类银河恶魔城学习记录13-5,6 p146 Delete save file,p147 Encryption of saved data源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili FileDataHandler.cs using System; using System.IO; using UnityEngine; p…
最新文章