面试题

  1. 现代浏览器与服务器建立了一个TCP连接后是否会在一个HTTP请求完成后断开? 什么情况下会断开?

  2. 一个TCP连接可以对应几个HTTP请求?

  3. 一个TCP连接中HTTP请求发送可以一起发送么?(比如一起发送三个请求,在三个响应一起接受)>

问题

1. 一行代码实现1-100求和

2. 如何修改函数内部值?

3. python常用的内置模块

4. 删除和合并字典

5. GIL是什么?进程是什么?线程是什么?

6.请写出一段python代码实现删除一个list中的重复元素(2种方法)

答案

  1. 在HTTP/1.0中,当服务器发送完一个HTTP响应后,会断开TCP连接.

    但是这样每次请求都需要重新连接和断开,代价过大.

    因此我们可以在Headers中设置一个Connection字段, 其值为keep-alive,这样每次服务器发送完HTTP响应后,默认不会断开TCP连接.这样下次发起HTTP请求的时候,就不需要再重新连接了,另外如果维持连接.SSL的的开销也可以避免

    HTTP1.1中, 默认把Connection头写进了标准,并且默认开启持久连接.除非请求中写明Connection:close.不然浏览器和服务器之间会默认维持一段时间的TCP,不回一个请求就断掉.

    因此第一个问题中的答案是:默认不会断开,除非在请求报文中申明 Connection字段为close

答案:

1.一行代码实现1-100求和

sum(range(1,101))

2.如何修改函数内部值?

a = 4

def func(a):
	global a
	a = 5
	
func(a)

print(a)

3.python常用的内置模块

  • os 模块 存储了操作系统相关的内置函数(os.path)
  • sys 模块 与系统有关的函数 path.join()
  • re模块 正则
  • datetime 时间
  • math 数学
  • hashlib 哈希模块
  • threading 基于线程的并行
  • multiprocessing 基于进程的并行
  • subprocess 子进程管理

4.删除和合并字典

使用del 和update方法

dic1 = {'a': '1', 'b': '2'}
dic2 = {'c': '3'}

>>> del dic1['b']
>>> dic1
>>> {'a': '1'}

>>> dic1.update(dic2)
>>> {'a': '1', 'c': '3value'}

5. GIL锁

GIL (Global Interpreter Lock),同一进程中如果有多个线程运行, 一个线程在运行python程序的时候,会霸占python解释器(即加了一把GIL锁), 使该进程内的其他线程无法运行, 等该线程运行完后其他线程才能运行. 如果线程运行过程中遇到耗时操作,那么解释器的锁会解开, 使其他线程运行. 所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行.

多进程中因为每个进程都能被系统分配资源, 相当于每个进程有一个python解释器, 所以多进程可以实现多个进程同事运行, 缺点是进程系统资源开销大.

6. 删除一个list中的重复元素

# 1. 使用set
a = [1, 2, 4, 2, 4, 5, 6, 5, 7, 8, 9, 0]
b = set(a)
b = list(b)

# 2. 使用字典
b = {}
b = b.fromkeys(a)
>>>b
{1: None, 2: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None, 0: None}
>>> b.keys()      
dict_keys([1, 2, 4, 5, 6, 7, 8, 9, 0])

>>> [b.keys()] 
[dict_keys([1, 2, 4, 5, 6, 7, 8, 9, 0])]

c = list(b.keys())
>>> c
[1, 2, 4, 5, 6, 7, 8, 9, 0]

这里要注意 b.keys()生成特定的字典 dict_keys(),直接外层套[],并不能改变内部的格式

得到的结果是 [dict_keys([1, 2, 4, 5, 6, 7, 8, 9, 0])] 与c不符合

手机验证码注册的后端流程:

两步拦截

  1. 浏览器发出获取图片验证码的请求,服务器收到请求并生成验证码图片,将图片验证码返回给浏览器
  2. 浏览器携带图片验证码发起获取短信验证码的请求, 服务器接受请求,验证图片验证码并生成短信验证码,将验证码返回给浏览器

遇到的问题:

如果我想要效验验证码,最好的方式就是存入数据库.考虑到验证码需要过期时间等因素,将其存入redis.

如果有许多用户同时发起请求,生成的验证码都是一串乱码,如何获取对应的图片验证码呢?

因此我们需要一个验证码的id值,这样存入的时候以 验证码id:验证码图片的键值对的形式存入redis,方便我们在验证短信验证码的时候

posted on 2020-08-15 13:57  sunnywillow  阅读(120)  评论(0编辑  收藏  举报