Pytho经典面试题荟萃:第一期
目录
一、面试题
二、参考答案
解释器和编译器的区别
解释器
编译器
Python 的解释过程
Python 内存管理
Python 内存分配
引用计数
垃圾回收
其他内存管理技术
多重继承
多重继承带来的问题
命名冲突
菱形继承问题
解决多重继承带来的问题
方法重写
调用 super() 函数
使用抽象基类
一、面试题
-
Python闭包和装饰器的区别
-
Python中GIL的作用和原理
-
解释器和编译器的区别以及Python的解释过程
-
如何在Python中进行内存管理?
-
请解释Python中的多重继承,以及如何解决它带来的潜在问题
二、参考答案
-
Python闭包和装饰器的区别
Python 闭包和装饰器都是 Python 中高级函数的重要特性,但它们之间有一些区别。
闭包是指在一个内部函数中引用了外部函数的变量或参数,并且返回这个内部函数的情况。闭包是一个函数和与其相关的引用环境组合的一个整体,它可以访问外部函数的变量和参数,即使外部函数已经返回,这些变量和参数仍然保存在内存中。闭包的主要作用是保存函数的状态,使得函数可以记住之前的操作并在后续的调用中继续使用。
例如,下面的代码定义了一个闭包函数add_nums
,它返回一个内部函数add
,该内部函数将传入的参数与之前传入的参数相加并返回结果:
def add_nums(num):def add(num2):return num + num2return add add_five = add_nums(5) print(add_five(3)) # 输出 8 print(add_five(10)) # 输出 15
装饰器是指用一个函数来包装另一个函数,从而修改另一个函数的行为。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数,这个新函数包装了原来的函数。装饰器通常用于添加额外的功能,例如日志记录、性能测试等。
例如,下面的代码定义了一个装饰器函数time_it
,它接受一个函数作为参数,并返回一个新的函数wrapper
,这个新函数会在执行原始函数之前和之后记录时间:
import time def time_it(func):def wrapper(*args, **kwargs):start = time.time()result = func(*args, **kwargs)end = time.time()print(f"{func.__name__} took {end - start} seconds to run.")return resultreturn wrapper @time_it def slow_function():time.sleep(2) slow_function() # 输出 "slow_function took 2.0007898807525635 seconds to run."
总结: 闭包和装饰器都是高级函数的重要特性,但它们的作用略有不同。闭包用于保存函数的状态,使函数可以记住之前的操作并在后续的调用中继续使用,而装饰器用于修改函数的行为,例如添加额外的功能或修改函数的参数。
-
Python中GIL的作用和原理 作用 GIL(全局解释器锁)是Python解释器的一项特性,它的作用是限制任何时刻只能有一个线程在执行Python代码,这个锁对于多线程Python程序的执行有一些限制和影响。 原理 在Python解释器中,每个线程都有自己的执行栈和局部变量,但是共享了全局变量、代码对象和一些Python解释器内部的状态。当多个线程尝试同时访问和修改这些共享状态时,可能会导致数据不一致或者程序出现异常。为了避免这种情况,Python解释器使用了GIL来确保在任何时刻只有一个线程在执行Python代码。
具体来说,GIL是一个互斥锁(mutex),当一个线程获得了GIL,它就可以执行Python代码。其他线程需要等待这个线程释放GIL才能继续执行。GIL的实现在解释器的C代码中,是基于线程切换的时间片轮转机制实现的。这种机制使得在多线程执行Python代码时,有时候会出现线程切换过于频繁导致程序执行速度变慢的情况。
GIL对于一些IO密集型的Python程序可能没有太大影响,因为当线程阻塞在IO操作时,GIL会自动释放,其他线程可以执行Python代码。但是对于一些CPU密集型的程序,GIL可能会成为性能瓶颈,因为多个线程无法同时利用多个CPU核心执行Python代码。
总结 GIL是Python解释器的一项特性,它确保了在任何时刻只有一个线程在执行Python代码,从而保证了共享状态的一致性。但是在一些特定的情况下,GIL可能会影响多线程程序的性能,需要开发者根据实际情况进行优化。
-
解释器和编译器的区别以及Python的解释过程
解释器和编译器的区别
解释器和编译器都是将源代码转化为可执行代码的工具,但它们的实现方式不同。解释器会逐行解释源代码,并立即执行解释后的代码。编译器则会将整个源代码编译成机器码,再交给计算机执行。下面是它们的具体区别:
解释器
-
解释器逐行解释源代码,并立即执行解释后的代码。
-
解释器无需编译,可直接运行源代码。
-
解释器的错误信息更易于理解,因为它们能够实时输出错误信息。
编译器
-
编译器会将整个源代码编译成机器码,再交给计算机执行。
-
编译器需要较长的编译时间,但执行速度较快。
-
编译器的错误信息通常较难理解,因为它们通常只在编译完成后才能输出。
Python 的解释过程
Python 是一种解释型语言,它的解释器会逐行解释源代码并立即执行。下面是 Python 的解释过程:
-
Python 解释器会读取源代码,并将其转换为 Python 字节码。
-
Python 字节码是一种中间形式,可以被解释器直接执行。
-
解释器逐行解释字节码,并立即执行解释后的代码。
-
如果解释器遇到错误,它会立即停止并输出错误信息。
-
如果解释器成功执行完所有代码,程序将结束并退出。
Python 的解释过程是一种动态的、即时的过程,程序可以在不经过编译的情况下立即运行。这使得 Python 成为一种非常灵活和易于使用的编程语言。
-
如何在Python中进行内存管理?
Python 内存管理
Python 中的内存管理是自动的,这意味着开发人员通常不需要手动管理内存。Python 提供了垃圾回收机制来管理内存,以确保不会出现内存泄漏和内存错误。但是了解内存管理的基础知识仍然是很有用的。
Python 内存分配
Python 使用内存池来分配内存,以便快速创建和销毁对象。这意味着对象被销毁时,它们占用的内存并不立即返回给操作系统,而是留在内存池中,以便以后可以更快地分配给新对象。
Python 有两个主要的内存池:小对象池和大对象池。小对象池用于分配小于 256 字节的对象,而大对象池用于分配大于等于 256 字节的对象。
引用计数
Python 使用引用计数来跟踪对象的使用情况。每个对象都有一个引用计数,表示指向该对象的引用数量。当对象被引用时,它的引用计数会增加;当对象不再被引用时,它的引用计数会减少。当引用计数为 0 时,对象将被销毁并且占用的内存将返回给内存池。
垃圾回收
当对象之间存在循环引用时,引用计数机制可能会失效。在这种情况下,Python 使用垃圾回收机制来检测并清除不再被引用的对象。
垃圾回收机制使用标记 - 清除算法来检测不再被引用的对象。在这种算法中,Python 从根对象(例如全局变量、局部变量和当前函数的参数)开始,递归地遍历对象图,并标记所有可达对象。然后,Python 清除未标记的对象并返回占用的内存。
其他内存管理技术
除了引用计数和垃圾回收之外,Python 还提供了其他内存管理技术,例如:
-
内存视图:允许 Python 程序直接访问底层内存。
-
循环垃圾收集器:在 Python 中使用了 Python 引擎的垃圾回收机制无法处理的情况下,可以手动开启循环垃圾收集器。
-
内存分析器:用于帮助开发人员识别和解决内存问题。
-
请解释Python中的多重继承,以及如何解决它带来的潜在问题
多重继承
多重继承是 Python 中一个非常强大的特性,它允许一个子类从多个父类中继承属性和方法。多重继承可以通过在类定义中列出多个父类来实现,如下所示:
class ChildClass(ParentClass1, ParentClass2, ...):# ChildClass definition
这样,子类就可以从多个父类中继承属性和方法。
多重继承带来的问题
然而,多重继承也带来了一些潜在的问题,包括:
命名冲突
当多个父类拥有相同的方法或属性时,子类在调用这些方法或属性时可能会出现命名冲突。例如:
class ParentClass1:def foo(self):print("ParentClass1's foo") class ParentClass2:def foo(self):print("ParentClass2's foo") class ChildClass(ParentClass1, ParentClass2):pass child = ChildClass() child.foo()
在这种情况下,子类继承了两个父类的foo()
方法,但是当它尝试调用foo()
方法时,会发生命名冲突。默认情况下,子类将调用第一个父类的方法。
菱形继承问题
多重继承中的另一个潜在问题是菱形继承问题。这种情况发生在一个子类继承了两个父类,而这两个父类又继承自同一个父类。这样就会形成一个类似于菱形的继承结构,如下所示:
A/ \B C\ /D
这种情况下,子类继承了 A 类中的属性和方法两次,因为它继承了 B 类和 C 类,而 B 类和 C 类又都继承自 A 类。这可能会导致方法和属性的重复定义和其他问题。
解决多重继承带来的问题
为了解决多重继承带来的潜在问题,可以采用以下几种方法:
方法重写
当多个父类拥有相同的方法时,可以在子类中重写这些方法来解决命名冲突。例如:
class ParentClass1:def foo(self):print("ParentClass1's foo") class ParentClass2:def foo(self):print("ParentClass2's foo") class ChildClass(ParentClass1, ParentClass2):def foo(self):ParentClass1.foo(self) # 调用ParentClass1中的foo()方法
在这种情况下,子类重写了foo()
方法,并在其中调用了其中一个父类的foo()
方法来解决命名冲突
调用 super() 函数
在多重继承中,可以使用super()
函数来调用父类的方法,以避免出现重复定义和其他问题。super()
函数会自动调用下一个父类的同名方法,而不是直接调用第一个父类的方法。例如:
class ParentClass1:def foo(self):print("ParentClass1's foo") class ParentClass2:def foo(self):print("ParentClass2's foo") class ChildClass(ParentClass1, ParentClass2):def foo(self):super().foo() # 调用下一个父类的foo()方法
在这种情况下,子类也重写了foo()
方法,但是使用了super()
函数来调用下一个父类的同名方法。
使用抽象基类
抽象基类是一个包含抽象方法的类,抽象方法是没有实现的方法。使用抽象基类可以强制要求子类实现抽象方法,以避免多重继承带来的一些问题。例如:
from abc import ABC, abstractmethod class ParentClass1(ABC):@abstractmethoddef foo(self):pass class ParentClass2(ABC):@abstractmethoddef bar(self):pass class ChildClass(ParentClass1, ParentClass2):def foo(self):pass def bar(self):pass
在这种情况下,父类被定义为抽象基类,并包含抽象方法foo()
和bar()
。子类必须实现这些抽象方法,以避免多重继承带来的问题。
多重继承是 Python 中一个非常强大的特性,但也带来了一些潜在的问题。可以使用方法重写、调用super()
函数或使用抽象基类来解决这些问题。
经典面试题不定期更新,欢迎关注我,获取平台及时推送
相关文章:
Pytho经典面试题荟萃:第一期
目录 一、面试题 二、参考答案 解释器和编译器的区别 解释器 编译器 Python 的解释过程 Python 内存管理 Python 内存分配 引用计数 垃圾回收 其他内存管理技术 多重继承 多重继承带来的问题 命名冲突 菱形继承问题 解决多重继承带来的问题 方法重写 调用 su…...

