网站首页 > 博客文章 正文
帮助你的下一次面试
随着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)
猜你喜欢
- 2025-01-14 C#面试宝典 2022年 60个常见的C#面试问题和答案
- 2025-01-14 宝藏!2024年RAG面试问题及答案 TOP30(下)
- 2025-01-14 40道 Redis 运维面试题(附答案)
- 2025-01-14 SpringBoot 整合 Quartz 实现 JAVA 定时任务的动态配置
- 2025-01-14 「干货」 redis面试题
- 2025-01-14 关于Java 工程师面试,这几个点注意了,offer拿到手软
- 2025-01-14 Java程序员面试自我介绍部分讲什么?面试技巧
- 2025-01-14 这358道大厂经典面试前端面试题,你会多少?
- 2025-01-14 读完这46道Redis面试题之后,你就会觉得自己的Redis白学了
- 2025-01-14 「8年老 Android 开发」最全最新 Android 面试题系列全家桶(带答案)
你 发表评论:
欢迎- 366℃用AI Agent治理微服务的复杂性问题|QCon
- 358℃初次使用IntelliJ IDEA新建Maven项目
- 353℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 351℃Maven技术方案最全手册(mavena)
- 348℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 346℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 344℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 342℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)