python面试题总结

1.http是什么,tcp/udp区别(比较常见,必问)

我的另一个博客里的第一个有详细写点击进入

2.面向对象的相关知识点

三大特征 :封装、继承、多态

封装–将一些功能或者数据组合起来对外使用,提高代码的复用性
继承–子类继承父类,父类由子类抽象而来,子类有不同的行为(重写,体现了多态)
多态–父类的同一种行为,在不同的子类有不同的表现

六大原则:迪米特,里式替换,开闭,单一职责,依赖导致,聚合复用

3.python进程、线程相关

1.两者都是多任务编程,都能使用计算机的多核资源
2.进程的创建删除比线程消耗的资源多
3.进程空间独立,数据互不干扰,有专门的通信方法,线程使用全局变量通信
4.一个进程可以有多个分支线程,两者有包含关系
5.多个线程共享进程资源,在共享资源操作时往往需要同步互斥处理
6.python线程存在GIL问题,但是进程没有

4.深浅拷贝

主要是在内存上的区别,可以画个内存图(或者想象一个)

list01 = ['a',[1,2]]
list02 = list01[:]
list01[1][1] = 'b' #修改list01的索引为1的元素的索引为1的元素
list02 = ['a',[1,'b']]  #list02也会跟着改变,此为浅拷贝

深拷贝一般用copy模块的deepcopy

5.cookie和session

cookie存储在浏览器,相对不安全,session存储在服务器,相对安全一点
不管是cookie还是session都是不要存储敏感数据
由于session存储在服务器上,所以当访问增多,会占用服务器性能,建议用cookie
某些浏览器不允许存储的cookie超过4k,最多20条

建议将登陆信息等重要信息存放在session,其他信息如需保留,存放在cookie

6.http和https的区别

端口:80/443
https是由http和ssl构建的,具有加密效果

7.mysql的引擎

innodb:
支持事务处理,
不加锁读取,
支持外键,
支持行锁,不
保存表的具体行数,通过扫描表获取
删除表时,一行一行删除
innodb中必须包含AUTO_INCREMENT类型字段的索引
表格很难压缩
MyISAM:
不支持事务,回滚将造成不完全回滚,不具有原子性
不支持外键
不支持外键
支持全文搜索
保存表的具体行数,不带where时,直接返回保存的行数
DELETE 表时,先drop表,然后重建表
MyISAM 表被存放在三个文件 。frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex)引伸
跨平台很难直接拷贝
MyISAM中可以使AUTO_INCREMENT类型字段建立联合索引
表格可以被压缩

执行查操作多的用MyISAM,执行写操作多的用Innodb

8.python2和python3的区别

点击进入本文章第八点

9.闭包

作用:保留外部函数的栈桢,供内部函数使用
三要素:
		1.必须有一个内嵌函数
		2.内嵌函数必须引用外部函数中的变量
		3.外部函数返回值必须是内嵌函数
可以实现python的装饰器	

10.给出下面代码的输出结果以及涉及原理

def dict_updater(k,v,dic={}):
       dic[k] = v
       print(dic)
   dict_updater('one',1)
   dict_updater('two',2)
   dict_updater('three',3,{})
   
 {'one': 1}
 {'one': 1, 'two': 2}
 {'three': 3}

这个涉及到闭包,当没有给出参数dic时,用的就是默认的,即创建函数时创建的。
如果给了,那就用新的。

11.格式化字符串保留小数

'{:0.2f}'.format(0.135)   #'0.14'
'{:0.2f}'.format(0.145)   #'0.14'
原因在于:要看5前面的数字,是奇数就进,偶数就约

12.python的with实现

要使用with,就要明白上下文管理器

with所求值的对象必须有一个enter()方法,一个exit()方法
紧跟with后面的语句要求值时,返回对象enter()方法被调用,
这个方法的返回值,将被赋值给as后面紧跟的变量,
当with的代码块被全部执行完之后,将调用前面返回对象exit()方法