01背包问题(大彻大悟版)
背包问题身为一个非常经典的动态规划问题,理清思路很重要,在经过多次观看y总视频和b站解析,加上CSDN的文章辅助,我终于从很多不理解到大彻大悟,下面是我对于背包问题思路的总结,有问题的话欢迎指出。谈到背…...

【麒麟服务器操作系统忘记开机密码怎么办?---银河麒麟服务器操作系统更改用户密码】
银河麒麟服务器操作系统更改用户密码 1.启动主机进入 grub 菜单,如图 1.1 以最新版本 Kylin-Server-10-SP2-x86-Release-Build09-20210524 为例。 图 1.1 grub 菜单 2 编辑 kernel 2.1按下”e”输入,输入用户名和密码(root/Kylin123123&…...
华为OD机试(20222023)考点分类
字符串,数组,集合操作 题库分值序号题目考点 or 实现Old1001敏感字段加密字符串,数组,集合操作Old1002IPv4地址转换成整数字符串,数组,集合操作Old1006字符串分割字符串,数组,集合操作Old1007...

初级篇 3 - HTML 或 CSS 文件中不懂的标签属性详解
目录一、遇到的不懂的标签属性详解1、meta 标签的 http-equiv 属性(元标签)二、遇到的 CSS 不懂的属性详解vertical-align三、如何规避 HTML 自动换行 - 脱离文档流配置属性 display: inline-block理解 inline、inline-block、blockinline总结:四、导航栏自动弹出子…...

【C语言】每日刷题 —— 牛客语法篇(4)
🚀🚀前言 大家好,继续更新专栏 c_牛客,不出意外的话每天更新十道题,难度也是从易到难,自己复习的同时也希望能帮助到大家,题目答案会根据我所学到的知识提供最优解。 🏡个人主页&am…...

HashMap ConcurrentHashMap介绍
目录 HashMap 数据结构 重要成员变量 Jdk7-扩容死锁分析 单线程扩容 多线程扩容 Jdk8-扩容 ConcurrentHashMap 数据结构 并发安全控制 源码原理分析 重要成员变量 协助扩容helpTransfer 扩容transfer 总结 CopyOnWrite机制 源码原理 HashMap 数据结构 数组…...

C++语法规则3(C++面向对象)
多态 C多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数; 形成多态必须具备三个条件: 必须存在继承关系;继承关系必须有同名虚函数(其中虚函数是在基类中使用关键字 virtual 声明的函数&#…...

Python tkinter 如何实现网站下载工具?将所有数据一键获取
前言 铁汁们有没有想过,如何把几个代码的功能结合到一起呢? 有想过的话,有没有实现过呢? 其实很简单的啊,咱就写一个界面就好了,想要哪个代码运行,鼠标轻轻一点就行 开发环境 python 3.8: 解…...

第六章:C语言数据结构与算法初阶之栈
系列文章目录 文章目录系列文章目录前言一、栈二、栈的实现三、接口函数的实现1、初始化2、销毁栈3、压栈与出栈4、判空5、元素个数6、返回栈顶元素四、栈中元素的访问总结前言 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 一、…...
Android学习之WebView
什么是WebView WebView是Android中UI组件的一种,WebView基于webkit内核,不过由于兼容性的原因在Android5.0后改为了Chromium内核。 WebView可以用来展示网页,常用于我们不想打开浏览器但又想浏览网页的情况。 WebView的使用 WebVeiw的常用…...
3/11 考试总结
时间安排 7:30–7:50 读题,T1 是个利用随机性的题目,T2 dp,T3 不知道是啥。 7:50–8:30 T1,对于随机有个结论时最值突变不超过 log ,于是可以处理出所有 log 个区间然后统计答案,但这暴力做是个 3log 铁定过不去。 8:30–8:50 T2…...

Leetcode 141.环形链表 142环形链表II
141环形链表 文章目录快慢指针快慢指针 代码思路: slow 和fast 指向 head slow走一步,fast走两步 没有环: fast每次走2步 ,如果 fast 最终遇到NULL(链表中的元素是 偶数)或者fast->next(链表中的元素是 奇数)遇到NULL…...

hibernate学习(五)
hibernate学习(五) hibernate的一对多关联映射: 一、数据库表与表之间关系 一对多建表原则: 多对多的建表原则: 一对一建表原则: (1)唯一外键对应: (…...

STM32CubeIDE 快速开发入门指南
描述 STM32CubeIDE是一体式多操作系统开发工具,是STM32Cube软件生态系统的一部分。 STM32CubeIDE是一种高级C/C开发平台,具有STM32微控制器和微处理器的外设配置、代码生成、代码编译和调试功能。它基于Eclipse/CDT™框架和用于开发的GCC工具链…...
华为OD机试 - 火星文计算(C 语言解题)【独家】
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 使用说明本期题目:火星文计…...

超超超超保姆式详解——字符函数和字符串函数(学不会打我)上
目录 长度不受限制的字符串函数 strlen部分 strlen函数的易错小知识 strlen函数的实现 strcpy部分 strcat部分 自己实现strcat strstr函数部分 简单例子: 分析 strcmp部分 长度受限制的字符串函数 strncpy 简单例子 strncat strncmp 简单例子 &…...
Data mesh 笔记
有用的网站 https://www.datamesh-architecture.com/ https://www.agilelab.it/data-mesh-in-action https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/scenarios/cloud-scale-analytics/well-architected-framework https://www.datamesh-architecture.com…...
(八十三)大白话透彻研究通过explain命令得到的SQL执行计划(2)
今天我们就一步一步的来讲解不同的SQL语句的执行计划长什么样子,先来看第一条SQL语句,特别的简单,就是: explain select * from t1 就这么一个简单的SQL语句,那么假设他这个里面有大概几千条数据,此时执行计…...

案例18-面向对象之开门小例子
目录 一:背景介绍 二:思路&方案 1.面向过程 2.面向对象 3.面向对象(反射) 三:过程 1.面向过程:原本何老师的作用交给我了米老师来完成。 2.面向对象:把开门的方法完全交个何老师,米老师不需要有…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

python基础语法Ⅰ
python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…...