面试2
https://mp.weixin.qq.com/s/mqs5ZriV1BUxOfT0tWTsFQ
1 给定两个 list A,B,找出相同元素和不同元素。
# 找出相同的元素 a = [1,2,3] b = [3,4,5] a =set(a) b = set(b) print(a&b)
# 找出不相同的元素 a = [1,2,3] b = [3,4,5] a =set(a) b = set(b) print(a^b)
2 请反转字符串
new_str = old_str[:-1]
3 用 select 语句输出每个城市中心距离市中心大于 20km 酒店数
select count(hotel)i from hotel_table where distance >20 group by city
4 给定一个有序列表,请输出要插入值 k 所在的索引位置
k = int(input('要插入的数字:'))
a = [1,2,5]
a.append(k)
a =sorted(a)
print(a.index(k))
或
# 给定一个有序列表,请输出要插入值 k 所在的索引位置
str1=int(input('请输入要插入的数字'))
a=[1,1,5]
max_valuse = max(a)
for index,item in enumerate(a):
if str1>= max_valuse:
print('所在的位置是:', len(a))
break
if item > str1: # 找到第一个大于str的值
a.insert(index,str1)
print('所在的位置是:', index)
break
print(a)
5 正则表达式贪婪与非贪婪模式的区别
① 形式上非贪婪模式有一个“?”作为该部分的结束标志;
② 在功能上贪婪模式是尽可能多的匹配当前正则表达式,可能会包含好几个满足正则表 达式的字符串,非贪婪模式,在满足所有正则表达式的情况下尽可能少的匹配当前正则表 达式
6 写出开头匹配字母和下划线,末尾是数字的正则表达式
r“^[A-Za-z]|_.*\d$”
7 请说明 HTTP 状态吗的用途,请说明常见的状态码机器意义。
通过状态码告诉客户端服务器的执行状态,以判断下一步该执行什么操作
常见的状态机器码有:
100-199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完 成整个处理过程。
200-299:表示服务器成功接收请求并已完成处理过程,常用 200(OK 请求成功)
300-399:为完成请求,客户需要进一步细化请求。302(所有请求页面已经临时 转移到新的 url),304、307(使用缓存资源)。
400-499:客户端请求有错误,常用 404(服务器无法找到被请求页面),403(服 务器拒绝访问,权限不够)
500-599:服务器端出现错误,常用 500(请求未完成,服务器遇到不可预知的 情况)
8 当输入 http:mioji3.com 时,返回页面的过程中发生了什么
1 浏览器向 DNS 服务器发送 mioji3.com 域名解析请求 2 DNS 服务器返回解析后的 ip 给客户端浏览器,浏览器想该 ip 发送页面请求 3 DNS 服务器接收到请求后,查询该页面,并将页面发送给客户端浏览器 4 客户端浏览器接收到页面后,解析页面中的引用,并再次向服务器发送引用资 源请求 5 服务器接收到资源请求后,查找并返回资源给客户端 6 客户端浏览器接收到资源后,渲染,输出页面展现给用户
9 闭包
在函数内部再定义一个函数,并且这个函数调用外部函数的变量,这个函数
和用到的变量称之为闭包
10 给定一个 list a, 满足 a[i+1] >= a[i], 给定 int key ,找出 list a 中第 一个大于等于 key 的元素的 index,无满足要求的元素则返回-1。

11 请写出一段 python 代码实现删除一个 list 里面的重复元素?
li = [11,11,22,33,44,5,22] li = set(li) print(li)
12 生成 100 内的偶数列表?
[i for i in range(100) if i % 2==0]
13 请尽量用简洁的方法二维数组转换成一维数组
方法 1
li=[[1,2],[3,4],[5,6]] print([j for i in li for j in i] )
方法 2
t=[] [t.extend(i) for i in li] print (t)
14 下面的代码的输出是什么,为什么会是这个结果?

