精心整理的8道Python面试题,你答不答的出来

菜鸟独白

每年的3-4月份是跳槽的高峰期,无论是应聘Python web开发,爬虫工程师,或是数据分析,还是自动化运维,都涉及到一些基础的知识!我挑了一些Python的基础面试题,看看你能不能的答上来,也许面试的同学用的着!



NO. 1

Python这么好

说说它的特性吧

关键特性
  • Python是一种解释型语言,这意味着,与C,C++不同,Python不需要在运行之前进行编译。它是边运行边解释。

  • Python是动态类型化的,这意味着当你声明它们或类似的东西时,你不需要声明变量的类型。你可以x=1 ,然后x="abc"没有错误

  • Python非常适合面向对象编程,因为它允许定义类以及组合和继承。Python没有访问修饰符(如C ++的public,private).

  • 在Python中函数是一等对象,这意味着它们可以在运行时动态创建,能赋值给变量或者作为参数传给函数,还能能作为函数的返回值

  • Python代码容易上手,开发速度很快,但运行速度通常比编译语言慢。幸运的是,Python允许包含基于C的扩展,所以瓶颈可以被优化掉,比如,numpy包就是一个很好的例子,它非常快,因为它所做的很多运算在底部都是用C编写的!


NO. 2

Python中的赋值

浅拷贝和深拷贝的区别

深浅拷贝区别

1).对象的赋值

Python中对象的赋值实际上是简单的对象引用也就是说,当你创建一个对象,然后把它复制给另一个变量的时候,Python并没有拷贝这个对象,而是拷贝了这个对象的引用。



2).浅拷贝

一般使用copy.copy(),可以进行对象的浅拷贝.它复制了对象但对于对象中的元素,依然使用原始的引用.


使用copy对a进行浅拷贝,b复制了a的对象,但是b里面的[2,3,4]和a里面的[2,3,4]其实都是指向同一块内存地址,所以改变了a[1]之后,b里面的b[1]也发生了改变!


3).深度拷贝

深度拷贝需要用copy.deepcopy()进行深拷贝。它会复制一个容器对象,以及它里面的所有元素(包含元素的子元素)


当对a列表进行深度拷贝之后,b复制了a的对象,但是b里面的[2,3,4]和a里面的[2,3,4]其实都是指向不同的内存地址.

a[1].append(5) print (a) print (b)>> [1, [2, 3, 4, 5]]#因为是深度拷贝,改变了a[1],b[1]内容不会改变 [1, [2, 3, 4]]


NO. 3

Python中的==

和is的区别

==和is

Python中==和is的区别

is是判读对象标识符是否一致,而==是判读两个对象的内容是否相等!

  • x is y 相当于 id(x)==id(y)

  • ==是检查两个对象的内容是否相等,会调用对象的内部__eq__().


NO. 4

线程如何在Python

中实现

多线程问题

线程如何在Python中实现

Python有一个多线程包threading,可以使用多线程来加快你的代码。但是Python有一个叫做Global Interpreter Lock(GIL)的构造。GIL确保只有一个'线程'可以在任何时候执行。

线程获取GIL,做一些工作,然后将GIL传递到下一个线程。这种情况发生得非常快,所以对于人眼而言,它可能看起来像你的线程并行执行,但它们实际上只是轮流使用相同的CPU内核。因此GIL的存在使得Python中的多线程无法真正的利用多核的优势来提高性能。

对于IO密集型操作,在等待操作系统返回的时候会释放GIL;再比如爬虫因为有等待的服务器的响应时间,可以利用多线程来加速!但是对于CPU密集型操作,只能通过多进程Multiprocess来加速。


NO. 5

Python中的

猴子补丁式啥

猴子补丁

Python中的猴子补丁是什么?

考虑下面的例子:


>>

f()


猴子补丁:

是一种非常Pythonic的用法,即函数在python中可以像使用变量一样对它进行赋值等操作,我们可以在运行时动态替换模块,俗称手法称为猴子补丁!我们通过对MyClass.f 重新赋值,动态的改变了输出的结果.




NO. 6

Python中的

负数index

负值索引

Python中的负数index是用来做什么的?

Python中的序列是索引的,它由正数和负数组成。正的数字使用'0'作为第一个索引,'1'作为第二个索引。

负数的索引从'-1'开始,表示序列中的最后一个索引,'-2'作为倒数第二个索引,序列像正数一样向前。

负数索引也可以用来非常方便的切片,比如:

s='abcdedf' 

print (s[1:-1]) 

>>bcded


NO. 7

类里面的new

和init的区别

new/init区别

说说__new__和__init__的区别

  • __init__为初始化方法,而__new__方法才是是真正的构造函数。只有继承了object的新式类才有__new__.

  • __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供,__new__必须要有返回值,返回实例化出来的实例。

  • __init__有一个参数self,就是这个__new__返回的实例, 先运行__new__ 然后才运行__init__.

  • __init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值.



