专业的编程技术博客社区

网站首页 > 博客文章 正文

10个Python面试的高级问题

baijin 2025-01-14 10:37:15 博客文章 9 ℃ 0 评论

帮助你的下一次面试


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

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

什么是Nolocal和Global关键字?

这两个关键字用于更改先前声明的变量的范围。 当您需要访问嵌套函数中的变量时,通常使用nolocal:

def func1(): 
  x = 5 

def func2(): 
  nolocal x 
  print(x) 

func2()

全局是更直接的说明。 它使先前声明的变量成为全局变量。 例如,考虑以下代码:

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

func1() 

> 5

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

x = 5 

def func2(): 
  x += 3 

func2() 

> UnboundLocalError: local variable 'c' referenced before assignment

为了使它起作用,我们需要用x表示全局变量x:

x = 5 

def func2(): 
  global x 
  x += 3 

func2()

类方法和静态方法有什么区别?

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

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

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

什么是GIL,以及解决该问题的一些方法?

GIL代表全局解释器锁,它是Python用于并发的一种机制。它内置于Python系统中,目前尚无法摆脱。GIL的主要缺点是它使线程不是真正的并发。它锁定了解释器,即使看起来您正在使用线程,它们也不会同时执行,从而导致性能损失。以下是一些解决方法:

· 多处理模块。 它使您可以生成新的Python进程并以与管理线程相同的方式对其进行管理。

· 异步模块。 它有效地启用了异步编程并添加了async / await语法。 虽然它不能解决GIL问题,但可以使代码更易读和清楚。

· 无堆栈Python。 这是没有GIL的Python的分支。 它最显着的用途是作为EVE Online游戏的后端。

什么是元类以及何时使用它们?

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

Python中的元类和元编程是一个巨大的话题。 如果您对此感兴趣,请务必阅读更多有关它的内容。

什么是类型注释?什么是通用类型注释?

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

· 整型

· 浮动

· 布尔

· 力量

· 字节

复杂类型可从键入模块中获得:

· List

· Set

· Dict

· Tuple

· 等等

这是定义带类型注释的函数的方式:

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

泛型类型注释是采用另一种类型作为参数的注释,允许您指定复杂的逻辑:

· list[int]

· 等等

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

什么是生成器函数?编写自己的Range版本

生成器函数是可以在返回值后暂停执行的函数,以便稍后再恢复它并返回另一个值。这可以通过yield关键字来实现,您可以使用它来代替return。您使用过的最常见的生成器功能是范围。这是实现它的一种方法(仅适用于积极的步骤,我将其作为一种练习来支持消极的步骤):

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

什么是Python中的装饰器?

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

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

@my_decorator 
def func1(): 
  pass

什么是Python中的pickle?

pickle是Python所说的序列化方式。 借助pickle,您可以将对象序列化为字符串(或其他任何选择),以便持久存储在网络上或通过网络发送。 取消pickle是从pickle的字符串中还原原始对象的过程。 pickle不安全。 仅释放受信任来源的对象。

这是腌制基本数据结构的方法:

import pickle 

cars = {"Subaru": "best car", "Toyota": "no i am the best car"} 
cars_serialized = pickle.dumps(cars) 
# cars_serialized is a byte string 
new_cars = pickle.loads(cars_serialized)

Python函数中的* args和** kwargs是什么?

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

def func1(*args, **kwargs): 
  print(args) 
  print(kwargs) 

func1(1, 'abc', lol='lmao') 

> [1, 'abc'] 
> {"lol": "lmao"}

什么是.pyc文件?

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

您如何在Python中定义抽象类?

您可以通过从abc模块继承ABC类来定义抽象类:

from abc import ABC 

class AbstractCar(ABC): 
  @abstractmethod 
  def drive(self): 
    pass

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

class ToyotaSupra(AbstractCar): 
  def drive(self): 
    print('brrrr sutututu')

结束语

感谢您的阅读,并祝您在下次面试中一切顺利。

资源资源

· 深度的Python上下文管理器

(本文由闻数起舞翻译自Michael Krasnov的文章《10 Advanced Python Interview Questions》,转载请注明出处,原文链接:https://medium.com/better-programming/10-advanced-python-interview-questions-d36e3429601b)

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表