q1.解释型语言和编译型语言的区别? |
编译型语言:(C/C++)在程序执行之前,先会通过编译器对程序执行一个变异的过程,把程序语言转变成机器语言,运行的时候不需要翻译,而直接执行就可以了,因为编译型语言在程序运行之前就已经对程序做出了“翻译”,所以在运行时就少掉了“翻译”的过程,所以效率比较高。
q2.Python解释器种类以及特点? |
CPython:用c语言开发,使用的最广泛。
IPython:基于CPython之上的一个交互式计时器,交互方式增强,功能和CPython一样
PyPy:目的是执行效率,采用JIT技术,对python代码惊醒动态编译,提高执行效率
JPython:运行在Java上的解释器,直接把python代码编译成Java字节码执行
IronPython:运行在微软.net平台上的解释器,把python编译成.net字节码
q3.位和字节的关系? |
q4.请至少列举5个 PEP8 规范(越多越好)? |
2、每行最大长度为79,换行可以使用反斜杠。最好使用圆括号,换行点再操作符的后边敲回车。
3、不要再一句import中多个库。比如import os,sys(不推荐)
4、模块命名尽量短小,使用全部小写的方式,可以使用下划线。
5、包命名尽量短小,使用全部小写的方式。不可以使用下划线
6、类的命名使用CapWords的方式,模块内部使用的类采用--CapWords的方式。
7、函数命名使用全部小写的方式,可以使用下划线。
8、异常命名使用CapWords+Error后缀的方式。
9、常量命名使用全部大写的方式,可以使用下划线。
10、类的属性(方法和变量)命名使用全部小写的方式,可以使用下划线。
11、类方法第一个参数必须是self,而静态方法第一个参数必须是cls。
............
q5.python递归的最大层数? |
q6.ascii、unicode、utf-8、gbk 区别? |
Unicode:万国码,能表示多种符号,在py2中可以指定4字节或2字节表示一个字符,在py3中默认4字节
UTF-8: 用最短的方式便是unicode,一个英文符占一个字节
Gbk:中文编码
q7.字节码和机器码的区别? |
字节码:是一种中间状态(中间码)的二进制代码(文件),需要直译器转译后才能成为机器码
q8.三元运算规则以及应用场景? |
三元运算符的功能与'if....else'流程语句一致,它在一行中书写,代码非常精炼,执行效率更高
格式:[on_true] if [expression] else [on_false]
res = 值1 if 条件 else 值2
q9.Python3和Python2中 int 和 long的区别? |
long(长整数):无限大小的整数
在python3中long被废弃,统一用int
q10.xrange和range的区别? |
python3中统一使用range,返回的是一个迭代器
q11.文件操作时:xreadlines和readlines的区别? |
q12.列举布尔值为False的常见值? |
q13.字符串、列表、元组、字典每个常用的5个方法? |
.upper()--首字母大写
.lower()--所有字母大写
.strip()--去除首尾空格(并不是在原来的字符串上进行操作,而是返回一个去除首尾空格的新字符串)
.replace()--字符串的替换
.splte()--字符串的分割,默认按照空格进行分隔,从前往后分隔
.count("x")--查找某字母出现的个数
.find("x")--查找字符的下标(位置),如果字符找不到,则返回-1
.index("x")--查找字符的下标(位置),如果字符找不到,则报错
"shfj".join("shfksj")--字符串的拼接,用.号将一个可迭代的序列拼接起来
......
列表:
.append()--末尾追加元素
.extends()--末尾追加一个列表
.insert()--插入元素
.reverse()--列表中的元素反转
remove()--删除列表中指定的元素,如果元素重复,则删除最前面的
.pop()--删除指定位置的元素,默认是最后一个元素
........
元组:
.index()--查看元素的下标
.tuple()--将列表转换为元组
.len()--元组的长度
.min()--元组中的最小的元素
.max()--元组中的最大的元素
.......
字典:
.clear()--清空字典
.get()--获取字典指定键的值
.keys()--获取字典中所有的键(列表形式)
.values()--获取字典中所有的值(列表形式)
.items()--获取字典中的键值对(列表形式)
.copy()--拷贝字典
........
q14.lambda表达式格式以及应用场景? |
格式为: lambda x,y:x*y
应用场景:函数式编程,闭包
q15.pass的作用? |
def test(): pass
q16.*args和**kwarg作用? |
*args接受的是n个位置参数,返回的是一个元组
**kwargs接受的是n个关键字参数,返回的是一个字典
q17.is和“==”的区别? |
“==”比较的是两个元素的值
q18.Python垃圾回收机制? |
python的内存管理机制引用了三种机制:计数机制、垃圾回收机制、内存池机制
1.引用计数机制:python是缓存整数或者短小的字符串,也就是说每个对象在内存中只有一份,即内存地址一样,引用所指的对象是相同的,即使是赋值语句,也是创造新的引用,而不是一个对象本身;python并不缓存列表,长字符串或者其他对象,也就是说可以有多个相同的对象,但是他们的内存地址并不是一样的,所以使用赋值语句的话是创建一个新的对象
2.垃圾回收机制:当python中的对象越来越多越来越多的时候,所占据的内存也会越来越大,这时候垃圾回收机制就会启动了,所谓垃圾回收机制就是当一个对象的引用计数为0 的时候,就是没有引用再指向这个对象了,那么这个对象就会被当作垃圾回收了
3.内存池机制:内存池是以内存大小为界限,当内存<256k的时候,就是引用内存池,当>256k的时候,就是调用malloc函数
内存池机制相当于一个金字塔:
第3层:最上面一层,是用户可以对python对象直接进行操作
第2层、第1层:内存池,是由python的接口函数PYMeM_malloc来实现的,如果请求的内存<256k,就是用内存池管理系统来进行操作,用malloc函数,每次只会分配一块大小为256k的内存,但是不会被free函数释放,放在内存池中以便下一次使用
第0层:大内存,使用malloc函数分配内存,free函数释放内存
第-1,-2层:操作系统进行操作
q19.Python的可变类型和不可变类型? |
不可变对象创建之后便不能改变,如果改变则会指向一个新的对象:字符串,元组,数字
q20.列举常见的内置函数? |
q21.filter、map、reduce的作用? |
filter 的作用也是生成一个新数组,在遍历数组的时候将返回值为 true 的元素放入新数组,我们可以利用这个函数删除一些不需要的元素。filter 的回调函数也接受三个参数,分别是当前索引元素,索引,原数组
map 作用是生成一个新数组,遍历原数组,将每个元素拿出来做一些变换然后放入到新的数组中。另外 map 的回调函数接受三个参数,分别是当前索引元素,索引,原数组
reduce 可以将数组中的元素通过回调函数最终转换为一个值。如果我们想实现一个功能将函数里的元素全部相加得到一个值
q22.至少列举8个常用模块都有那些? |
2、time: 时间模块
3、os:用于提供操作系统的模块
4、ashlib:用于加密相关的操
5、random:生成随机变量
6、pickle:用于python特有的类和python数据类型间进行转换
7、datetime:date和time的结合体
8、re:正则表达式模块
q23.re的match和search区别? |
search()--在字符串中搜索模板中第一个匹配的值
q24.logging模块的作用?以及应用场景? |
应用场景:做项目的时候打印日志,或者是异常
q25.什么是正则的贪婪匹配? |
非贪婪则相反,总是尝试匹配尽可能少的字符。在"*","?","+","{m,n}"后面加上"?",使贪婪变成非贪婪。
贪婪模式下字符串查找会直接走到字符串结尾去匹配,如果不相等就向前寻找,这一过程称为回溯。
非贪婪模式下会自左向右查找,一个一个匹配不会出现回溯的情况。
q26.常用字符串格式化有哪几种? |
1.print 'hello %s and %s' % ('name',"name1'):最方便,但是只能一个一个格式化
2.print 'hello %(first)s and %(second)s' % {'first': 'name', 'second': 'name1'}最好用,不需要一个个的格式化,可以利用字典的方式,缩短时间
3.print 'hello {first} and {second}'.fo<font color=white>rmat(first='name', second='name1'):最先进,可读性强
q27.简述 生成器、迭代器、可迭代对象 以及应用场景? |
迭代器:迭代器实现了__next__方法
可迭代对象:可迭代对象实现了__iter__,__next__方法,调用__iter__方法后,返回一个迭代器。
q28.简述闭包? |
q29.os和sys模块的作用? |
sys:这个模块可供访问有解释器使用或维护的变量和与解释器进行交互的函数
总结就是,os模块负责 程序与操作系统的交互,提供了访问操作系统底层的接口,sys模块负责 程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行环境
q30.python面向对象中的继承有什么特点? |
单继承和多继承:当只有一个父类的时候叫做单继承,当有多个父类的时候,叫做多继承。子类会继承父类的所有方法和属性,子类也可以覆盖和父类同名的方法和属性。
1.在继承中基类的构造方法不会别调用,她需要在其他派生类的构造亲自调用,有别于C#.
2.再调用基类的方法时,需要加上基类的类名前缀,而且要带上self参数变量,区别于在类中调用普通函数不需要带上self参数
3.Python总是首先查找对应类型的方法,如果它不能再派生类中找到对应的方法,它才开始到基类中逐个查找
q31.面向对象深度优先和广度优先是什么? |
在新式类中,为广度优先,又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。
在经典类中,为深度优先,对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历、中序遍历、后序遍历
广度优先:保留全部节点,占用空间大,无回溯操作(即无入栈,出栈的操作),运行速度快
深度优先:不保留全部节点,占用空间少,有回溯操作(即有入栈,出栈的操作),运行速度慢
q32.面向对象中super的作用? |
super语句:
super(父类名,self).父类中的函数名(参数)
super(B,self).haha(name)
q33.如何判断是函数还是方法? |
方法:和函数类似,也是封装了独立的功能,但是方法需要通过对象来调用,表示针对这个对象要做的操作
q34.静态方法和类方法区别? |
静态方法不需要传入self参数,类成员方法需要传入代表本类的cls参数;
静态方法是无妨访问实例变量和类变量的,类成员方法无法访问实例变量但是可以访问类变量
2.使用上的区别:
由于静态方法无法访问类属性,实例属性,相当于一个相对独立的方法,跟类其实并没有什么关系。这样说来,静态方法就是在类的作用域里的函数而已。
q35.列举面向对象中的特殊成员以及应用场景 |
__init__:类的实例化
__call__:对象后面加括号,触发执行
__doc__:描述类的信息
__dict__:查看类或者对象中的所有成员
__str__:打印对象时,默认输出该方法的返回值
...........
q36.什么是反射?以及应用场景? |
web框架的CBV配置文件获取类