1、is 和 == 的区别
is 判断内存 id 是否相等,== 判断值是否相等。
2、dict 和 list 的查找复杂度
dict 用 hash 实现,查找的时间复杂度是O(1),list则为O(n)。
3、a b c 三个装饰器依次装饰函数fun(),装饰器的执行顺序
一个函数可以被多个装饰器修饰,执行顺序为从近到远。
4、运行一个字符串
字符串是用来记录文本信息(文字信息),字面值:双引号。eval计算字符串中的表达式,exec执行字符串中的语句,execfile用来执行一个文件。
exec('print("777")')#777
print(eval("8+10"))#18
5、Python多线程不能充分利用CPU多核
由于python解释器设计中加入了解释器锁,导致python解释器同一时刻只能解释执行一个线程,大大降低了线程的执行效率。因为遇到阻塞时线程会主动让出解释器去解释其他线程,所以python多线程在执行多阻塞高延迟IO时可以提升程序效率,其他情况并不能对效率有所提升。
GIL问题建议:尽量使用进程完成无阻塞的并发行为,不使用c作为解释器 (Java C#)。
在无阻塞状态下,多线程程序和单线程程序执行效率几乎差不多,甚至还不如单线程效率,但是多进程运行相同内容却可以有明显的效率提升。
6、上下文管理器
广泛意义上来说,上下文是指程序运行的环境。在一些文件操作和数据操作当中我们使用上下文管理器的方式可以在调用的时候更加快捷。Python中上下文管理器常见于打开文件或网络连接,其实就是with关键字。
#先要存在 test.txt
with open("test.txt") as f:
print(f.read())
python中的with语句使用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会执行规定的“清理”操作,释放被访问的资源,比如有文件读写后自动关闭、线程中锁的自动获取和释放等。通过with方法可以不用close(),因为with生成的对象在语句块结束后会自动处理,所以也就不需要close了,但是这个文件对象只能在with语句块内使用。
只要对一个对象实现了__enter__和__exit__函数,就可以构造自己的上下文管理器了。
7、同步/异步/阻塞/非阻塞
爬取一个数据,然后再保存数据,接下来再去爬另一个数据,这是同步;异步就是爬虫不用等着数据保存好,爬完一个直接去爬另一个,数据保存的事情交给别的逻辑去处理。
在执行IO操作时如果执行条件不满足则阻塞,阻塞IO是IO的默认形态。
通过修改IO属性行为,使原本阻塞的IO变为非阻塞的状态:设置套接字为非阻塞IO;设置一个最长阻塞时间,超过该时间后则不再阻塞等待。
8、判断两个浮点数相等
两者的差值小于一个我们可以容忍的小值时,就可以认为它们相等。Math模块中有一个isclose函数用来判断两个浮点数的值是否接近或相等。
import math
# a = 9
a = 5.0
b = 4.99998
if __name__=="__main__":
if math.isclose(a, b, abs_tol=0.00003):
print(True)
else:
print(False)
print(0.1 + 0.2)#0.30000000000000004
9、MySQL的索引实现
B-Tree(一般是B+Tree)和Hash。
10、Flask的实现
Flask是一个基于Python并依赖于Jinja2模板引擎和WerkZeug WSGI服务的框架。
from flask import Flask
app = Flask(__name__)
@app.route('/index')
def hello_world():
return "HelloWorld"
if __name__ == "__main__":
app.run()
浏览器127.0.0.1/index查看显示网页。
11、一个木棍任意截成三段,围成三角形的概率
25% 。
12、一个函数RAND7()随机返回1~7,使用它构造一个RAND10()函数随机返回1~10
用 7 的倍数70去模拟,1:1~10,2:11~20,... ,61~70 。
13、有一个问答平台,每个用户对一个问题最多只能回答一次,同一个问题最多只能对一个答案点赞。1)设计合适的数据库结构;2)写出SQL获取点赞数最多的10个问题
有哪些表,字段分别是什么,至于题中的条件限制,就交由后台的程序逻辑去处理,而不是在数据库设计层面去限制。
14、设计一个栈,实现pop/push及max方法,要求能在O(1)时间内取得最大值
采用空间换时间l让list能O(1)取得最大值,每push一个数就同时记录当前的最大值。
15、如果网站访问量上去了,最先出现瓶颈问题的点,优化
数据库。好多不必要或者可以使用缓存的地方也频繁操作数据库,而且是使用的ORM,ORM不能确保对应的SQL语句是最优的,尝试使用原生SQL或者增加Redis缓存。
16、扩展后台服务器
增加服务器,然后前面加一层负载均衡,把请求分配给不同的服务器。针对不同的服务器怎么使用Session再加个Session服务器即可。