python面试题

深拷贝和浅拷贝的区别?

浅拷贝是将一个对象的引用赋给另一个对象,如果修改被赋值对象的内容,会影响原对象;深拷贝是将原对象的内容复制给另外一个对象,如果修改被赋值对象的内容,不会影响原对象。

列表和元祖有什么区别?

列表里面的元素是可以改变的,元祖里面的元素不能改变。

*args和**kwargs区别?

*args是元祖参数,将参数打包成元祖给函数调用;
**kwargs是字典参数,将参数打包成字典给函数体调用

如何随机打乱列表中的元素,不引用额外内存空间?
import random

l = [1, 2, 3, 4, 5]
random.shuffle(l)
print(l)
什么是闭包?

闭包就是,一个函数里面有一个内函数,这个函数返回了有关内函数的引用。
闭包一般可以用于创建函数。
例如创建下面的一元二次函数2x-3:
在这里插入图片描述

//和** 是什么符号?

//:是做完除法之后向下取整
**:是幂次函数。2**3就是2的3次方

python2和python3的range(100)的区别

python2返回列表,python3返回迭代器,节约内存

python的GIL

GIL全局解释器锁。像全局排他锁一样,GIL的目标是保证数据的一致性。

每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。

线程释放GIL锁的情况: 在IO操作等可能会引起阻塞的情况下,会暂时释放GIL,但在执行完毕后,必须重新获取GIL。

Python使用多进程是可以利用多核的CPU资源的。
多线程在处理存在IO情况的时候比单线程要优秀,因为线程遇到IO阻塞时会释放GIL锁

python怎么实现多线程

threading模块

python中的垃圾回收机制

通过引用计数实现的,如果一个对象的引用次数是0,就回收这个对象
引用计数机制为主,标记-清除分代回收两种机制为辅的策略

引用计数的问题是会出现循环引用,可以用gc模块来解决这个问题

标记-清除:对象之间的引用可以构成有向图,从根对象出发(全局变量、调用栈、寄存器)标记被引用过的对象,然后清除没被引用的对象。

分代回收:将内存分为年轻代、中年代、老年代(链表)
新创建的对象都会分配到年轻代,年轻代的链表满了之后,触发垃圾回收机制;不用收回的会放到中年代。

python中的__init__和 __new__方法

new是真正的构造方法,用于创建一个新实例,并返回这个实例
init初始化一个新实例,添加属性,不需要返回值

python的元类metaclass使用过吗?是用来解决什么问题的?

python里面实例是类的实例,类是元类的实例
一个类的类型就是元类,可以用元类来创建类

什么是python解释器?有哪些常见的解释器?

Python解释器本身也是个程序, 它是解释执行 Python代码的,所以叫解释器。

我们运行Python程序时,先运行Python解释器,通过这个解释器,去读取我们的Python程序文件,这个解释器再以机器指令语言告诉CPU如何去做。pycharm在创建新项目的时候可以选择解释器。

常见的解释器
Cpython:官网的标准解释器
IPython:在Cpython的基础上提高了交互性
PyPy:提高了执行速度(通过JIT技术),带GIL
Jython:不带GIL

为什么python会比其他语言慢?

判断数据类型:执行的时候要不断的判断数据类型,带来很大的开销
解释型语言:由解释器逐条解释执行,而编译语言可以直接把代码编译到机器码。
多线程的情况下,有GIL锁束缚性能

### Python 面试题及答案解析 #### 1. 简述 Python 的特点与优缺点 Python 是一种解释型、动态类型的高级编程语言,其设计哲学强调代码的可读性和简洁性。主要特点包括: - **语法简洁优美**:相比 Java 或 C++,Python 的语法更易读且易于学习。 - **功能强大**:拥有丰富的标准库和第三方库,适用于 Web 开发、数据析、人工智能等多个领域。 - **可移植性、可扩展性、可嵌入性**:可在多种操作系统上运行,并能与其他语言合使用。 然而,Python 也存在一些缺点: - **运行速度较慢**:由于是解释型语言,执行效率低于编译型语言如 C 或 Java。 - **弱类型系统**:虽然提高了灵活性,但也可能导致运行时错误[^2]。 #### 2. 解释 `is` 和 `==` 的区别 在 Python 中,`is` 和 `==` 都可以用于比较操作,但它们的作用不同: - `==` 用于检查两个对象的值是否相等。 - `is` 用于检查两个对象的身份(即内存地址)是否相同。 例如: ```python a = [1, 2, 3] b = a c = [1, 2, 3] print(a == b) # True,因为值相同 print(a is b) # True,因为指向同一对象 print(a == c) # True,因为值相同 print(a is c) # False,因为是不同的对象 ``` 上述例子说明了即使两个变量具有相同的值,如果它们不是同一个对象,则 `is` 比较果为 `False` [^4]。 #### 3. 解释 `range()` 和 `xrange()` 的区别 在 Python 2 中,`range()` 返回一个列表,而 `xrange()` 返回一个 xrange 对象,后者在迭代时按需生成数字,节省内存空间。但在 Python 3 中,`xrange()` 已被移除,`range()` 的行为类似于 Python 2 的 `xrange()`,返回的是一个可迭代对象[^3]。 #### 4. 列表推导式的基本用法 列表推导式是一种简洁的方式来创建列表。其基本构如下: ```python [expression for item in iterable if condition] ``` 例如,生成 0 到 9 中偶数的平方: ```python squares_of_evens = [x**2 for x in range(10) if x % 2 == 0] print(squares_of_evens) # 输出: [0, 4, 16, 36, 64] ``` 这种方式不仅简洁,而且执行效率较高。 #### 5. 如何处理异常? Python 使用 try-except 块来捕获和处理异常。基本构如下: ```python try: # 尝试执行的代码 except ExceptionType as e: # 处理特定类型的异常 finally: # 不管是否有异常都会执行的代码 ``` 例如: ```python try: result = 10 / 0 except ZeroDivisionError as e: print("不能除以零:", e) finally: print("无论是否出错都会执行") ``` 这种机制可以帮助程序优雅地处理错误情况,避免程序崩溃[^1]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值