最近在弄flask的东西,好久没写博客的,感觉少了点什么,感觉被别人落下好多,可能渐渐的养成了写博客的习惯吧。也是自己想学的东西太多了(说白了就是基础太差了,只是know how,不能做到konw why)。
不说那些毒鸡汤了,我们来说说我们今天的python基础面试题吧。
一,Q:python的优缺点有什么?
A:优点:
1,基础语法简单易学,对于初学者来说,语法还是相对简单的,比较容易学习,网上的学习资料也很多。
2,面向对象,在python里继承和封装较多,而python的多态还是相对较少的(起个不一样的名字不就可以吗....对java的多态表示无奈),从而减少了大量代码的输出。
3,语言简洁,相对java比,语法要比java简单很多(我只会java和python,会一点点Node.js和前端的VUE)
4,开源,python语言开源便于我们自行去维护和更深入的了解源码。
5,丰富的社区资源,具有超级丰富的三方库。
缺点:
1,运行速度慢,由于python是解释性语言,对比其它语言要相对慢一些。
2,python2和python3不兼容(python2在2020年1月就不在维护)
3,代码安全性较弱,我们发布项目,其实就是发布我们的源码,安全性差。
MA:个人认为python的优点在于他是一种面向对象的动态类型语言,从自动化运维到web开发再到人工智能,python都有着良好的表现,
个人觉得还是python有着丰富的三方类库,给予了python很大的发展,例如NumPy,pandas在自然语言处理内都是很常用,而且是很好用的
三方库,缺点就是运行速度稍慢一些,就是因为python是解释性语言,需要在CPU上一行行翻译成机器可以读懂的机器码,这个翻译的过程比较耗时,所有运行会慢一些,
再就是部署时候就是直接源码部署,安全性差,python2和python3不兼容的问题,我觉得不是问题,python2将要不再维护了,python2也就逐渐推出我们的程序。
注:开放性题,想了解更多,你可以去自行百度,组织成自己的语言就可以啦。A即为比较官方的说法(只摘取部分),MA为我自己组织的一段话,大家可以参考。
二,Q:说一说你对深拷贝和浅拷贝的理解,他们有什么不同。
A:假设我们复制了一份A,复制出来的叫做B,如果我们修改A,发现B也随着变化了,说明这个是浅拷贝,也就是说明了,我们的浅拷贝,只是增加了一个指针指向了同一个内存地址,当我们修改A,也就是修改原有的内存地址的值,B一定随之变化;如果我们修改了A,发现B没有变化,说明这个是深拷贝,也看得出来,深拷贝就是我们拿到A的内存的值,开辟了一个新的内存空间和创建了一个新的指针,指向了B,就是说,深拷贝就是将内存也复制成了两份,而浅拷贝并没有。浅拷贝:shallowCopy();深拷贝:deepCope()。
三,Q:python里的基本数据类型都有什么?
A:数字-number-数字;布尔型-bool-(True,False);字符串-str-‘a‘或者"a";列表-list-[];元祖-tuple-();字典-dict-{}。其中列表list,字典dict是可变的,其余数字number,字符串str,元祖tuple是不可变的
四,Q:简单说一下python中如何实现多线程
A:线程是轻量级的进程,多线程允许一次执行多个线程。众所周知,Python 是一种多线程语言,它有一个多线程包。
GIL(全局解释器锁)确保一次执行单个线程。一个线程保存 GIL 并在将其传递给下一个线程之前执行一些操作,这就产生了并行执行的错觉。但实际上,只是线程轮流在 CPU 上。当然,所有传递都会增加执行的开销。
注意:GIL后期会出一个专门的博客来说一说,刚才查了一下,要说的东西还是比较多的。
五,Q:什么是Flask,和Django对比有什么不同
A:Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。
Flask是一个轻量级框架,相当于一个步枪,而 Django是一个个重量级框架,相当于一个重机枪,但是Flask的三方库也是相当强大的,Django能做到的 Flask也都可以(个人表示只用过Flask)。
Flask的优势:
Flask自由、灵活,可扩展性强,入门简单,适用于中小型网站的开发,非常试用web服务的API开发,性能方面均优于或高于Django,Django自带的或第三方的好评如潮的功能,Flask上总会找到与之类似第三方库,Flask与关系型数据库的配合使用不弱于Django,而其与NoSQL数据库的配合远远优于Django
Django的优势:(三方摘录)
Django的自带ORM非常优秀,综合评价略高于SQLAlchemy,Django自带的模板引擎简单好用,但其强大程度和综合评价略低于Jinja,Django自带的数据库管理app好评如潮,Django目前支持Jinja等非官方模板引擎。
六,Q:如何在python中管理内存
A:python的内存管理是由私有的堆空间管理的,所有的python对象和数据结构都在一个专有的堆,程序员没有访问该堆的权限,只有解释器才能对他进行操作。可用 is 判断两个对象的内存地址是否一样,用 == 判断两个对象的值是否一样。None值也有内存地址,用print(id(None))可以打印其内存地址。
备注:这个写的感觉听不错哒,可以参考。https://www.cnblogs.com/wangyuhangboke/p/7802253.html
七,Q:刚刚说完了内存管理,现在我们来说说垃圾回收吧
A:python提供了对内存的垃圾收集机制,但是他将不用的内存放到内存池而不是反回给操作系统。python内部使用引用计数,来保持追踪内存中的对象,python内部记录了对象有多少个引用,就是引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要的时候,这个对象的引用计数为0时,他被垃圾回收。当对象被创建被、作为参数传递给函数或作为容器对象的一个元素引用计数增加,相反,一个本地引用离开他的作用域、对象的别名被显式的销毁、对象的一个别名被赋值给其他对象或窗口对象本身被销毁引用计数会减少。
八,Q:能否解释一下 *args 和 **kwargs?
A:当函数的参数不确定时,可以使用*args和**kwargs。*args没有key值,**kwargs有key值。*args可以当作可容纳多个变量组成的list或tuple。直观一点来点代码吧。
#!/usr/bin/env python # -*- coding: utf-8 -*- def parseArgs(*args, **kwargs): print(type(args)) print(args) print(type(kwargs)) print(kwargs) if __name__ == ‘__main__‘: parseArgs("test","123",‘456‘,hello="hello",name=‘tom‘)
九,Q:解释 Python 中的 join() 和 split() 函数
A:join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串,例如
#!/usr/bin/env python # -*- coding: utf-8 -*- str = "-" seq = ("a", "b", "c") # 字符串序列 print(str.join(seq)) li = [‘d‘, ‘e‘, ‘f‘] # 字符串序列 print(str.join(li))
split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串。语法 str.split(str="", num=string.count(str)).
str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num -- 分割次数。默认为 -1, 即分隔所有。例如
#!/usr/bin/env python # -*- coding: utf-8 -*- str = "my name is xc" print(str.split()) # 以空格为分隔符,包含 \n print(str.split(‘ ‘, 2)) # 以空格为分隔符,分隔成2+1个
十,Q:Python 区分大小写吗?
A:python是区分大小写的,最后一个题我自身觉得挺无聊的,但是仔细想想,还有点懵,自己试了一遍才知道,真的区分,别让别人的问题问懵了。
最近忙着弄Flask的源码,写博客的时间不多,过几天整理好了,把基础的工具类,权限,OSS登陆写好以后,我会开源在码云上。觉得是可以拆分部署的,不知道真实项目可不可以使用,还在补全注释和代码优化。
原文地址:https://www.cnblogs.com/cxiaocai/p/11009114.html