1、当Python退出时,是否会清除所有分配的内存?
答案是否。当Python退出时,对其他对象具有循环引用的Python模块,以及从全局名称空间引用的对象不会被解除分配或释放。无法解除分配C库保留的那些内存部分。退出时,由于拥有自己的高效清理机制,Python会尝试取消分配/销毁其他所有对象。
2、Python的优势有哪些?
Python易于学习
完全支持面向对象
高效的高级数据结构,可用少量代码构建出多种功能
拥有最成熟的程序包资源库之一
跨平台而且开源
3、什么是元组的解封装
首先展示解封装
将1,2,3封装到元组mytuple中,再将值解封装到变量x,y,z
mytuple=1,2,3
print(mytuple)
x,y,z=mytuple
print(x)
print(y)
print(z)
4、Python中如何动态获取和设置对象的属性?
Python中动态获取属性
class MyClass:
def __init__(self):
self.my_attr = 'Hello World'
my_object = MyClass()
# 动态获取属性
my_attr_value1 = getattr(my_object, 'my_attr')
print(my_attr_value1) # 输出: Hello World!
# my_attr_value2=getattr(my_object,'my_name')
# print(my_attr_value2) # AttributeError: 'MyClass' object has no attribute 'my_name'
my_attr_value3 = getattr(my_object, 'my_name', 'There is no attribute value')
# There is no attribute value
print(my_attr_value3)
Python中动态修改属性
class MyClass:
def __init__(self):
self.my_attr = 'Hello World'
my_object = MyClass()
# 动态获取属性
my_attr_value4 = getattr(my_object, 'my_attr')
print(my_attr_value4) # Hello World
# 动态设置属性
setattr(my_object, 'my_attr1', 'Goodbye ')
my_attr_value5 = getattr(my_object, 'my_attr1')
print(my_attr_value5) # Goodbye
5、创建删除操作系统上的文件
- 获取当前的工作路径:os.getcwd()
- 获取文件列表:os.listdir()
- 在当前目录下创建一个新的目录:os.mkdir
- 递归创建多级目录:os.makedirs()
- 删除空目录:os.rmdir()
- os.path.abspath()获取绝对路径
- os.path.basename()获取文件名
- os.path.dirname()获取文件路径
- os.path.split()分割路径
- os.path.join()拼接路径
- os.path.exists()判断路径是否存在
- os.path.isdir()判断是否为目录
- os.path.isfile()判断是否为文件
6、主动抛出异常
常见的异常
- 列表或者元组超出索引
- 字典无key
- 没有定义变量
- 语法错误
- 导入错误
- 断言错误
- 对象没有这个属性
- 缩进错误
- 除数为0
7、help() 函数和 dir() 函数
-
help()函数:help()函数用于显示文档字符串,还可以查看与模块,关键字,属性等相关的使用信息。
-
dir()函数:dir()函数可以列出指定类或模块包含的全部内容(包括函数、方法、类、变量等)
8、什么是猴子补丁
9、实现一个斐波那契数列
def func(n):
a = 0
b = 1
while a <= n:
print(a)
a, b = b, (a + b)
func(8)
10、用过python的协程吗?如何实现?
1、协程是一种用户态的轻量级线程,协程的调度完全由用户控制;这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。
2、协程一般是使用gevent库
3、一个线程也可以拥有多个协程
使用gevent来实现多任务的时候,有一个很特殊的地方,它可以自行切换协程指定的任务,而且切换的前提是:当一个任务用到耗时操作(例如延时),它就会把这个时间拿出去做另外的任务。这样做最终实现了多任务,而且自动切换。
11、Python 中的反射
我使用于接口自动化中
12、将"hello world"转换为首字母大写"Hello World"(不使用 title 函数)
d="hello world"
print([i[0].upper()+i[1:] for i in d.split(" ")])
13、super 函数的作用
super
函数在Python中主要用于查找当前对象的父类(或超类),从而实现对父类方法的调用。它帮助开发者更方便地访问和重用父类中的方法,同时处理多重继承时的方法查找顺序问题。
14、单下划线和双下划线的作用
15、为什么不建议函数的默认参数传入可变对象
Python中,函数参数的默认值是在函数定义时计算的,而不是在每次函数调用时计算。当默认值是可变类型(如列表、字典等)时,这个默认值在函数定义时就会被创建并分配给参数。当函数被调用时,如果没有显式地传递该参数,函数将使用该默认值。
可变类型的默认值在函数定义时只会被创建一次,然后会在后续函数调用中重复使用。这意味着,如果在函数中修改了这个默认值,它将在后续的函数调用中保持修改后的值,而不是返回最初的默认值。
16、获取当前时间
17、列表与元组的区别
-
列表[],元组()
-
元组不可变,列表可变
- 由于元组不可变,所以使用 tuple 可以使代码更安全
- tuple 放弃了对元素的增删(内存结构设计上变的更精简),换取的是性能上的提升:创建 tuple 比 list 要快,存储空间比 list 占用更小。所以就出现了“能用 tuple 的地方就不用 list”的说法。
- 多线程并发的时候,tuple 是不需要加锁的,不用担心安全问题,编写也简单多了
- 直接在同一个元组上更新是不可行的,但是可以通过拷贝现有的元组片段构造一个新的元组的方式解决。
通过分片的方法让元组拆分成两部分,然后再使用连接操作符(+)合并成一个新元组,最后将原来的变量名(temp)指向连接好的新元组。在这里就要注意了,逗号是必须的,小括号也是必须的!
-
列表具有增删改查等操作,元组只有查操作
-
列表append、extend、pop、remove、del 元组只有index、count
-
列表用于频繁操作,元素用于存储后读取
-
列表不可哈希,元组可以哈希
-
元组使用(a,),如果只有一个元素,必须使用,
18、列表与字典的区别
相同点
- 可变性: 列表和字典都是可变的数据结构,可以在创建后修改其内容。
不同点
-
1、存储元素的方式
- 列表:是一个有序的集合,元素可以通过索引访问,索引是从0开始的整数。
- 字典:是一个无序的集合,元素以键值对(key-value pair)的形式存储,通过键来访问值,字典在底层存储是通过哈希表。
-
2、索引和键
- 列表:元素可以通过索引直接访问,例如 my_list[0]。
- 字典: 元素通过键来访问,例如 my_dict[‘key’]。
-
3、有序性:
- 列表:有序,元素的顺序与它们被添加的顺序相同。
- 字典:无序,元素的顺序与它们被添加的顺序无关,字典不支持索引。
-
4、元素类型:
- 列表: 元素可以是任意数据类型,包括整数、字符串、列表等;值可以相同
- 字典:键和值都可以是任意数据类型。键不能相同,值可以相同
-
5、语法表示:
- 列表: 使用方括号 [] 表示,例如 my_list = [1, 2, 3]。
- 字典:使用花括号 {} 表示,例如 my_dict = {‘key’: ‘value’}。
-
6、可迭代性:
- 列表:可以通过循环遍历所有元素。
- 字典:可以通过循环遍历所有键、所有值或所有键值对。
-
7、常见操作:
- 列表: 常见的操作包括添加元素、删除元素、切片等。
- 字典:常见的操作包括添加键值对、删除键值对、获取所有键或所有值等。
-
8、空间占用和查找效率对比
- 字典查询速度比较快,但是存储数据占用内存比较大,消耗空间提升时间
- 列表查询速度比较慢,但是存储数据占用内存比较小,消耗时间提升空间