Python面试必知100例。收集整理了目前Python岗位常见的面试题,希望大家通过学习理解相关知识点。下面介绍的是6~10道题。
六、什么是lambda函数?
在Python中,lambda函数也被称为匿名函数,这是因为它们没有正式的函数名。lambda函数是一种简洁的创建小型函数的方式。
lambda函数的基本语法如下:
lambda arguments: expression
这里,arguments是函数的输入,而expression是函数的输出。lambda函数可以接受任意数量的参数,但只能有一个表达式。
例如,我们可以创建一个lambda函数来计算两个数字的和:
add = lambda x, y: x + y
print(add(5, 3)) # Output: 8
在这个例子中,lambda函数接受两个参数x和y,并返回它们的和。然后我们将这个lambda函数赋值给add,这样我们就可以像使用其他函数一样使用这个lambda函数了。
尽管lambda函数在代码中看起来更简洁,但是它们通常只在需要简单功能的地方使用,例如作为排序函数的关键字参数。对于更复杂的功能,通常推荐使用完整的def语句来定义函数。
七、什么是装饰器?
在Python中,装饰器(Decorator)是一种特殊类型的函数,它允许我们向已经存在的对象添加额外的功能。装饰器的常见用途包括插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是修改已有对象的一种轻便、强大且可维护的方式。
装饰器的基本语法如下:
@decorator
def function():pass
这里,@decorator是装饰器,**function()**是要被装饰的函数。Python会先执行装饰器来装饰函数,然后再执行这个函数。
以下是一个简单的装饰器示例:
def my_decorator(func):def wrapper():print("在函数被调用之前,发生了一些事情。")func()print("在函数被调用之后,发生了一些事情。")return wrapper@my_decorator
def say_hello():print("你好!")say_hello()
在这个例子中,my_decorator是一个装饰器,它接受一个函数作为参数,并返回一个新的函数wrapper。这个新的函数在调用原函数之前和之后都会执行一些额外的代码。然后,我们使用**@my_decorator来装饰say_hello函数。最后,当我们调用say_hello函数时,它会先执行装饰器添加的代码,然后再执行原本的say_hello**函数代码。
八、什么是多进程?
多进程是一种并发执行技术,其中程序的不同部分在不同的进程中运行。每个进程都有自己的内存空间和系统资源。进程是操作系统进行资源分配和调度的基本单位,是应用程序运行的载体。
多进程技术的主要优点是它可以充分利用多核CPU的计算能力。因为每个进程都有自己的内存空间,所以在一个进程中发生的错误不会影响其他进程。这使得多进程应用程序更加稳定。
在Python中,可以使用multiprocessing模块来创建和管理多进程。例如,你可以创建一个Process对象,然后调用它的start()方法来启动一个新的进程。可以使用Queue或Pipe等工具进行进程间的通信。
需要注意的是,由于Python的全局解释器锁(GIL)的存在,多线程在Python中通常无法有效利用多核CPU。因此,对于计算密集型任务,使用多进程通常比使用多线程更有效。
九、什么是多线程
多线程是一种并发执行的技术,它允许单个程序中的不同部分同时执行。这些不同部分被称为线程,所有线程都在同一进程中运行,共享相同的内存空间和系统资源。
与多进程相比,多线程有几个优点:
- 线程的启动和结束的开销相比进程要小得多,因为所有线程都在同一进程中,无需进行进程上下文的切换。
- 线程之间的通信更加简单,因为它们共享内存空间,可以直接访问相同的数据。然而,这也需要一些同步机制(如互斥锁、信号量等)来防止多个线程同时修改同一份数据,导致数据不一致。
在Python中,可以使用threading模块来创建和管理线程。例如,你可以创建一个Thread对象,然后调用它的**start()**方法来启动一个新的线程。
十、请介绍下深拷贝与浅拷贝的区别
在Python中,深拷贝和浅拷贝是两种不同的复制方式,主要区别在于它们处理对象内部的子对象的方式不同。
- 浅拷贝(Shallow Copy):创建一个新的对象,但只复制原对象的引用,不复制内部的子对象。这意味着新对象和原对象会共享内部的子对象。在Python中,可以使用copy.copy()函数或者使用某些类型的构造函数(如list(), **dict()**等)来创建浅拷贝。
- 深拷贝(Deep Copy):创建一个新的对象,并递归复制原对象的所有元素,包括内部的子对象。这意味着新对象和原对象不会共享任何元素。在Python中,可以使用**copy.deepcopy()**函数来创建深拷贝。
import copy# 浅拷贝示例
a = [[1, 2, 3], [4, 5, 6]]
b = copy.copy(a)
b[0][0] = 100
print(a) # Output: [[100, 2, 3], [4, 5, 6]]# 深拷贝示例
a = [[1, 2, 3], [4, 5, 6]]
b = copy.deepcopy(a)
b[0][0] = 100
print(a) # Output: [[1, 2, 3], [4, 5, 6]]
在浅拷贝示例中,修改了b的元素,但a的相应元素也发生了变化,这是因为a和b共享内部的子对象。而在深拷贝示例中,修改了b的元素,a的元素没有发生变化,这是因为a和b不共享任何元素。