python面试题
第一部分 Python基础篇(80题)
4. 解释型语言,程序边运行边解释
编译型语言,程序会先生成目标文件,通过链接生成可执行文件
5.python解释器总类及特点:
cpython:C语言开发使用最广
ipython:基于cpython采用jit技术,对python进行动态编译,提高执效率
jpython:运行在java上的解释器,直接把py代码编译成java字节码执行
6.位和字节的关系
8位==1字节
7.b,B,KB,MB,GB
8b=1B
1024B=1KB
1024KB=1MB
1024MB=1GB
8.请至少列举5个PEP8规范(越多越好)
1.代码编排缩进,4个空格的缩进,不使用tap,更不能混合使用tap和空格
2.不要在一句import中引用多个库
3.尽量避免不必要的空格
4.逗号,冒号,分号前不加空格
5.操作符左右更加一个空格
6.如果采用from xx import xx引用库,可以省略'module.',都可能出现命名冲突,这时要采用import xx
9.通过代码实现进制转换
#十进制转换成2,8,16进制
v = 18
print(bin(v))#十进制转换成二进制
v = 18
print(oct(v))#十进制转换成八进制
v= 18
print(hex(v))#十进制转18进制
#2,8,16进制转换成10进制
v = '0b1111011'
print(int(v,2))#二进制字符串
v='011'#八进制
print(int(v,8))
v='0x0E'
print(int(v,16))
10.请编写一个函数实现将IP地址转换成一个整数
def Change(addr):
# 取每个数
id = [int(x) for x in addr.split(".")]
print(id)
return sum(id[i] << [24, 16, 8, 0][i] for i in range(4))
ip = '10.3.9.12'
print(bin(Change(ip)))
11.python的最大递归层数
998层
12.求结果
or 从左到右,有一个真的值,则返回第一个真的值,若所有值都为假,则返回最后一个值
and 从左到右,有一个假的值,则返回第一个假的值,若所有值均为真,则返回最后一个值
v1 = 1 or 3 1
v2 = 1 and 3 3
v3 = 0 and 2 and 1 0
v4 = 0 and 2 or 1 1
v5 = 0 and 2 or 1 or 4 1
v6 = 0 or Flase and 1 False
13.ascii、unicode、utf-8、gbk区别
ascii 位字符编码
gb2312 编码:2字节表示一个汉字,最多表示65535个汉字
gbk编码是对gb2312的扩展,完全兼容gb2312
unicode是所有字符的集合
unt-8是unicode的扩展,字符为1字节,汉字为3字节
14.字节码和机器码的区别
字节码:与硬件无关,经过编译的,不可阅读,实现方式:编译器和虚拟机
字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转义后才能成为机器码。
机器码:电脑cpu直接读取运行的机器指令,运行速度快,比较晦涩难懂
15.三元运算规则及应用场景
表达式?true:false
表达式的值如果为真,则为true,否则为false
16.列举py2和py3的区别
print函数 py2不需要括号,py3需要括号好
py2中有xrange和range py3中只有xrange => rang:其中rang是个迭代器
xreadline和readline
py2中经典类和新式类并不一样,经典类的深度优先继承,新式类是广度优先
py3中经典类和新式类都是广度优先
17.用一行代码实现数值交换:
a=10
b=9
a,b=b,a
a,b = b,a
18.python2与py3中的long与int的区别
py2中的long类型==py3中的int类型
19.xrange与rang的区别:
py2中 xrange等于py3中的range是个迭代器
py2中的range是个列表
20.文件操作时:xreadlines和readlines的区别?
xreadlines是个迭代器
readlines是个列表,每一行为一个列表元素
21.列举布尔值为False的常见值:
bool("")
bool([])
bool({})
bool(0)
bool(-0)
22.字符串、列表、元组、字典每个常用的5个方法
str.spilt()
str.join()
str.replace()
字符串:str.split()
str.join()
str.replace()
str.upper()
str.count()
列表:list.append()
list.pop()
list.remove()
list.index()
list.extend()#列表拼接
元组(只能读,不能更改):
字典:dict.get()
dict.update()#字典合并
dict.item()#字典转换成列表
dict.setdefault()#添加字典,如果存在相同的键值,则不添加
23.lambda(匿名函数)表达格式及应用场景
calc=lambda x:x*3 lambda x :x*3
调用calc(3)
24.pass的作用?
终止本次循环
25.*arg与**kwargs作用
*arg:多个参数元组
**kwargs:字典
26 is与==的区别
变量的三个基本要素:分别是id,type,value
==:判断value
is:判断id
27.简述深浅copy及应用场景
copy模块
copy.copy
copy.deepcopy
字面:深浅copy对于字符串,数字,仅有一层的字典,列表,元组一样,都只拷贝内存地址
内存地址的角度:
深copy对于字符串和数字与浅copy一样
对于多层字典和列表:
第一层深浅copy相同,但是对于第二层,深copy会指向对象的值的内存地址,而浅copy则会只指向对象的第二层内存地址
28.python的垃圾回收机制
python会定时的去搜索没有被指向的变量,进行清除
29.python的可变类型和不可变类型
python的可变类型为:列表,字典
列表与字典中的值可以更改
python的不可变类型为:数字,字符串,元组
数字例如:i=5
i=6
系统不会将5删除,而是指向了6,如果没有其它变量应用5,原有对象就会收回
所有赋值为5的变量同时指向了内存中为5的值的地址
30.求结果:
v = dict.fromkeys(['k1','k2'],[])
v["k1"].append(666)
print(v)
v["k1"] = 777
print(v)
输出:{'k2': [666], 'k1': [666]}
{'k2': [666], 'k1': 777}
如果子层中是个列表,则需要注意,append(666)则k2与k1都会被修改
直接赋值则不会
31.求结果:
def num():
return [lambda x:x*i for i in range(4)]
# [lambda x:x*1, lambda x:x*2, lambda x:x*3, lambda x:x*4]
print([m(2) for m in num()])
输出:[6, 6, 6, 6]
32.列举常见的内置函数?
abs
sum
range
max([])
min([])
round(1)#浮点数
len()
.....
33.filter、map、reduce的作用?
list1 = filter(lambda n:n%2==1,range(1,20))
打印1-20之间的奇数
list1 = map(lambda n:n%2==1,range(1,20)) # 匹配函数
打印1-20之间的数据,如果是奇数,为true,如果是偶数,为false
py3中,reduce内置函数,需要引入模块functools
from functools import reduce
reduce 是累加函数
reduce(lambda x,y:x+y,range(1,20))
34.一行代码实现9*9乘法表(不会)
print('\n'.join(['\t'.join(["%2s*%2s=%2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))
35.如何安装第三方模块,用过哪些第三方模块?
通过pycharm编译器中的file->setting->project->Project interpreter可以下载安装
通过pip安装
sqlarchmey,mysql,selecter.....
restframe_work
36.至少列举8个常用的模块
re、time、os、sys、json、paramiko、threading、process、Queue、socket、mysql,sqlachme
37.re的match和search区别?
match()是否以什么开头
search()匹配所有
38.什么是正则的贪婪匹配?
str="abcdnsidnc"
re= "ab*c"
贪婪匹配结果:"abcdnsidnc"
非贪婪匹配结果:abc
39.求结果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )
a. [ i % 2 for i in range(10) ]
输出:[0,1,0,1,0,1,0,1,0,1]
b. ( i % 2 for i in range(10) )
输出:是个迭代器,输出的是迭代器的地址,可以使用for循环函数来打印
40.求结果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
a.输出:1
b.输出:2
c.输出:False
d.输出:True
d.答案分析:
其他语言if(a>4 and a<10)
python 4<a<10
推出===> 1<2 ==2 为 1<2 and 2==2
===> True and True
===> True
41.def func(a,b=[]) 这种写法有什么坑?
def func(a,b=[]):
b.append(a)
print(b)
func(1)
func(1)
func(1)
func(1)
输出:
[1]
[1, 1]
[1, 1, 1]
[1, 1, 1, 1]
每次实例化都会使用第一次创建的list表
42.如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?
split(',')
43.如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
[int(i) for i in s]
44.比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?
a 与 b = [(1,),(2,),(3,) ]的区别:
a是个数字列表,b是个元组列表
a 与 b = [(1),(2),(3) ] 的区别:
无区别
45.如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
[x*x for x in range(1,11)]
46.一行代码实现删除列表中重复的值 ?
list(set([]))
#集合去重
47.如果在函数中设置一个全局变量
global
48.logging模块的作用?以及应用场景?
不知道
49.请用代码简答实现stack
class Stack(object):
def __init__(self):
self.stack = []
def push(self, value): # 进栈
self.stack.append(value)
def pop(self): #出栈
if self.stack:
self.stack.pop()
else:
raise LookupError(‘stack is empty!‘)
def is_empty(self): # 如果栈为空
return bool(self.stack)
def top(self):
#取出目前stack中最新的元素
return self.stack[-1]
50.常用字符串格式化哪几种?
1.最方便
print("hello %s and %s" %("df","another df"))
2.最好用
print("hello %fisrt and %second"%("first":"df","second":"another df"))
3.最先进
print("hello {first} and {second}".format(first="df",second="another df"))
51.简述 生成器、迭代器、可迭代对象 以及应用场景?
可迭代对象:实现了迭代器协议的对象就是可迭代对象
可迭代对象可以生成迭代器:通过iter()转换成iterator
生成器生成式子:[x*x for x in range(10)]是个列表
把[]改成()就可以变成迭代器
52.用python实现一个二分查找
def binary_chop(alist, data):
"""
非递归解决二分查找
:param alist:
:return:
"""
n = len(alist)
first = 0
last = n - 1
while first <= last:
mid = (last + first) // 2
if alist[mid] > data:
last = mid - 1
elif alist[mid] < data:
first = mid + 1
else:
return True
return False
if __name__ == '__main__':
lis = [2,4, 5, 12, 14, 23]
if binary_chop(lis, 14):
print('ok')谈谈你对闭包的理解?
def binary_chop(alist, data):
"""
非递归解决二分查找
:param alist:
:return:
"""
n = len(alist)
first = 0
last = n - 1
while first <= last:
mid = (last + first) // 2
if alist[mid] > data:
last = mid - 1
elif alist[mid] < data:
first = mid + 1
else:
return True
return False
if __name__ == '__main__':
lis = [2,4, 5, 12, 14, 23]
if binary_chop(lis, 14):
print('ok')
53.谈谈你对闭包的理解
不懂
54.os和sys模块的作用?
os主要处理操作系统相关操作
sys主要处理系统相关操作
55.如何生成一个随机数
import random
random.rangrange(1,100)
56.如何使用python删除一个文件?
if os.file.exist(path):
os.remove(path)
57.谈谈你对面向对象的理解?
面向对象有三大特性,封装、继承和多态。
58.Python面向对象中的继承有什么特点
Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。
在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。有别于C#
59.面向对象深度优先和广度优先是什么?
不懂
60.面向对象中super的作用
用于调用父类的方法,解决多重继承问题。
61.是否使用过functools中的函数?其作用是什么?
reduce
62.列举面向对象中带下划线的特殊方法,如:__new__、__init__
__call__
__str__
__add__
__dic__
__getitem__
63.如何判断是函数还是方法?
方法需要通过对象来调用
64.静态方法和类方法区别?
静态方法不需要传入self参数,类成员方法需要传入代表本类的self参数
静态方法是无妨访问实例变量和类变量的,类成员方法无法访问实例变量但是可以访问类变量
65.列举面向对象中的特殊成员以及应用场景?
__doc__描述信息类
__call__ 对象后面加括号,触发执行
__dict__ 查看类或对象中的所有成员
__str__ 如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值
66.1、2、3、4、5 能组成多少个互不相同且无重复的三位数
不懂
67.什么是反射?以及应用场景?
反射主要根据字符串去寻找类的属性值
web框架
68.metaclass作用?以及应用场景?
不懂
69.用尽量多的方法实现单例模式。
70.装饰器的写法以及应用场景。
71.异常处理写法以及如何主动跑出异常(应用场景)
72.什么是面向对象的mro
73.isinstance作用以及应用场景?
74.写代码并实现:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would
have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?
Because nums[0] + nums[1] = 2 + 7 = 9,
75.json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?
(dict、list、string、int、float、long、bool、None)
import json
from json import JSONEncoder
from datetime import datetime
class ComplexEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
else:
return super(ComplexEncoder,self).default(obj)
d = { 'name':'alex','data':datetime.now()}
print(json.dumps(d,cls=ComplexEncoder))
# {"name": "alex", "data": "2018-05-18 19:52:05"}
76.json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
import json
a=json.dumps({"ddf":"你好"},ensure_ascii=False)
print(a) #{"ddf": "你好"}
77.什么是断言?应用场景?
78.有用过with statement吗?它的好处是什么?
79.使用代码实现查看列举目录下的所有文件。
80.简述 yield和yield from关键字。
第二部分 网络编程和并发(34题)
1.简述osi七层协议
应用层->表示层->会话层->传输层->网络层->数据链路层->物理层
2.什么是C/S和B/S架构?
C/S 客户端/服务端架构
B/S 浏览器/服务器架构
3.简述 三次握手、四次挥手的流程。
三次握手
客户端->发送建立链接请求->服务端
服务端->发送给确认请求->客户端
客户端->发送数据包->服务端,链接建立
4.什么是arp协议?
ARP协议,全称“Address Resolution Protocol”,中文名是地址解析协议,
使用ARP协议可实现通过IP地址获得对应主机的物理地址(MAC地址)。
5.TCP和UDP的区别
TCP是由链接的,UDP是无链接的。
TCP可靠的,要求资源数多
UDP实时的,要求资源数少
6.什么是局域网和广域网?
局域网:一个区域内,多台计算机互联组成的
广域网:连接不同区域局域网或城域网计算机通信的远程网
7.为何基于tcp协议的通信比基于udp协议的通信更可靠?
因为tcp是由连接的:三次握手双向机制,http使用tcp协议传输的
8.什么是socket?简述基于tcp协议的套接字通信流程。
socket:Socket是网络上两个程序双向通讯连接的端点。
通讯流程:
1.服务器通过socket函数创建一个套接字,用这个套接字完成监听活动。
2.服务器绑定一个ip和端口
3.服务器调用listen来监听端口状态,等待客户端链接
4.客户端通过socket函数创建一个套接字,并设定远端ip和端口。
5.客户端通过connect函数来连接远端服务器
6.服务器通过accept函数来接收客户端的连接通讯。
7.客户端可以通过write函数和read来实现与服务端的数据收发。
8.服务器可以通过write函数和read来实现与客户端的数据收发。
9.通讯结束,关闭socket,调用close函数。
9.什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?
粘包:多个数据包被连续存储于连续的缓存中
原因:发送方,往往等待接收到一定的数据后才会发送数据,如果连续几次发送少量数据,
通过TCP会根据算法把数据合成一包发送,接收方就收到了粘包数据。
那些情况:
客户端或者服务端没有设置,响应机制,导致数据粘包。
10.IO多路复用的作用?
单个线程或者进程就可以同时处理多个网络IO连接。
11.什么是防火墙以及作用?
将内部网络与公用网络隔离的方法。
提高内部网络安全,过滤不安全服务。
12.select、poll、epoll 模型的区别?
select:支持的文件描述符数量太少 => 1024
在fd数量多的时候,系统开销较大
poll:与select,描述fd集合方式不同
eproll:是对select和poll的改进,在为每个fd指定一个回调函数,设备就绪时,
直接唤醒并将fd加入就绪表。
13.简述 进程、线程、协程的区别 以及应用场景?
16.threading.local的作用?
threading.local()这个方法的特点用来保存一个全局变量,
但是这个全局变量只有在当前线程才能访问。