下面的例子可以说明with方法如何工作

class Sample:
	def __enter__(self):
		print('In __enter__()')
		return 'Foo'
	
	def __exit__(self, type, value, trace):
		print('In __exit__()')
		
def sample():
	return Sample()
with sample() as sample:
	print('sample',sample)

代码运行如下

In __enter__()
Foo
In __exit__()

我们来改一下代码,看看具体如何工作的

class Sample:
    def __enter__(self):
        return self
 
    def __exit__(self, type, value, trace):
        print "type:", type
        print "value:", value
        print "trace:", trace
 
    def do_something(self):
        bar = 1/0
        return bar + 10
 
with Sample() as sample:
    sample.do_something()

这个例子中,with后面的get_sample()变成了Sample()。这没有任何关系,只要紧跟with后面的语句所返回的对象有enter()和exit()方法即可。此例中,Sample()的enter()方法返回新创建的Sample对象,并赋值给变量sample。

作者:龙皓晨 链接:https://www.jianshu.com/p/1a02a5b63c88 来源:简书

13.同源策略

URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。

14.sql优化

  • 尽量选择数据类型占用空间少,在where和order by,group by 中出现频率高的字段尽力索引
  • 尽量避免使用select * …,用具体字段代替
  • 少使用模糊查询和正则查询,比如使用like % 就会全表扫描
  • 控制使用自定义函数
  • 查询单条最后添加limit 1,停止权标扫描
  • where字句中不要出现 !=,否则放弃索引全表扫描
  • 尽量避免NULL值判断,否则放弃索引全表扫描
  • 在number列上设置默认值为0,确保number列无NULL值
  • 尽量避免or连接条件,否则会放弃索引进行全表扫描,可以用union代替
  • 尽量避免使用in 和not in,否则全表扫描

15.一些基础数据结构的概念

算法:解决问题的方法和思路
数据结构只是静态的描述了数据元素之间的关系

 时间复杂度,指的是运算步骤的数量,习惯性的用T(n)表示。忽略系数,忽略常数,去掉低次幂。

计算如下代码的时间复杂度
两层for循环,T(n) = O(n^2)

for n1 in range(0,1001):
        for n2 in range(0,1001):
            n3 = 1000 - n1 - n2
            if n1**2 + n2**2 == n3**2:
                print('[%d,%d,%d]'%(n1,n2,n3))

总结:
O(1)20个基本步骤
O(n)一个for循环
O(n^2)两个for循环
O(n^3)三个for循环
O(logn)循环减半的时间复杂度为O(log2n)即O(logn)

时间复杂度越低说明运行效率越高
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)

数据结构分类

线性结构

顺序表:将数据结构中各个元素按照其逻辑顺序存放于存储器一片连续的空间中(列表)
链表:将数据结构中个元素分布到存储器的不同点,用记录下一个节点位置的方式建立他们之间的联系
栈:后进先出
队列:先进先出

非线性结构

树形结构
图形结构

16.常见的http状态码

200代表一切正常,请求成功
400代表客户端方面的问题
404代表请求的网页不存在
500服务端问题,内部服务器错误
-------------------------------------------
301请求的资源已经被永久的移动到新的url
302请求的资源临时移动,客户端还是要继续使用该url

17.HTTP请求/响应的步骤

  • 客户端连接到Web服务器
    一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认80)建立一个TCP套接字。
  • 发送HTTP请求
    通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行、请求数据4部分组成
  • 服务器接受请求并返回HTTP响应
    Web服务器解析请求,定位请求资源。服务器将资源副本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行、响应数据4部分组成
  • 释放连接TCP连接
    若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP;若connection为keepaliive,该连接会保持一段时间,在这段时间内可以继续接受请求。
  • 客户端浏览器解析HTML内容
    客户端浏览器首先解析状态行,查看表名请求食肉成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值