当前位置: 首页 > news >正文

Pytho经典面试题荟萃:第一期

目录

一、面试题

二、参考答案

解释器和编译器的区别

解释器

编译器

Python 的解释过程

Python 内存管理

Python 内存分配

引用计数

垃圾回收

其他内存管理技术

多重继承

多重继承带来的问题

命名冲突

菱形继承问题

解决多重继承带来的问题

方法重写

调用 super() 函数

使用抽象基类


一、面试题

  1. Python闭包和装饰器的区别

  2. Python中GIL的作用和原理

  3. 解释器和编译器的区别以及Python的解释过程

  4. 如何在Python中进行内存管理?

  5. 请解释Python中的多重继承,以及如何解决它带来的潜在问题

二、参考答案

  1. 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."

总结: 闭包和装饰器都是高级函数的重要特性,但它们的作用略有不同。闭包用于保存函数的状态,使函数可以记住之前的操作并在后续的调用中继续使用,而装饰器用于修改函数的行为,例如添加额外的功能或修改函数的参数。

  1. 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可能会影响多线程程序的性能,需要开发者根据实际情况进行优化。

  1. 解释器和编译器的区别以及Python的解释过程

    解释器和编译器的区别

解释器和编译器都是将源代码转化为可执行代码的工具,但它们的实现方式不同。解释器会逐行解释源代码,并立即执行解释后的代码。编译器则会将整个源代码编译成机器码,再交给计算机执行。下面是它们的具体区别:

解释器

  • 解释器逐行解释源代码,并立即执行解释后的代码。

  • 解释器无需编译,可直接运行源代码。

  • 解释器的错误信息更易于理解,因为它们能够实时输出错误信息。

编译器

  • 编译器会将整个源代码编译成机器码,再交给计算机执行。

  • 编译器需要较长的编译时间,但执行速度较快。

  • 编译器的错误信息通常较难理解,因为它们通常只在编译完成后才能输出。

Python 的解释过程

Python 是一种解释型语言,它的解释器会逐行解释源代码并立即执行。下面是 Python 的解释过程:

  1. Python 解释器会读取源代码,并将其转换为 Python 字节码。

  2. Python 字节码是一种中间形式,可以被解释器直接执行。

  3. 解释器逐行解释字节码,并立即执行解释后的代码。

  4. 如果解释器遇到错误,它会立即停止并输出错误信息。

  5. 如果解释器成功执行完所有代码,程序将结束并退出。

Python 的解释过程是一种动态的、即时的过程,程序可以在不经过编译的情况下立即运行。这使得 Python 成为一种非常灵活和易于使用的编程语言。

  1. 如何在Python中进行内存管理?

Python 内存管理

Python 中的内存管理是自动的,这意味着开发人员通常不需要手动管理内存。Python 提供了垃圾回收机制来管理内存,以确保不会出现内存泄漏和内存错误。但是了解内存管理的基础知识仍然是很有用的。

Python 内存分配

Python 使用内存池来分配内存,以便快速创建和销毁对象。这意味着对象被销毁时,它们占用的内存并不立即返回给操作系统,而是留在内存池中,以便以后可以更快地分配给新对象。

Python 有两个主要的内存池:小对象池和大对象池。小对象池用于分配小于 256 字节的对象,而大对象池用于分配大于等于 256 字节的对象。

引用计数

Python 使用引用计数来跟踪对象的使用情况。每个对象都有一个引用计数,表示指向该对象的引用数量。当对象被引用时,它的引用计数会增加;当对象不再被引用时,它的引用计数会减少。当引用计数为 0 时,对象将被销毁并且占用的内存将返回给内存池。

垃圾回收

当对象之间存在循环引用时,引用计数机制可能会失效。在这种情况下,Python 使用垃圾回收机制来检测并清除不再被引用的对象。

垃圾回收机制使用标记 - 清除算法来检测不再被引用的对象。在这种算法中,Python 从根对象(例如全局变量、局部变量和当前函数的参数)开始,递归地遍历对象图,并标记所有可达对象。然后,Python 清除未标记的对象并返回占用的内存。

其他内存管理技术

除了引用计数和垃圾回收之外,Python 还提供了其他内存管理技术,例如:

  • 内存视图:允许 Python 程序直接访问底层内存。

  • 循环垃圾收集器:在 Python 中使用了 Python 引擎的垃圾回收机制无法处理的情况下,可以手动开启循环垃圾收集器。

  • 内存分析器:用于帮助开发人员识别和解决内存问题。

  1. 请解释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&#xf…...

