10 个高频 Python 面试题

本文介绍了10个针对Python高级开发者的面试题目,涵盖了整数缓存机制、避免嵌套循环的方法、类方法和静态方法的区别、eval函数的使用及其风险、抽象类、Python的垃圾回收机制、处理无限数量参数的方式、lambda函数的应用以及推导式的理解。这些问题旨在测试开发者对Python内部机制的深入理解。
摘要由CSDN通过智能技术生成

Python 很容易学会,但很难掌握。

你可以在几天内了解它的基本语法,但是要能够用 Python 开发出足够好的商业软件,多年的实践是必须的。

因为,无论你使用哪种编程语言,你都必须对其复杂的内部机制有足够的了解,才能写出健壮的程序。

本文分享 10 个针对高级开发人员的 Python 面试题。它可以测试你对 Python 内部机制理解的程度。

一、Python中的整数缓存机制

面试官:

请解释在 Python shell 解释器上执行的代码的以下结果:

>>> a=256  
>>> b=256  
>>> a is b  
True  
>>> x=257  
>>> y=257  
>>> x is y  
False  

回答:

这是因为 Python 中的整数缓存机制。为了节省时间和内存成本,Python 总是预先加载 [-5, 256] 范围内的所有小整数。

因此,[-5, 256] 中的所有整数都已经保存在内存中。当声明此范围内的新整数变量时,Python 只是将缓存的整数引用到它,不会创建任何新对象。

因此,对结果的解释是:

当变量 a 和 b 分配给 256 时,它们被引用到存储 256 的相同内存位置。他们指向同一个对象。

当变量 a 和 b 被分配给 257 时,它们是不同内存位置的两个不同对象,因为 257 不在小整数缓存范围内。

由于 is 运算符要比较两个变量的内存位置,a is b 应该输出 True ,x is y 应该输出 False。

二、如何避免嵌套循环

面试官:

下面的程序使用了嵌套循环,你将如何优化它?

list_a = [1, 2020, 70]  
list_b = [2, 4, 7, 2000]  
list_c = [3, 70, 7]  
  
for a in list_a:  
    for b in list_b:  
        for c in list_c:  
            if a + b + c == 2077:  
                print(a, b, c)  
# 70 2000 7  

回答:

可以使用 itertools 中的 product 函数对其进行优化:

from itertools import product  
  
list_a = [1, 2020, 70]  
list_b = [2, 4, 7, 2000]  
list_c = [3, 70, 7]  
  
for a, b, c in product(list_a, list_b, list_c):  
    if a + b + c == 2077:  
        print(a, b, c)  
# 70 2000 7  

因为 product 函数生成输入迭代的笛卡尔积。它可以帮助我们在很多场景中避免嵌套循环。

三、 类方法和静态方法

面试官:

在 Python 类中,类方法和静态方法有什么区别?

回答:

类方法是 Python 类中的第一个参数是类本身的方法。我们用 cls 这个参数来表示。

类方法不仅可以由实例调用,也可以由类直接调用。

静态方法是 Python 类中没有类或实例参数的方法。

因为静态方法不包含有关特定类或实例的参数。我们可以将其定义为类外的独立函数,并将其用作类外的其他普通函数。

可以阅读为什么 classmethod 比 staticmethod 更受宠?了解更多。

四、eval 函数的使用

面试官:

能否用一行 Python 代码中实现一个函数,它将接收两个数字 a 和 b 一个字符串 op。op 代表算术运算符,例如 “+”、“-”、“*”和“/” 。函数需要返回 op 的计算结果 a op b。

回答:

def cal(a, b, op): return eval(f'{a} {op} {b}')  

面试官:

好!那你能谈谈 eval 函数的缺点,以及为什么它不适合在生产中使用吗?

回答:

在生产环境中,我们应该仔细检查用户输入以避免意外问题。eval 函数会立即执行输入,这可能造成远程代码执行,这是非常危险的,强烈建议不要在生产环境使用 eval,即使你做了很多安全检查。可以阅读前文看完此文,你还会用 eval 吗?了解更多。

五、抽象类

面试官:

在面向对象编程中,有一个概念叫做抽象类。Python 也支持抽象类吗?

回答:

支持。Python 标准库有个模块 abc,它为抽象类提供功能。

