10 个高级 Python 面试问题

news/2024/11/8 23:05:07/

 

随着 Python 最近变得越来越流行,你们中的许多人可能正在接受与 Python 打交道的技术面试。在这篇文章中,我将列出十个高级 Python 面试问题和答案。

这些内容可能会令人困惑,并且针对的是中级开发人员,他们需要对 Python 作为一种语言及其背后的工作原理有很好的理解。

1、Nolocal 和 Global 关键字的用途是什么?

这两个关键字用于更改先前声明的变量的范围。nolocal当您需要访问嵌套函数中的变量时经常使用nolocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。

def func1():
    x = 5
    def func2():
        nolocal x
        print(x)
    func2()

global是一个更直接的指令。它使先前声明的变量成为全局变量。例如,考虑这段代码:

x = 5
def func1():
    print(x)
func1()
>>>5

由于x在函数调用之前声明,因此func1可以访问它。但是,如果您尝试更改它:

x = 5
def func2():
    x += 3
func2()
>>>UnboundLocalError: 赋值前引用了局部变量“c”

为了让它工作,我们需要指出x我们指的是全局变量x

x = 5
def func2():
    global x
    x += 3
func2()

2、class方法和静态方法有什么区别?

它们都定义了一个class方法,可以在不实例化class的对象的情况下调用该方法。唯一的区别在于他们的签名:

A class:
    @staticmethod
    def func1():
        pass
    @classmethod
    def func2(cls):
        pass

如您所见,classmethod接受一个隐式参数cls,该参数将被设置为classA本身。一个常见的用例classmethod是创建替代的可继承构造函数。

3、什么是 GIL 以及绕过它的一些方法是什么?

GIL 代表全局解释器锁,它是 Python 用于并发的一种机制。它内置于 Python 系统的深处,目前无法摆脱它。GIL 的主要缺点是它使线程不是真正的并发。它锁定了解释器,即使看起来你正在使用线程,但它们并不是同时执行的,从而导致性能损失。这里有一些绕过它的方法:

  • multiprocessing模块。它允许您生成新的 Python 进程并以与管理线程相同的方式管理它们。
  • asyncio模块。它有效地启用了异步编程并添加了async/await语法。虽然它没有解决 GIL 问题,但它会使代码方式更易读和更清晰。
  • Stackless_Python这是一个没有 GIL 的 Python 分支。它最显着的用途是作为 EVE Online 游戏的后端。

3、什么是metaclass以及何时使用它们?

metaclass是class的class。当继承过于混乱时,元class可以指定许多class共有的某些行为。一种常见的元class是ABCMeta,用于创建抽象class。

Python 中的元class和元编程是一个很大的话题。如果您对此感兴趣,请务必相关信息。

4、什么是class型注解?什么是通用class型注释?

虽然 Python 是一种动态class型语言,但为了清晰起见,有一种方法可以对class型进行注释。这些是内置class型:

  • int
  • float
  • bool
  • str
  • bytes

typing模块提供了复杂class型:

  • List
  • Set
  • Dict
  • Tuple
  • Optional
  • ETC。

以下是如何使用class型注释定义函数:

def func1(x: int, y: str) -> bool:
    return False

泛型class型注解是将另一种class型作为参数的注解,允许你指定复杂的逻辑:

  • List[int]
  • Optional[List[int]]
  • Tuple[bool]

请注意,这些仅用于警告和静态class型检查。您将无法在运行时保证这些class型。

5、什么是生成器函数?编写您自己的范围版本

生成器函数是可以在return值后暂停执行的函数,以便稍后恢复执行并return另一个值。这是pass关键字实现的yield,您使用它代替 return。您使用过的最常见的生成器函数是range. 这是实现它的一种方法(仅适用于积极的步骤,我将把它留作练习以制作支持消极步骤的方法):

def range(start, end, step):
    cur = start
    while cur > end:
        yield cur
        cur += step

6、什么是 Python 中的装饰器?

Python 中的装饰器用于修改函数的行为。例如,如果您想记录对一组特定函数的所有调用、缓存其参数和return值、执行基准测试等。

装饰器以符号为前缀@,并放置在函数声明之前:

@my_decorator
def func1():
    pass

7、什么是 Python 中的 Pickling 和 Unpickling?