15 请阅读下面的代码
iterator = (i for i in range (1,4)) matrix = [[x*y for y in iterator] for x in iterator] 期望的输出为: [[1,2,3],[2,4,6],[3,6,9]]
上述的代码是否复合预期,原因是什么?如何修改?
不符合预期,因为是生成器,取出后的结果为[[2,3]]
修改后的代码:
iterator = [i for i in range (1,4)] matrix = [[x*y for y in iterator] for x in iterator]
16 http post 和 get 的区别,cookie 和 session 的区别?
post 安全,将信息封装到请求体内,
get 不安全,发送请求时会将信息暴露在 url 上 post 和 get 都能发送或接收数据,但是语义上一般是 post 发送,get 是从服务 器获取
cookie 和 session 的区别:
1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
2、cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗 考虑到安全应当使用 session。
17 如何拓展 auth_user 的字段,请给出实现实例,如何替换 auth_user?
自定义一个抽象类里面添加用户拓展的字段,在让用户类继承抽象类,然后 在 settings.py 中指明用户认证类的路径。
18 django 里面有多个数据库的自动路由是如何实现的?
自定义一个类指明数据路由来控制特定模型的访问性,定义 def for_read()定 义读取数据的路由 def for_write()定义写入数据的路由 def for_relation() 定义是否支持关联查询的路由。 然后在配置文件中,声明自动路由类的路径
19 烧一根不均匀的绳用一个小时,如何用它来判断半个小时?
先把一根绳子两头点燃,同时点燃另一根绳子的一头.(烧完要用刚好半小时)
20 Python 内置数据结构
列表,元组,字符串,bytes,bytearray,集合,字典
共同点:都是可迭代对象
不同点:列表,bytearray,字典三种是可变的
元组,字符串,bytes,集合四种不可变
21 *args 和**kwargs 使用方法?
加了星号(*)的变量 args 会存放所有未命名的变量参数,args 为元组; 而加**的变量 kwargs 会存放命名参数,即形如 key=value 的参数, kwargs 为 字典
22 常用的多线程解决并发的方法
使用 thread 模块,创建线程 greenlet 模块,创建协程
23 有两个有序整形数组,A 和 B,都是从小到大排列,要求把 A 和 B 合并成数 组 C 也是有序的,例如 A = [1,3,5,7….] b = [2,4,6,8…],合并后 c = [1,2,3,4,5,6,7,8…], 请写一个方法尽可能高效率的来实现(不调用系统的函数)
合并后在冒泡
24 类的加载顺序(类中有继承有构造,有静态 )
(1)、调用静态成员时,会加载静态成员真正所在的类及其父类。 通过子类调用父类的静态成员时,只会加载父类而不会加载子类。
(2)、第一次 new 对象的时候 加载(第二次再 new 同一个类时,不需再加载)。
(3)、加载子类会先加载父类 。
25 请简要概括 django 的测试工具
test client 是一个 python 类,来模拟一个简单的“哑”浏览器,允许你来测试 你的 view 函数.
1.模拟"Get"和"Post"请求,观察响应结果--从 HTTP(headers,status codes)到 页面内容.
2.检查重定向链(如果有的话),在每一步检查 URL 和 status code。
3.用一个包括特定值的模板 context 来测试一个 request 被 Django 模板渲染。
26 jango 的继承方式有那些?
Django 目前支持三种不同的继承方式,包括抽象基础类,多表继承和代理。
27 有一张商品购买记录表 T,其中包含字段 uid(用户 id),pid(商品 id),现在要 统计即购买了商品 A(即 pid 为 A)又买了商品 B(即 pid 为 B)的用户 uid,请写出 对应的 SQL 语句。
select uid from T where pid = a and pid = b;
28 将列表按下列规则排序,补全代码
1 正数在前负数在后
2 整数从小到大
3 负数从大到小
例子: 排序前[7,8,5,4,0,-2,-5] 排序后[0,4,5,7,-2,-5,-8]
补全代码: Sorted(lst,key=lambda x:______) 补全后的代码
sorted(list1,key=lambda x:(x<0,abs(x)))
29 去除多余嵌套的列表
def f(x):
ret = []
for b in x:
if isinstance(b, list):
for a in f(b):
ret.append(a)
else:
ret.append(b)
return ret
list2 = [11, 22, [33, 44], [55, [66, 77]], [88, [99, [100, [200, [300]]]]]]
ret = f(list2)
TCP 传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。
tcp通信需要经过创建连接、数据传送、终止连接三个步骤。
tcp 传输控制协议,通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话""
UDP 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地
OSI 七层模型
应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
三次握手:
(面试回答)
(1)首先,必须先由客户端发起连接的请求
(2)接下来,服务器接收到请求之后,回复给客户端两个标识,一个syn表示服务器接收到请求,一个ack表示服务器在做准备工作,两个标识一起回复给客户端
(3)最后,客户端接收到服务器的回复,客户端准备连接的所有资源,开始进行连接,发送给服务器一个ack表示客户端的连接准备工作已经完成(此时表示客户端和服务器可以相互连接了)
如果面试官问你,哪句代码体现了三次握手?
回答:服务器端的accept,客户端connect
四次挥手
(面试回答)
(1)首先由连接双方任意一方发起断开连接的请求,发起方发送的请求表示是我没有数据要继续发送了,可以断开连接了,但是你如果还有数据可以继续向我发送数据.
(2)接收方回复给发起方,表示接到了发起放的断开请求,开始着手准备断开事宜
(3)接收方准备完成后,给发起方发送一个标识,表示接受方没有数据继续发送了,可以断开连接了
(4)发起方接收到消息后,准备断开连接,回收资源
如果面试官问你,哪句代码体现了四次挥手?
回答:close()
问题:4G 内存怎么读取一个 5G 的数据?
方法一:
可以通过生成器,分多次读取,每次读取数量相对少的数据(比如 500MB)进行处理,处理结束后再读取后面的 500MB 的数据。
def get_lines_1():
my_list = []
with open("file.txt", "r") as f:
for eachline in f:
my_list.append(eachline)
return my_list
def get_lines_2():
with open("file.txt", "r") as f:
while True:
data = f.readlines(10)
if not data:
break
yield data
if __name__ == '__main__':
for e in get_lines_1():
print(e) # 处理每一行数据
print("*" * 50)
for e in get_lines_2():
print(e)
方法二:
可以通过 linux 命令 split 切割成小文件,然后再对数据进行处理,此方法效率比较高。可以按照行数切割,可以按照文件大小切割。

浙公网安备 33010602011771号