1. 简述面向对象中的__new__和__init__的区别
(1): __init__是初始化方法,当实例化对象后就被默认调用执行了,可以接受参数
(2): __new__至少有一个参数cls, 代表当前类, 此参数在实例化时由python解释器自动识别
(3): __new__必须要有返回值,返回实例化出来的实例,如果要自行实现__new__时可以return
父类(super(当前类,cls)),(4): __init__有一个参数self,就是__new__返回的实例,__init__在__new__的基础上可以完成一些
其他初始化操作,且不需要返回值
(5): 如果__new__创建的是当前类的实例,会自动调用执行__init__方法,如果是其他类则不会,classMy(object):def__new__(cls,*args,**kwargs):print(cls)print(object.__new__(cls))returnobject.__new__(cls)def__init__(self):print(self)
my = My()print(my)
输出:<class'__main__.My'><__main__.My object at 0x000002048E39EBA8><__main__.My object at 0x000002048E39EBA8><__main__.My object at 0x000002048E39EBA8>
进程已结束,退出代码02.简述with方法打开处理文件帮我们做了什么?
类似:
f =open('demo1.txt','r',encoding='utf8')try:
f.read()except:passfinally:
f.close()
打开文件操作时经常发生意外,with方法就像利用了try,except,finally,无论如何都会自动关闭文件
3. 列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式取出大于10的函数,最终输出[16,25]print([x for x inlist(map(lambda x: x*x,[1,2,3,4,5]))if x>10])4. python中生成随机整数,随机小数,0-1小数
(1): 随机整数 random.randint(1,100)(2): 随机小数 numpy.random.randn(5)(3):0-1小数 random.random()5. 为了避免转义加上那个字母表示原始字符串
r, 表示需要原始字符串,不需要转义
6.<div class='nam'>中国</div>,用正则匹配出标签里的内容,其中class的类名是不确定的
import re
str="<div class='nam'>中国</div>"
res = re.findall(r'>(.+?)</div>',str)print(res)7. python 中的断言
a=1print(1)assert(a==2)#如果不成立报错,成立继续执行print(2)8. 数据表中student中有id, name,score,city字段,其中name中的名字可有重复,需要消除重复行,请写sql语句
select distinct name from student
9. 请写出10个常用的linux命令
(1):cd 切换工作目录
(2):pwd 显示工作路径
(3):ls 查看目录中的文件
(4):ls -F 查看目录中的文件
(5):ls -l 显示文件和目录的详细信息
(6):ls -a 显示隐藏文件
(7):mk 创建文件夹
(8):rm 删除文件夹
(9):find 搜索文件
(10):date 显示日期
10. python2 和python3 的区别
(1):print时2不需要小括号也行,只需要加空格即可,在3必须加
(2):在2中range返回的是列表,在3返回的这是迭代器
(3):在2中的编码是ASCII码,在3中则是utf8
(4):在2中unicode表示字符串序列,str表示字节序列,在3中则是str表示字符串序列,byte表示字节序列
(5):在2中为了正常显示中文,需要引入coding声明,在3中不需要
(6):在2中的输入函数是raw_input(),在3中则是input()函数
基础试题10道
1. 列出python中可变的数据类型和不可变的数据类型,并简述其原理.(1): 不可变数据类型: 数值型, 字符串型str,和元组tuple(2): 不可变数据类型,即不能修改变量值,如果修改,相当于创建了一个新对象,
而原来的对象不会改变,对于相同值的对象,其实内存中也只有一个,用内置
方法id()可以进行查看
(3): 可变的数据类型:列表list和字典dict(4): 对于可变的数据类型,修改操作并不会创建一个新对象,而是对原来对象的值
直接进行操作,且变量引用的地址不会改变,但是不同的对象可以有相同的值,
并且在内存中有两个对象,(5): 可变的数据类型进行引用时会有两中方法浅拷贝(不创建新对象,或者只创建表
层新对象)和深拷贝(完全创建新对象)2. s ='abcbcbcddefjjh',去重后按照从小到大顺序排列
s ='abcbcbcddefjjh'
lst =list(set(s))
lst.sort()
res =''.join(lst)print(res)3. 用lambda函数实现两个数相乘
fun =lambda x,y:x*y
print(fun(3,4))4. 字典根据键从小到大排列
dic ={'name':'lihua','aeg':12,'city':'beijing','tel':'10086'}
res =dict(sorted(dic.items(),key=lambda x:x[0]))print(res)5. 统计字符串中每个单词出现的次数s ='abcbcbcddefjjh',from collections import Counter
deffun1(Str):
res ={}for ele in Str:if ele notin res:
res[ele]=1else:
res[ele]+=1return res
deffun2(Str):#利用collections库的Counter方法,按多到少顺序输出
res = Counter(Str)return res
str1 ='abcbcbcddefjjh'print(fun1(str1))print(fun2(str1))6. 字符串中Str ='not foound 404 小明 12 北京',利用正则去掉英文和数字,输出'小明 北京'import re
Str ='not foound 404 小明 12 北京'
res = re.sub(r'[0-9,a-zA-Z,]+\s','',Str)print(res)7. 求出列表中所有奇数,并且构造新列表,lst =[1,2,3,4,5,6,7,8,9]deffun1(lst):return[x for x in lst if x%2!=0]deffun2(lst):#filter返回迭代器returnlist(filter(lambda x:x%2!=0, lst))
lst =[1,2,3,4,5,6,7,8,9]print(fun1(lst))print(fun2(lst))8. 列表推导式求出列表中所有奇数,并且构造新列表,lst =[1,2,3,4,5,6,7,8,9]deffun1(lst):return[x for x in lst if x%2!=0]9. 正则re.complie作用
(1): re.complie是将正则表达式编译成一个对象,加快速度,并能够重复使用
10. a =(1,)和a =(1)和a =('1')分别是什么类型数据
a1 =(1,)
a2 =(1)
a3 =('1')print(type(a1),type(a2),type(a3),)<class'tuple'><class'int'><class'str'>
基础试题10道
1. 两个列表[1,2,3,4]和[5,6,7,8,9]合并成一个
lst1 =[1,2,3,4]
lst2 =[5,6,7,8,9]
lst1.extend(lst2)#逐个添加,append是整体添加print(lst1)2. 用python删除文件,和用linux 命令删除文件
(1): python os.remove(文件名)(2): linux rm 文件名
3. log日志中, 我们需要用时间戳记录error ,warning 等发生的时间,请用datetime模块打印当前的时间戳
import datetime
# res = datetime.datetime.now() #2020-06-16 17:14:05.398528
res = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')#2020-06-16 17:15:50
res = datetime.datetime.now().isoweekday()# 2(周几)print(res)4. 数据库优化查询的方法
外键,索引,联合查询,选择特定字段
5. 请列出你会的任意一种统计图(条形图,折线图)绘制的开源库,第三方也行
(1): pyecharts
(2): matplotlib
6. 写一串自定义异常代码
deffn(N):try:if N>2:raise Exception('数字大于二')except Exception as e:print(e)
fn(3)7. 正则表达式匹配中,(.*)和(.*?)匹配区别?
(1):(.*)是贪婪匹配,会把满足正则的尽可能向后匹配
(1):(.*?)是非贪婪匹配,会把满足正则的尽可能少匹配
8. 简述 Django的orm
(1): orm 全称为object-relation mapping,意为对象-映射关系
(2): 实现了数据模型与数据库的解耦, 通过简单的配置就可以轻松更换数据库
(3): orm 操作的本质上会根据对接的数据库引擎,翻译成对应的sql语句
(4): 所有使用Django开发的项目迁移数据库时,只需要更换数据库引擎即可,而不需要修改代码
9.[[1,2],[2,3],[3,4]],展开列表
lst =[[1,2],[2,3],[3,4]]print([i for ele in lst for i in ele ])10. x ='abc',y ='cde',z =['e','f','g'],分别求x.join(y)和x.join(z)返回的结果
x ='111'
y ='222'
z =['3','3','3']print(x.join(y))print(x.join(z))
结果:211121112311131113
结论:
join方法是以前面的字符串为连接体,将后面的可迭代对象中的每个元素拼接到一起
基础试题10道
1. 举例说明异常模块中的tryexceptelsefinally 的相关意义
(1):tryexceptelse,如果tryexcept 没有捕获到异常就会执行else语句
(2):tryexceptfinally 无论是否捕获到异常都会执行finally语句
2. python中交换两个变量的值
(1): 如下
a,b =1,2print(a,b)
a,b =b,a
print(a,b)(2):结果
12213. 举例说明zip()函数的用法
(1):zip函数在运算时,会以一个或者多个序列(可迭代对象)为参数,返回一个元组,
且该元组的数据为这些可迭代对象中的并排元素,返回时遵循木桶效应,以最短
的序列为基准.(2):zip 参数可以接受多类型可迭代对像,如下
print([i for i inzip(range(7),range(6),range(5))])#输出[(0, 0, 0), (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4)]print([i for i inzip('abcdefg','1234','ABCDE')])#输出[('a', '1', 'A'), ('b', '2', 'B'), ('c', '3', 'C'), ('d', '4', 'D')]print([i for i inzip([1,2,3],['a','b','c'],['A','B','C','D'])])#输出[(1, 'a', 'A'), (2, 'b', 'B'), (3, 'c', 'C')]4. 写一串正则表达式,将字符串a ='4apples'中的数字和字母加一个空格
import re
ret = re.sub(r'\d+',str(re.findall(r'\d+',"a = '4apples'")[0])+' ',"a = '4apples'")print(ret)5. 写出几条常用的sql语句
(1): show databases; 显示所有数据库
(2): use database 数据库名; 进入到某个数据库
(3): show tanles ; 显示数据库中所有表
(4): desc 表名; 显示表的结构
(5): select *from 表名 ; 查看表中所有数据
(6): delete from 表名 where name ='lihua'(条件),根据条件删除数据
(7): update 表名 set name ='lihua',age ='12'(数据;数据....) where id=5(条件),根据条件更新数据
(8): create database 数据库名; 新建数据库
(9): create table 表名(字段 类型[长度],字段 类型[长度](如 id char[20])),新建表
(10): insert into 表名(字段1,字段2) values(value1,value2),向表中插入数据
6. str1 ='python',和str2 ='你好',编译成bytes类型
str1 ='python'
str2 ='你好'print(b'python',type(b'python'))#b'python' <class 'bytes'>,字母可以字节b''即可print(str1.encode('utf8'),type(str1.encode('utf8')))#b'python' <class 'bytes'>print(str2.encode('utf
7.[1,2,3]+[4,5,6]的结果是什么
print([1,2,3]+[4,5,6])#列表相加即合并,[1, 2, 3, 4, 5, 6]print((1,2,3)+(4,5,6))#元组相加也是,(1, 2, 3, 4, 5, 6)8. 提高Python运行效率方法:(1): 尽量使用迭代器,节约内存
(2): 尽量使用局部变量,检索速度快
(3): 循环代码优化
(4): 核心模块使用Cpython 或者 pypy,提高效率
(5): 合理使用多线程,多进程,协程
(6): 多个ifelse 语句时,发生次数较多的放在前面,减少判断次数
9. 简述mysql和redis的区别
(1): mysql ,关系型数据库,数据保存在磁盘中,检索时有io操作,访问速度慢
(2): redis , 内存型非关系数据库, 数据保存在内存中,检索速度快
10. 遇到bug如何处理
(1): 细节上的错误可以直接print(),查看输出结果查找问题
(2): 库或者框架,可以查找官方文档
(3): 对于bug,可以进行管理与分类总结,用teambin 等等管理工具进行记录,然后一条条修改
基础试题10道
1. 正则匹配'date = 2020-6-18'import re
str1 ='%daterange=2020-6-18%'print(re.findall(r'=(.+)%',str1))2.list=[2,1,4,3,6,5],从小到大排序,不使用排序函数
lst =[2,1,3,1,12,1,4,7,3,6,5,1,21]
N =len(lst)while N>0:#冒泡,最大的向后移动for i inrange(N-1):if lst[i]>lst[i+1]:
lst[i],lst[i+1]= lst[i+1],lst[i]
N-=1print(lst)3. 写一个单列模式
classNew(object):
__instance =Nonedef__new__(cls, name, age):ifnot cls.__instance:
cls.__instance =object.__new__(cls)return cls.__instance
def__init__(self,name, age):
self.name = name
self.age =age
a = New('小明',12)
b = New('小红',10)print(id(a),id(b))#2803218705152 2803218705152,id相同print(a.name,b.name)#输出均为小红,说明对象只有一个4. 保留两位小数
print('%.4f'%(1/3))#利用%.4f格式化print('{:.4f}'.format(1/3))#利用formatprint(round(1/3,4))#使用round5. 求三个方法打印结果
deffn(key,value,dic={}):
dic[key]= value
print(dic)
fn('a',1)
fn('b',2)
fn('c',3,{})
fn('d',4,)# {'a': 1}# {'a': 1, 'b': 2}# {'c': 3}# {'a': 1, 'b': 2, 'd': 4}#如果不传如新字典,就会将数据加入到函数默认字典中6. 列出常见的状态码和意义
(1):200 OK , 请求正常处理完毕
(2):204 No Content , 请求处理成功,没有实体的主题返回
(3):206 Partial Content , GET范围请求以成功处理
(4):301 Moved Permanently , 永久重定向,资源已永久分配新URL
(5):202 Found , 临时重定向 ,资源以临时分配新URL
(6):303 See Other 临时重定向, 期望使用GET定向获取
(7):304 Not Modified ,发送的附带请求条件未满足
(8):307 Temporary Redirect 临时重定向,POST 不会变成GET
(9):400 Bad Request 请求报文语法错误或者参数错误
(10):401 Unauthorized 需要通过HTTP认证,或者认证失败
(11):403 Forbidden 请求资源被拒绝
(12):404 Not Found 无法找到请求资源(服务器无理由拒绝)(13):500 Internal Server Unavailable 服务器故障或者Web应用故障
(14):503 Service Unavailable 服务器超负载或者停机维护
7. 分别从前端,后端,数据库阐述web项目性能优化
(1): 前端优化
1. 减少http请求 ,例如制作精灵图
2. html 和 css 放在页面上部,JavaScript放在页面下,因为js加载比较慢,
所以优先加载html , css 以防页面显示不全,性能差,影响用户体验
(2): 后端优化
1. 缓存存储读写次数高,变化少的数据,比如网站信息首页,商品信息等.
应用程序读取数据时,一般是先从缓存中读取数据,如果读不到,再访问
磁盘数据库,并将数据再次缓存
2. 异步方式 ,如果有耗时操作,可以采用异步 ,比如celery
3. 代码优化,避免循环和多次判断,将最可能发生的if语句放在最前
(3): 数据库优化
1. 如果有条件,数据可以存放redis ,读取速度快
2. 建立索引和外键等
8. 使用pop 和 del 删除字典中的键值对
dic ={'a':1,'b':2,'c':2}print(dic)#{'a': 1, 'b': 2, 'c': 2}
dic.pop('a')print(dic)#{'b': 2, 'c': 2}del dic['b']print(dic)#{'c': 2}9. 列出常见的mysql 数据存储引擎
(1): nnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的
完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的
优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交
(commit)和回滚(rollback)。
(2): MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出
记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可
以使用。
(3):MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读
写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。
所以,这类数据库只使用在相对较小的数据库表。
10. 合并['a','b','c'],[1,2,3],为[('a',1),('b',2),('c',3)]和{'a':1,'b':2,'c':3}
lst1 =['a','b','c']
lst2 =[1,2,3]print(list(zip(lst1,lst2)))#[('a', 1), ('b', 2), ('c', 3)]print(dict(list(zip(lst1,lst2))))#{'a': 1, 'b': 2, 'c': 3}print([(lst1[i],lst2[i])for i inrange(min(len(lst1),len(lst1)))])#[('a', 1), ('b', 2), ('c', 3)]print(dict([(lst1[i],lst2[i])for i inrange(min(len(lst1),len(lst1)))]))#{'a': 1, 'b': 2, 'c': 3}