序列化的 Python 方式. Pickling 允许您将对象序列化为字符串(或您选择的任何其他内容),以便持久存储或pass网络发送。Unpickling 是从字符串中恢复原始对象的过程。Pickling 是不安全的。只从受信任的来源中提取对象。

下面是你将如何 pickle 一个基本的数据结构:

import pickle
cars = {"Subaru": "best car", "Toyota": "no i am the best car"} cars_serialized = pickle.dumps(cars)
# cars_serialized 是一个字节串new_cars = pickle.loads(cars_serialized)

8、什么是*argsPython**kwargs函数?

这些与拆包密切相关。如果你放入*args函数的参数列表,所有未命名的参数都将存储在args数组中。**kwargs工作方式相同,但对于命名参数:

def func1(*args, **kwargs):
    print(args)
    print(kwargs)
func1(1, 'abc', lol='lmao')
> [1, 'abc']
> {"lol": "lmao" }

9、文件有什么.pyc用?

.pyc.class文件包含 Python 字节码,与Java 中的文件相同。不过,Python 仍然被认为是一种解释型语言,因为这个编译阶段发生在您运行程序时,而在 Java 中,它们是明确分开的。

10、你如何在 Python 中定义抽象class?

ABC您从模块继承来定义抽象 abc

from abc import ABC,abstractmethod
class AbstractCar(ABC):
    @abstractmethod
    def drive(self):
        pass

要实现该class,只需继承它:

class 红旗汽车(AbstractCar):

      def drive(self):

          print('go go go')

if __name__ == '__main__':

      a = 红旗汽车()

      a.drive()


http://www.ppmy.cn/news/40523.html

相关文章

个人-计算机操作系统第四章

第四章 存储器管理 一、章节习题 1、在下列存储管理方案中,不适应于多道程序设计的是________。 A 单一连续区分配 B 固定式分区分配 C 可变式分区分配 D 段页式存储管理 2、在可变分区存储管理方案中需要一对界地址寄存器,其中________作…

工程管理系统软件 自主研发,工程行业适用

ava版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示1…

R -- 方差分析实战部分

brief 在生物统计学中有对应的纯理论部分,这里也有部分理论知识可以稍微了解一下。 术语速成部分 单因素组间方差分析 单因素组内分析 双因素混合模型 协方差分析和多元方差分析 R中的aov函数 需要注意的是car包的Anova()函数与标准anova()函数有细微区别&#x…

常用环境部署(七)——Docker安装RocketMQ

1、创建namesrv服务 (1)拉取镜像 docker pull rocketmqinc/rocketmq(2)创建一个数据目录 即创建一个namesrv数据存储路径 mkdir -p /docker/rocketmq/nameserver/logs /docker/rocketmq/nameserver/store(3&#x…

ROBOMASTER机甲大师赛视觉组学习方案2023更新第一版

ROBOMASTER机甲大师赛视觉学习方案技能更新硬件平台环境配置仓库地址还在学校的时候我写 ROBOMASTER机甲大师赛视觉组学习方案这篇博客,没想到两年以后还有同学会来时不时的收藏,现在工作后回过头再来看发现有一些东西比较旧了所以更新这篇博客&#xff…

企业IM即时通讯软件需要具备哪些功能?

随着互联网的普及,即时通讯软件也渗透到了人们的日常生活和工作当中,而市面上的即时通讯软件现在有分为两种,一种是个人社交沟通软件,另外一种则是企业即时通讯。企业即时通讯软件是为了让企业内部方便沟通、管理及办公&#xff0…

Linux运维进阶之路

前言 首先在我看来,不论你以后是做运维亦或者是做后端开发,云计算等。只要和后端搭边,Linux都是必会的基础知识。所以说Linux是伴随我们工作中一个特别重要的知识。 不过很多同学在初学Linux的时候,始终不得其法,发现…

【分布式版本控制系统Git】| 国内代码托管中心-Gitee、自建代码托管平台-GitLab

目录 一:国内代码托管中心-码云 1. 码云创建远程库 2. IDEA 集成码云 3. 码云复制 GitHub 项目 二:自建代码托管平台-GitLab 1. GitLab 安装 2. IDEA 集成 GitLab 一:国内代码托管中心-码云 众所周知,GitHub 服务器在国外&…