10个常见的python面试问题

全球有超过 800 万名 Python 开发人员。 每天都有成千上万的新学习者加入 Python 社区。 残酷的事实是,只有 10-20% 的人能够成为一名优秀的开发人员并找到一份好工作。 原因是他们无法解决一些高级面试问题。接下来,我将与你分享高频常见的10个重要的 Python 问题。

1. .py.pyc 文件有什么区别?

.py 文件是程序的源代码。 .pyc 文件是程序的编译字节。

Python 编译 .py 文件并将其保存为 .pyc 文件。 然后由Python虚拟机执行。

在执行主要源代码之前,python会查找它的编译版本(.pyc 文件),如果 python 找到,那么它将在虚拟机的帮助下执行它。
如果没有,那么它将寻找一个 .py 文件编译它然后执行 .py 文件。 基本上,.pyc 文件通过再次执行已编译的代码来节省编译时间。

2. 什么是抽象?如何在Python中实现抽象?

抽象用于向用户隐藏函数的内部功能。他们可以与函数交互并生成结果,但不知道结果是如何生成的。

简单来说,抽象就是用来对用户隐藏不相关的数据,以降低程序的复杂度。 在 Python 中借助 ABC 模块,我们可以实现抽象。

抽象类也可以作为其他类的基石,因为你不能为抽象类创建对象,所以访问元素的唯一方法是使用继承。

from abc import ABC, abstractmethod

class Parent(ABC):

    @abstractmethod
    def show(self):
        pass
  
class child(Parent):
    def show(self):
        print("Child Class")

obj = child() # 抽象类不能被实例化
obj.show() # Child Class
复制代码

3. 什么是 FrozenSet ?举例说明它的重要性。

FrozenSets 类似于集合,唯一的区别是它们是不可变的。

你可以随时修改 set 的元素,但 frozenset 一旦创建就无法修改。

这意味着不能在创建后执行添加、删除或更新任何元素。
frozenset 将可迭代对象作为输入并使它们不可变。由于冻结集是不可变的,因此它们可以作为字典中的键。

data = {"Name": "Roger", "Pin": 3056, "ActNo":9892345112234565}
fSet = frozenset(data)
print(fSet) # frozenset({'Name', 'Pin', 'ActNo'})
复制代码

4. 浅拷贝与深拷贝的区别说明?

浅复制 将对象的引用存储在新的内存位置。对新位置所做的更改也会反映在以前的位置上。它比深拷贝更快。

深度复制 将对象的值存储在新位置。对新位置所做的任何更改都不会反映在以前的位置上。

id 用于查看对象的内存地址。当然,下面例子的地址在你的计算机上是不同的。

## 浅拷贝 
data = [1, 2, 3, 4, 5]
updated_data = data
updated_data.append(6)
print(updated_data) # [1, 2, 3, 4, 5, 6]
print(data) # [1, 2, 3, 4, 5, 6]
print(id(data)) # 16777216
print(id(updated_data)) # 16777216


## 深拷贝 
import copy
data = [1,2,3,4,5]
updated_data = copy.deepcopy(data)
updated_data.append(6)
print(updated_data) # [1, 2, 3, 4, 5, 6]
print(data) # [1, 2, 3, 4, 5]
print(id(updated_data)) # 16777216
print(id(data)) # 14020317
复制代码

5. pickle如何使用?

Pickling 是将 Python对象 转换为 字节流 的过程, 通常称为序列化。

Unpickling 是逆操作,将 字节流 转换成 python对象, 通常称为反序列化。

python中我们用pickle.dumppickle.load 来实现序列化和反序列化。

## Pickling
import pickle
data =  {
    'Names': ["Karl","Robin","Lary"],
    'Id': ('G770531','G770532','G770533'),
    'Salary':[55600,88900,76000]
    }
output = open('./data.pkl', 'wb')
pickle.dump(data, output)
output.close()