hibernate学习(五)

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

STM32CubeIDE 快速开发入门指南

描述 STM32CubeIDE是一体式多操作系统开发工具,是STM32Cube软件生态系统的一部分。 STM32CubeIDE是一种高级C/C开发平台,具有STM32微控制器和微处理器的外设配置、代码生成、代码编译和调试功能。它基于Eclipse/CDT™框架和用于开发的GCC工具链&#xf…...

华为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.面向对象:把开门的方法完全交个何老师,米老师不需要有…...

nfc-list使用教程

nfc-list 是 Kali Linux 中基于 libnfc 库(开源 NFC 开发框架)的基础 NFC/RFID 设备检测工具,核心功能是扫描并列出当前连接的 NFC 读卡器设备,以及贴近读卡器的 NFC 卡片(或标签)的详细信息,包…...

3步打造你的专属AI角色扮演世界:SillyTavern终极指南

3步打造你的专属AI角色扮演世界:SillyTavern终极指南 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 你是否厌倦了千篇一律的AI对话?是否渴望创造真正有灵魂的虚拟角…...

ESP32/ESP8266轻量级HA MQTT自动发现C++库

1. 项目概述 HA MQTT Discovery 是一个专为嵌入式平台(特别是 ESP32/ESP8266)设计的轻量级 C 库,用于实现与 Home Assistant 的原生 MQTT 自动发现(Auto-Discovery)协议兼容的设备与实体注册。其核心目标并非替代完整…...

百川2-13B-4bits模型调优:OpenClaw任务响应速度提升50%的3个技巧

百川2-13B-4bits模型调优:OpenClaw任务响应速度提升50%的3个技巧 1. 问题背景与优化动机 去年冬天,当我第一次将百川2-13B-4bits模型接入OpenClaw时,发现一个奇怪现象:同样的自动化任务,在本地测试时响应飞快&#x…...

aibye爱毕业推出六大顶尖平台评测,智能润色与高效创作功能一键实现,科研领域不可或缺的AI助手

工具名称 核心功能 特色优势 Aibiye 论文生成降AI率 全学科覆盖、仿写优化、自动图表生成 Aicheck AI检测文献综述辅助 精准查新、3分钟高效成文 GPT学术版 润色/翻译/代码解释 多模型协同、PDF深度解析 摆平论文 大纲生成降重改写 三步出稿、本硕博通用 QuillB…...

ROS2数据录制实战:用ros2 bag记录小海龟运动轨迹(附常见问题排查)

ROS2数据录制实战:从入门到精通的ros2 bag全指南 小海龟在屏幕上划出优美轨迹的瞬间,你是否想过如何完整记录这些运动数据?ROS2中的ros2 bag工具正是为解决这类需求而生。作为机器人开发中的数据"时光机",它不仅能忠实记…...

CasaOS应用商店太单调?试试这几个社区维护的源,青龙面板、迅雷都能一键装

CasaOS社区应用源全攻略:解锁青龙面板、迅雷等本土化神器 如果你已经厌倦了CasaOS官方应用商店里那些千篇一律的容器镜像,正为找不到迅雷下载、青龙面板这类中国特色应用而发愁,那么这篇文章就是为你准备的。作为一个长期折腾家庭服务器的玩家…...

如何永久保存微信聊天记录?WeChatMsg免费工具终极指南

如何永久保存微信聊天记录?WeChatMsg免费工具终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCha…...

别再折腾环境变量了!WIN10下搞定Modelsim 10.5许可证的终极保姆级教程

WIN10下Modelsim 10.5许可证配置的终极解决方案 如果你正在为Modelsim 10.5在WIN10系统下的许可证问题而头疼,尝试了各种破解方法却依然无果,那么这篇文章就是为你准备的。作为一名长期与EDA工具打交道的工程师,我深知许可证配置不当带来的挫…...

Zemax优化别再乱点‘锤子’了!一个光学新手的真实踩坑与避坑指南

Zemax优化实战:从新手误区到高效操作的进阶指南 刚接触Zemax的光学设计师们,往往会被软件中那个神秘的"锤形优化"按钮所吸引——看似简单的点击就能自动改善设计,这种诱惑难以抗拒。但很快就会发现,盲目依赖这个功能可能…...