面试题
1.请至少列举5个 PEP8 规范(越多越好)
(1)分号(行的末尾不能加分号,也不能分号将两个语句放在一行隔开)
(2)行长度(不超过80字符)
(3)括号(不要随意使用括号)
(4)缩进(用个空格缩进,不要使用tab)
(5)空行
(6)注释
(7)类
(8)空格
2.Python解释器种类以及特点
(1)CPython
Cpython,这个解释器是用C语言开发的,所以叫 CPython,在命名行下运行python,就是启动CPython解释器,CPython是使用最广的Python解释器。
(2)IPython
基于cpython之上的一个交互式计时器 交互方式增强 功能和cpython一样
(3)JPython
运行在Java上的解释器 直接把python代码编译成Java字节码执行
(4)PyPy
目标是执行效率 采用JIT技术 对python代码进行动态编译,提高执行效率
(5)IronPython
运行在微软 .NET 平台上的解释器,把python编译成. NET 的字节码
3.简述解释型和编译型编程语言?
解释型语言:解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译。这样解释型语言每执行一次就要翻译一次,效率比较低。
编译型语言:用编译型语言写的程序执行之前,需要一个专门的编译过程,通过编译系统,把源高级程序编译成为机器语言文件,翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高,但也不能一概而论,
部分解释型语言的解释器通过在运行时动态优化代码,甚至能够使解释型语言的性能超过编译型语言。
4.简述 OSI 七层协议
为了实现计算机系统的互连,OSI参考模型把整个网络的通信功能划分为7个层次,同时也定义了层次之间的相互关系以及各层所包括的服务及每层的功能。OSI的七层由低到高依次为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,下三层(物理层、数据链路层、网络层)面向数据通信,而上三层(会话层、表示层、应用层)则面向资源子网,而传输层则是七层中最为重要的一层。它位于上层和下层中间,起承上启下的作用。
5.谈谈Python装饰器:
装饰器本身就是一个Python函数,他可以让其他函数在不做任何变动的情况下,而外增添一些其他的功能,装饰器的返回值也是一个函数对象,调用装饰器的函数必须是一个可以作为参数传递的函数
6.os与sys
1.os模块主要是负责程序与操作系统的交互。
2.sys模块主要负责程序与Python解释器的交互。
7.什么是lambda表达式,它有什么好处?
简单来说lambda表达式就是一个简单的函数,没有函数名,又称匿名函数,能优化代码,使代码变得更简洁。
8.Python中pass有什么作用?
pass语句不会执行任何操作,一般作为占位符或者创建占位程序
9.__new__,__init__的区别
__init__ 是初始化方法,__new__方法是真正的构造函数
__new__是实例创建之前被调用,它的任务是创建并返回该实例,是静态方法
__init__是实例创建后被调用的,然后设置对象属性的一些初始值。
总结:
__new__方法在__init__方法之前被调用,并且 __new__ 方法的返回值将递给__init__方法作为第一个参数,
最后__init__给这个实例设置一些参数。
10.HTTP响应状态码:
- 1xx消息——请求已被服务器接收,继续处理
- 2xx成功——请求已成功被服务器接收、理解、并接受
- 3xx重定向——需要后续操作才能完成这一请求
- 4xx请求错误——请求含有词法错误或者无法被执行
- 5xx服务器错误——服务器在处理某个正确请求时发生错误
11.四种单例模式:(https://www.cnblogs.com/lincappu/p/8304974.html)
1.引入模块
2.__new__方法
3.装饰器
4.metaclass
12.三次握手,四次挥手
https://blog.csdn.net/du5006150054/article/details/80157447(详解)
11.python运算符优先级比较(依次增高)
3
4
5
6
7
8
9
10
11
12
13
14
|
Lambda #运算优先级最低 逻辑运算符: or 逻辑运算符: and 逻辑运算符: not 成员测试: in , not in 同一性测试: is , is not 比较: <,< = ,>,> = ,! = , = = 按位或: | 按位异或: ^ 按位与: & 移位: << ,>> 加法与减法: + , - 乘法、除法与取余: * , / , % 正负号: + x, - x |
9.求结果(经典闭包延迟问题)
详细过程看 (https://blog.csdn.net/yitiaodashu/article/details/79025502)
def num(): return[lambda x:i*x for i in range(4)] print([m(2) for m in num()])
#可以转化成 def num(): a=[] for i in range(4): def foo(x): return x*i a.append(foo) return a print([m(2) for m in num()]) #[6,6,6,6]
#在python中,相对而言的局部变量绑定的是值,而全局变量绑定的是空间,而不是值本身,所以for循环生成的i相对于foo而言,
是全局变量,所以绑定的是i所在的地址
def num():
a=[]
for i in range(4):
def foo(x, i=i): #在里面价格i=i 此时i就成了局部变量
return x*i
a.append(foo)
return a
print([m(2) for m in num()])
#[0,2,4,6]
10.filter,map,reduce的区别
a=[1,2,3,4] #filter def foo(x): return x%2==1 print(list(filter(foo,a))) #map def fun(x): return x*2 print(list(map(fun,a))) #reduce from functools import reduce def sum(x,y): return x+y print((reduce(sum,a))) #[1,3] #[2,4,6,8] #10
11.字符串、列表、元祖、字典、每个常用的5个方法?
字符串: .upper() #首字母大写 .lower() #所有字母大写 .strip() #去除首尾空格 .replace() #替换 .split() #分割 列表: .append() #在列表尾部追加一个值 .inset() # 指定位置插入数据 .reverse() #反转 .remove() #删除制定元素 .pop() #删除指定元素 元祖: .index() #查看元素下标是多少 .len() #计算元祖元素个数 .min() #返回元祖中元素最小值 .max() #返回元祖元素最大值 .tuple() #将列表转换为元祖 字典: .clear() #删除字典所有项 .get() #获取字典中指定键的值 .keys() #以列表的形式返回字典中所有键 .values() #以列表的形式返回字典中所有值 .items() #以列表的形式返回字典中的键值