## Unpickling
import pickle
stream = open('./data.pkl', 'rb')
data = pickle.load(stream)
print(data) # {'Names': ['Karl', 'Robin', 'Lary'], 'Id': ('G770531', 'G770532', 'G770533'), 'Salary': [55600, 88900, 76000]}
stream.close()
复制代码

6. 参数*args**kwargs是什么?

*args**kwargs 都允许将可变数量的参数传递给函数。当不确定要在函数中传递的参数数量时,将使用它们。

*args 允许你将可变数量的参数传递给函数。

def addNumbers(*numbers):
    sum = 0
    for number in numbers:
        sum = sum + number
    print("Sum: ",sum)
addNumbers(3,5) # Sum: 8
addNumbers(5,6,7) # Sum: 18
复制代码

**kwargs 允许你将可变数量的关键字参数传递给函数。

def addNumbers(**data):
    sum = 0
    for key,value in data.items():
        sum = sum+value
    print("Sum: ",sum)
    
addNumbers(a=5, b=6) # Sum: 11
addNumbers(a=5, b=8, c=10) # Sum: 23
复制代码

7. 如何理解python中的资源管理器?

上下文管理器用于资源管理。它们允许你在需要时分配和释放资源。上下文管理器最常用和最受认可的例子是 with 语句。 它主要用于打开和关闭文件。with 允许在单行出现问题时打开和关闭文件。 它的主要优点是它可以确保文件正确关闭。

with open ('./data.txt','w') as f:
    f.write("Hello")
复制代码

8. 如何理解python中的实例方法、类方法和静态方法?

在 Python 中,可以定义三种方法——实例方法类方法静态方法

  • 实例方法: 是我们在创建类时创建的普通方法。这些方法与对象有关。这些方法的语法是 def do_something(self) ,其中 self 指的是实例对象。

  • 类方法: 与实例对象略有不同。它们与类绑定,而不是与类的对象绑定。这些用于执行类任务并可以更改类的状态。我们用@classmethod装饰器创建一个类方法。

  • 静态方法: 是指在类中定义的方法,主要为了程序逻辑的清晰,这些方法与类无关,而且不需要类的实例。我们用@staticmethod装饰器创建一个静态方法。

9. 什么是nolocalglobal变量?

它们都用于定义变量的范围。Global 是在函数作用域之外定义的变量。 该变量的值对于整个代码是相同的。它可以在程序的任何地方使用。

pi = 3.14  ## 全局变量 
def circle(radius):
    area_of_circle = pi * (radius) ** 2
    print("The area of the circle is: ",   area_of_circle)
circle(7) # The area of the circle is:  153.85
复制代码

NonLocal是在未定义局部作用域的嵌套函数中使用的变量。如果你改变非局部变量的值,局部变量的值也会改变。

def outer_function():
    x = "local_variable"
    def inner_function():
        nonlocal x
        x = "nonlocal_variable"
        print("inner function:", x)
    inner_function()
    print("outer function:", x)
outer_function()
# inner function: nonlocal_variable
# outer function: nonlocal_variable
复制代码

10. 举例说明 Generator?

生成器是一种返回可迭代对象的函数。 Generator 函数必须至少包含一个 yield 语句。 yield 是 Python 中的一个关键字,用于从函数返回值而不破坏其当前状态或对局部变量的引用。 带有 yield 关键字的函数称为生成器。

生成器仅在被要求执行时生成一次项目。 它们的内存效率很高,占用的内存空间更少。

初学者,可以把yield理解为return的另一种形式, 但是它不会停止函数的执行,而是返回一个值。

def fibon(limit):
    a,b = 0,1
    while a < limit:
        yield a
        a, b = b, a + b
        
for x in fibon(10):
    print(x) # 1 2 3 5 8 13 21 34 55 89
复制代码

小节

上面分享了python面试中的高频常见的10个问题,希望某天你想跳槽了或准备找一份工作,对你有所帮助!

欢迎大家点赞、收藏,支持!

pythontip 出品,Happy Coding!

公众号: 夸克编程

点击此处文中代码均可运行