本网站可以通过分类标签帮助你快速筛选出你想看的文章,记住地址:www.Facec.cc

Python面试题(更新中)

1.谈下python的GIL

  • GIL 是python的全局解释器锁,是解释器 用于同步线程的工具,使得在同一进程内任何时刻仅有一个线程在执行。同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。
  • 多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大

有没有办法在Python中利用多核?当然可以!刚才的多进程算是一种解决方案,还有一种就是调用C语言的链接库。

  1. 在以IO操作为主的IO密集型应用中,多线程和多进程的性能区别并不大,原因在于即使在Python中有GIL锁的存在,由于线程中的IO操作会使得线程立即释放GIL,切换到其他非IO线程继续操作,提高程序执行效率。相比进程操作,线程操作更加轻量级,线程之间的通讯复杂度更低,建议使用多线程。

  2. 如果是计算密集型的应用,尽量使用多进程或者协程来代替多线程。

2.fun(args,**kwargs)中的args,**kwargs什么意思?

Snipaste_20220723_161900.png
Snipaste_20220723_161929.png

3.python2和python3的range(100)的区别

python2返回列表,python3返回迭代器,节约内存

4.一句话解释什么样的语言能够用装饰器?

函数可以作为参数传递的语言,可以使用装饰器

5.简述面向对象中__new__和__init__区别

__init__是初始化方法,创建对象后,就立刻被默认调用了,可接收参数
1、__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别

2、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例

3、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

4、如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是cls来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。

6.简述with方法打开处理文件帮我我们做了什么?

打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open
写法,
我们需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行finally f.close()关闭文件,with方法帮我们实现了finally中f.close
(当然还有其他自定义功能,有兴趣可以研究with方法源码)

7.map()函数和列表推导式

列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25]
map()函数第一个参数是fun,第二个参数是一般是list,第三个参数可以写list,也可以不写
image.png

8.字符串拼接和字符串避免转义

str = f'{name}喝了杯水'

# r避免转义
str = r'<div class="nam">中国</div>'

9.python中断言方法举例

assert()方法,断言成功,则程序继续执行,断言失败,则程序报错

a=3
assert(a>1)
print("断言成功,程序向下执行")
a=7
assert(a>100)
print("断言失败,抛出错误")

10.python2和python3区别?列举5个

1、Python3 使用 print 必须要以小括号包裹打印内容,比如 print('hi')

Python2 既可以使用带小括号的方式,也可以使用一个空格来分隔打印内容,比 如 print 'hi'

2、python2 range(1,10)返回列表,python3中返回迭代器,节约内存

3、python2中使用ascii编码,python中使用utf-8编码

4、python2中unicode表示字符串序列,str表示字节序列

python3中str表示字符串序列,byte表示字节序列

5、python2中为正常显示中文,引入coding声明,python3中不需要

6、python2中是raw_input()函数,python3中是input()函数

11.简述Django的orm

ORM,全拼Object-Relation Mapping,意为对象-关系映射

实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要修改代码只需要面向对象编程,orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句,所有使用Django开发的项目无需关心程序底层使用的是MySQL、Oracle、sqlite....,如果数据库迁移,只需要更换Django的数据库引擎即可

12.列出常见的状态码和意义

200 OK
请求正常处理完毕

204 No Content
请求成功处理,没有实体的主体返回

206 Partial Content
GET范围请求已成功处理

301 Moved Permanently
永久重定向,资源已永久分配新URI

302 Found
临时重定向,资源已临时分配新URI

303 See Other
临时重定向,期望使用GET定向获取

304 Not Modified
发送的附带条件请求未满足

307 Temporary Redirect
临时重定向,POST不会变成GET

400 Bad Request
请求报文语法错误或参数错误

401 Unauthorized
需要通过HTTP认证,或认证失败

403 Forbidden
请求资源被拒绝

404 Not Found
无法找到请求资源(服务器无理由拒绝)

500 Internal Server Error
服务器故障或Web应用故障

503 Service Unavailable
服务器超负载或停机维护

13.写一个单列模式

image.png

14.简述多线程、多进程

进程:
1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立

2、稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制

线程:
1、CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源

2、如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃

应用:
IO密集的用多线程,在用户输入,sleep 时候,可以切换到其他线程执行,减少等待的时间

CPU密集的用多进程,因为假如IO操作少,用多线程的话,因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL,其他线程没有GIL,就不能充分利用多核CPU的优势

15.简述any()和all()方法

any():只要迭代器中有一个元素为真就为真

all():迭代器中所有的判断项返回都是真,结果才为真

python中什么元素为假?

答案:(0,空字符串,空列表、空字典、空元组、None, False)

16.列出几种魔法方法并简要介绍用途

init:对象初始化方法

new:创建对象时候执行的方法,单列模式会用到

str:当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据

del:删除对象执行的方法

17.python字典和json字符串相互转化方法

json.dumps()字典转json字符串,json.loads()json转字典
image.png

18.简述乐观锁和悲观锁

悲观锁, 就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

乐观锁,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制,乐观锁适用于多读的应用类型,这样可以提高吞吐量

19.Python里的拷贝

引用和copy(),deepcopy()的区别
image.png

# django   python   js   flask   linux  

评论