NO. 8

Python中的

参数

*args和**kwargs

Python中的*args,**kwargs的用法

*args是可变参数,一般用来表示我们不能确定多少参数将被传递给函数,或者如果我们想用列表或元组的方式传递给函数.


**kwars是可变关键字参数,当我们不知道有多少关键字参数会传递给一个函数时,或者想把一个字典作为关键字参数时使用



注:*args和**kwargs可以同时在函数的定义中,但是*args必须在**kwargs前面.


思考题:Python中为啥没有重载函数,欢迎留言讨论!


尽管 Python 官方之前公布相应消息,会在 2020 年停止对 Python 2 的官方支持,但并未落实到具体日期。


最近 Python 之父 Guido van Rossum 在官方邮件组回复了对 Python 2.7 何时终结(EOL)的咨询。



Guido van Rossum 在回复表示:


Let's not play games with semantics. The way I see the situation for 2.7 is that EOL is January 1st, 2020, and there will be no updates, not even source-only security patches, after that date. Support (from the core devs, the PSF, and python.org) stops completely on that date. If you want support for 2.7 beyond that day you will have to pay a commercial vendor. Of course it's open source so people are also welcome to fork it. But the core devs have toiled long enough, and the 2020 EOL date (an extension from the originally annouced 2015 EOL!) was announced with sufficient lead time and fanfare that I don't feel bad about stopping to support it at all.


(大意如下):


好了,咱们不玩文字语义游戏了。Python 2.7 的 EOL 日期是 2020 年 1 月 1 日,之后不会有任何更新,源码的安全补丁也不会有了。


2020 年元旦之后,来自 Python 核心开发团队、PSF(Python 软件基金会)、Python.org 的支持,统统都停掉。


如果以后你想要对 2.7 的支持,你得给商业供应商掏钱了。当然了,因为 Python 是开源的,所以也欢迎大家来 fork。


官方核心开发团队已经努力工作够长的时间了,离 2020 年的 EOL 日期还有很长,(之前曾说过在 2015 年就终结),所以停止支持 Python 2,我完全没觉得有啥糟糕的。

2017 年宣布不再支持 Python 2 的软件/库有:

就在2017年 11 月 16 日,Numpy 库官方宣布准备放弃支持 Python 2。

12 月 2 日,Python Web 开发框架 Django 官网发文宣布推送 Django 2.0 版。在 Django 2.0 的发布说明中,最大吸引注意的内容就是兼容性。

  • Django 1.11.x 是支持 Python 2.7 的最后版本;

  • Django 2.0 支持 Python 3.4、3.5 和 3.6;

  • Django 2.0 对 Python 3.4 将于 2019 年 3 月结束支持,因此 Django 2.0 也将是最后一个支持 Python 3.4 的版本。


jango 2.0 的主要新特性包括:

简化 URL 路由语法

以前是这样写:

url(r'^articles/(?P<year>[0-9]{4})/$',views.year_archive),

现在可以这样:

path('articles/<int:year>/',views.year_archive),

移动友好的 contrib.admin

admin 将自适应主流移动设备。优雅性在老旧浏览器则可能会有打折咯。

新的 Window expressions

新 Window 表达式允许在查询集添加 OVER 从句。可以在表达式中使用 window 函数和 aggregate 函数。

Numpy 是 Python 的一个科学计算的库,提供了矩阵运算的功能,一般与 Scipy、matplotlib 一起使用。


今天 Numpy 的 GitHub 主页上发文称,Numpy 库准备从 2019 年 1 月 1 日起,放弃支持 Python 2。

「Python开发者」摘编如下:

Python 内核团队将于 2020 年停止支持 Python 2。NumPy 项目从 2010 年同时支持 Python 2 和 Python 3,我们发现自己有限资源无力再支持 Python 2 了。因此,我们也计划放弃支持 Python 2。

相应时间表如下:

  • 2018 年 12 月 31 日之前,所有 NumPy 发布版均同时支持Python 2 和 Python 3。

  • 从 2019 年 1 月 1 日起,NumPy 的新特性只支持 Python 3。

NumPy 的最后一个 Python 2 的版本,将被指定为一个长期支持版(LTS),意味着我们会长期持续合并 Bug 修复和制作 Bug 补丁。LTS 版将会支持到 2019 年 12 月 31 日。

从 2020 年 1 月 1 日起,NumPy 社区对 Python 2 的支持,就彻底说再见了。不过,PyPI 会继续支持 Python 2。如果有商业厂商希望在 2020 年 1 月 1 日后扩大 LTS 的支持,我们愿意让他们使用 NumPy 官方 repo 中的 LTS 分支。

想要获取更多学习资料

扫描右方二维码加入本群

关注菜鸟Python笔记公众号,与你分享更多Python有用的知识。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值