1、python数据类型有哪些?
可变类型:列表(list)、字典(dict)、集合(set)
不可变类型:字符串(str)、布尔值(True/False)、浮点型(float)、整数(int)、
元组(tuple)、复数
2、python数据中可变与不可变的区别是什么?
1、当可变数据对应变量的值发生变化时,对应的内存地址并没有开辟新的内存
2、当不可变数据对应变量的值发生变化时,原来内存中的值不改变,内存地址开辟新的内 存存放新的值,此时变量指向新开辟的内存地址
3、python是动态还是静态类型?是强类型还是弱类型?
在编译期间确定变量类型的是静态语言,在运行期间确定变量类型的是动态语言
强类型指的是不会进行隐式类型转换,如python 中的 "1000"+1报错TypeError,
弱类型指的是会进行隐式类型转换,如Javascript 中的 "1000"+1会得到字符串“10001”,
所以python是动态强类型语言
4、什么是自省?
在计算机领域中,自省是一种能力,是指在程序运行时获取对象的类型及内部结构 python的自省能力是很强大的,因为在python中,一切皆对象,我们可以获取对象的类型及各个属性,主要方法有:dir(), type(), id()
5、python3和python2的差异有哪些?
- python3中不再有unicode对象,默认str就是unicode
- python3print输出需要带括号,python2不需要
- python3使用的utf-8编码,支持中文;python2使用的ASCII编码,不支持中文,如果想要支持,需要更改字符集,添加coding:utf-8
- python3除法返回的是浮点型,使用整除返回整数;python2除法返回整数
- python3中添加了as和with
- python3中添加了f'{}'格式化方法,python2中没有
6 、python中的*args和**kwargs是什么?
- *args指的是:表示位置参数,且位置参数必须在关键字参数的前边
- **kwargs指的是:表示关键字参数
7、python的GIL是什么?
python的GIL指的是全局解释器锁。python解释器进程中存在一个解释器锁,当该进程中的线程需要执行时,必须获取该锁并且占用,而此时其余线程无法执行,这就导致该进程下的线程不能实现并行。GIL不是python语言的特性,而是cpython解释器下独有的。创建该锁的目的是确保同一进程下数据的安全可靠,防止多线程同时操作某一个数据导致该数据异常,但是这也导致python的多线程不能使用系统的多核资源,降低了python程序的执行效率
8、针对Python的GIL,我们对程序可以做哪些优化?
- 针对IO密集型任务,可以使用多线程或多协程实现,因为解释器会在IO期间释放GIL,可供别线程执行
- 针对计算密集型任务,可以使用多进程加进程池来完成
9、Python的迭代器和生成器是什么?
- 迭代器:实现了__iter__和__next__方法的对象称作迭代器
- 生成器:使用yield关键字进行返回的函数称为生成器,生成器是一种特殊的迭代器,他可以动态的产生数据,并通过实现迭代器协议来逐个访问所产生的数据
10、python的闭包是什么?
闭包指的是在函数嵌套的前提下,内部函数调用了外部函数的变量,外部函数返回内部函数
闭包三要素:
- 内外函数的嵌套
- 内部函数调用外部函数的变量
- 外部函数返回内部函数
11、python的装饰器是什么?
装饰器是一种特殊的闭包函数,目的是在不修改原有函数代码的情况下给原有函数添加新功能
装饰器实际运用:
- 网站登录登录验证(在未登录情况下直接访问网站,提示先登录)
- 输出异常日志(当某一个模块功能异常出错时,输出对应日志文件)
- 计时器(给某个模块添加计时功能)
- 爬虫中(某一个请求需要在异常之后补充请求头参数然后再去重新对当前请求进行发送)
12、python中的深拷贝和浅拷贝是什么?
- 深拷贝指的是将原有对象拷贝一份到不同的内存地址,而后原有对象和拷贝对象相互之间不会有什么影响
- 浅拷贝指的是将指针指向原有对象的内存地址,原有对象改变,拷贝对象也随之改变
13、python的内存管理
- python有内存池机制,pymalloc机制,用于对内存的申请和释放管理
- 内存池的机制就是先申请一定数量、大小相等的内存块备用,当有新的内存需求时,就从内存池中分配内存给这个需求,不够了之后在申请新的内存。这样做的优势就是减少内存碎片,提升效率
- pymalloc机制对于小对象,会先在内存池中申请空间,一般是小于236kb,若是大对象,则直接调用new/malloc来申请新的内存空间
14、python的垃圾回收机制
- python主要使用引用计数来追踪和回收垃圾(当一个对象有新的引用,他的引用计数就增加1,当引用它的对象被删除时,他的引用计数就减少1,当该引用计数变为0时,该对象立即被回收,对象占用的内存空间被释放)
- 再引用计数的基础上,通过“标记--清除”解决容器对象可能产生的循环引用问题
- 通过“分代回收”以空间换时间的方法提高垃圾回收效率
15、类变量和实例变量的区别
- 类变量由所有实例共享
- 实例变量由实例单独享有,不同实例之间互不影响
- 当我们需要在一个类的不同实例之间共享变量的时候使用类变量
16、classmethod和staticmethod之间的区别
- classmethod是类方法,staticmethod是静态方法
- classmethod第一个参数是cls,可以引用类变量
- classmethod是为了使用类变量,staticmethod是代码组织的需要,完全可以放到类外
17、__new__ 和 __init__的区别
- __new__方法是一个静态方法,__init__方法是一个实例方法
- __new__方法会返回一个创建的实例,而__init__什么都不返回
- __new__方法在创建一个实例时调用,__init__方法是初始化一个实例
- 只有在__new__方法创建一个cls实例时,后边的__init__才能被调用
18、什么是元类?
元类就是创建类的类,python中一切皆对象,那么类也是对象,可以说,类是其元类的实例对象。所有元类的祖宗是type,只有type及其子类才能作为元类。要想看一个对象的元类,可通过type()和obj.__class__方法查看
- 元类允许我们控制类的生成,比如修改类的属性等
- 使用type来定义元类
- 元类最常见的一个使用场景就是ORM框架
19、python里的魔法方法是什么?
魔法方法是python的内置方法,格式为“__方法名__”,不需要主动调用,存在的目的是为了给python的解释器进行调用,几乎每个魔法方法都有一个对应的内置函数或者运算符。当我们对这个对象使用这些函数或者运算符的时候就会调用类中的对应魔法方法,可以理解为重写这些python的内置函数。 常见的有__new__ 、__init__ 、__str__ 、__del__ 、 __call__、 __len__等等
20、python的高阶函数是什么?
Python的高阶函数指那些接收函数作为参数或者将函数作为返回值的函数
- filter()可过滤出序列中符合条件的值,并且保存到一个新的序列中
- map()可对序列中的所有对象做指定操作,然后将其添加到一个新的对象中返回
- sort()对序列中的对象进行排序(修改原始序列)
- sorted()对序列中的对象进行排序(不修改原始序列,生成新的序列)
- 装饰器,给函数增加新的功能
- 匿名函数
- reduce()依次对序列中的对象进行处理