通过继承类 abc.ABC,可以将类定义为抽象类,借助于装饰器 abc.abstractmethod,我们可以将方法定义为抽象方法。

例如:

from abc import ABC, abstractmethod  
  
class Animal(ABC):  
    @abstractmethod  
    def move(self):  
        pass  

六、函数传参的机制

面试官:

Python 是按值还是按引用传参?

回答:

既不是按值传递,也不是按引用传递,Python 自有一套机制,我们都知道 Python 的世界里,万物皆对象,从这个方面讲,传递给函数的,都是对象的地址,这有点像引用的概念,但是 Python 的对象分为可变对象和不可变对象,不可变对象就是不可修改的对象,例如:数字、字符串、元组,在不可变对象上的自增操作会新创建一个对象。

如果从其他编程语言过来学 Python 的,可以简单的这么理解:对于不可变对象,是按值传递,函数内部不会修改不可变对象,对于可变对象,是按引用(地址)传递,函数内部的修改会影响到参数本身。

可以阅读前文Python基础系列-可变/不可变数据类型了解更多。

七、Python 中的垃圾回收

面试官:

Python 如何收集垃圾(无用的对象)?

回答:

Python 使用一种称为引用计数的方法来决定何时需要在内存中收集对象。

简单来说,Python 会计算每个对象的引用计数,当一个对象没有引用时,会自动收集。

推荐这两篇文章来理解 Python 的垃圾回收:

  1. 学习一下 Python 的垃圾回收

  2. Python 是如何管理内存的?

八、在 Python 函数中接收无限数量的参数

面试官:

请解释函数参数中星号的以下用法:

def func(*args, **kwargs):  
    pass  

回答:

按照惯例,如果无法清楚地确定其参数的数量,我们会像示例一样定义一个 Python 函数。

以单个星号为前缀的参数 args 表示可以将任意数量的位置参数保存到元组中,args 就是这个元组的名称。

以两个星号为前缀的参数 kwargs 表示可以将任意数量的位置参数保存到字典中,kwargs 就是这个字典的名称。

九、 Lambda 函数

面试官:

Python 中的 lambda 函数是什么?你能否提供一个利用 lambda 函数强大功能的示例?

回答:

lambda 函数,或称为匿名函数,是一个没有函数名的简单 Python 函数。

编写 lambda 函数的模板是:

lambda 参数:表达式  

使用它的一个很好的场景是 sort 函数,比如:

  
leaders = ["Warren Buffett", "Yang Zhou", "Tim Cook", "Elon Musk"]  
print(leaders)  
# ['Warren Buffett', 'Yang Zhou', 'Tim Cook', 'Elon Musk']  
leaders.sort(key=lambda x: len(x))  
print(leaders)  
# ['Tim Cook', 'Yang Zhou', 'Elon Musk', 'Warren Buffett']  

十、Python 中的一些推导式

面试官:

Python中的推导式是什么?

回答:

推导式技巧是 Python 中的语法糖。它可以帮助轻松生成特定的数据结构。Python 中有四种类型的推导式:

  1. 列表推导式

  2. 生成器推导式

  3. 集合推导式

  4. 字典推导式

例如,我们可以如下生成字典:

Entrepreneurs = ["Yang", "Mark", "steve", "jack", "tom"]  
D1 = {id: name for id, name in enumerate(Entrepreneurs) if name[0].isupper()}  
print(D1)  
# {0: 'Yang', 1: 'Mark'}  

推荐阅读 如何写出更具有 Python 风格的代码

最后的话

🎁福利🎁 全网最全《Python学习资料》免费赠送🆓!

最近火热ChatGPT 等人工智能应用对 Python 编程语言产生了积极的影响,它推动了 Python 的普及和发展,在文本处理和 NLP 领域提升了 Python 的地位,促进了 Python 生态系统的成长

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python学习路线

python学习路线图1
在这里插入图片描述

二、Python基础学习
1. 开发工具

2. 学习笔记

在这里插入图片描述

3. 学习视频

在这里插入图片描述

三、Python小白必备手册

图片

四、数据分析全套资源

在这里插入图片描述

五、Python面试集锦
1. 面试资料

在这里插入图片描述

在这里插入图片描述

2. 简历模板

在这里插入图片描述

因篇幅有限,仅展示部分资料,添加上方即可获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值