职场经验之15个你必须知道的Python面试题Word文档下载推荐.docx

上传人:b****3 文档编号:16360718 上传时间:2022-11-23 格式:DOCX 页数:24 大小:392.37KB
下载 相关 举报
职场经验之15个你必须知道的Python面试题Word文档下载推荐.docx_第1页
第1页 / 共24页
职场经验之15个你必须知道的Python面试题Word文档下载推荐.docx_第2页
第2页 / 共24页
职场经验之15个你必须知道的Python面试题Word文档下载推荐.docx_第3页
第3页 / 共24页
职场经验之15个你必须知道的Python面试题Word文档下载推荐.docx_第4页
第4页 / 共24页
职场经验之15个你必须知道的Python面试题Word文档下载推荐.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

职场经验之15个你必须知道的Python面试题Word文档下载推荐.docx

《职场经验之15个你必须知道的Python面试题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《职场经验之15个你必须知道的Python面试题Word文档下载推荐.docx(24页珍藏版)》请在冰豆网上搜索。

职场经验之15个你必须知道的Python面试题Word文档下载推荐.docx

其他解释语言包括PHP和Ruby。

∙Python是动态类型的,这意味着当你声明变量或类似的变量时,你不需要声明变量的类型。

你可以做先一些事情如:

x=111,然后再将x="

I'

mastring"

这样并没有错误

∙Python非常适合面向对象的编程,因为它允许类的定义以及组合和继承。

Python没有访问修饰符(如C++的public,private),对于这一点的理由是因为‘我们都是成年人’

∙在Python中,函数也是一个类对象。

这意味着可以将它们分配给变量,从其他函数返回并传递给函数。

类也是一个类对象

∙编写Python代码可以很快,但运行它通常比编译语言慢。

但幸运的是,Python允许包含基于C的扩展,因此瓶颈可以被优化掉并且可以经常被优化。

这个numpy包就是一个很好的例子,它真的非常快,因为它处理的很多数字运算实际上并不是由Python完成的

∙Python可用于许多领域-Web应用程序,自动化,科学建模,大数据应用程序等等。

它也经常被用作“粘合”代码,以使其他语言和组件发挥得很好。

∙Python使得困难的事情变得容易,因此程序员可以专注于重写算法和结构,而不是关注底层的低级细节。

为什么这很重要:

如果你正在申请的是Python职位,你应该知道它是什么以及为什么它如此酷。

问题2

填写遗漏的代码:

defprint_directory_contents(sPath):

"

这个函数接受一个目录的名称

并且打印该目录中的路径文件

包含目录以及目录中的任何文件

这个函数类似于os.walk。

但是请不要使用这个模块系统。

输入你的答案

我们对你使用嵌套结构的能力很感兴趣

fill_this_in

importos

forsChildinos.listdir(sPath):

sChildPath=os.path.join(sPathsChild)

ifos.path.isdir(sChildPath):

print_directory_contents(sChildPath)

else:

print(sChildPath)

特别注意

∙与你的命名约定保持一致。

如果在任何示例代码中都有明显的命名约定,请坚持下去。

即使它不是你通常使用的命名约定

∙递归函数需要递归和终止。

确认你真的了解这是如何发生的,这样你就可以避免无底的调用堆栈

∙我们使用该os模块以跨平台的方式与操作系统进行交互。

你可以说,sChildPath=sPath+'

/'

+sChild但这不适用于Windows

∙熟悉基本的软件包是非常值得的,但是不要为了记住所有的东西而头痛,XXor谷歌是你在工作中遇到需要包的问题的时候的朋友!

∙如果你不理解代码应该做什么,请提出问题

∙保持简单,笨蛋!

∙显示你的基本操作系统交互内容方面的知识

∙递归是非常有用的

问题3

查看下面的代码,写下A0,A1,...An的最终值。

A0=dict(zip(('

a'

'

b'

c'

d'

e'

)(12345)))

A1=range(10)

A2=sorted([iforiinA1ifiinA0])

A3=sorted([A0[s]forsinA0])

A4=[iforiinA1ifiinA3]

A5={i:

i*iforiinA1}

A6=[[ii*i]foriinA1]

如果你不知道什么是zip那么不用紧张。

没有一个理智的雇主会要求你熟记标准库。

这是help(zip)的输出。

zip(...)

zip(seq1[seq2[...]])->

[(seq1[0]seq2[0]...)(...)]

Returnalistoftupleswhereeachtuplecontainsthei-thelement

fromeachoftheargumentsequences.Thereturnedlististruncated

inlengthtothelengthoftheshortestargumentsequence.

如果这没有任何意义,那么就请你花几分钟去想清楚你要选择的方式。

A0={'

:

1'

3'

2'

5'

4}#theordermayvary

A1=range(010)#or[0123456789]inpython2

A2=[]

A3=[12345]

A4=[12345]

A5={0:

01:

12:

43:

94:

165:

256:

367:

498:

649:

81}

A6=[[00][11][24][39][416][525][636][749][864][981]]

为什么这很重要

1.对于很多人来说,理解列表是一个很好的节省时间的方法,当然也是一个巨大的绊脚石

2.如果你能读懂它们,那么你也可以写下来

3.这些代码中的一部分是故意设计的很奇怪的。

因为你可能需要在工作中与一些奇怪的人合作

问题4

多线程使用Python。

这是个好主意吗?

列出一些方法可以让一些Python代码以并行方式运行。

Python不允许真正意义上的多线程。

它有一个多线程包,但如果你想使用多线程来加速你的代码,那么使用它通常不是一个好主意。

Python有一个名为全局解释器锁(GlobalInterpreterLock(GIL))的结构。

GIL确保每次只能执行一个“线程”。

一个线程获取GIL,做一点工作,然后将GIL传递到下一个线程。

这种情况发生的很快,因此对于人眼看来,你的线程似乎是并行运行的,但它们实际上只是轮流使用相同的CPU核心。

所有这些GIL传递都增加了运行的内存。

这意味着如果你想让代码运行得更快,那么使用线程包通常不是一个好主意。

使用Python的线程包也是有原因的。

如果你想同时运行一些东西,并且效率不是一个问题,那么它就完全没问题了。

或者,如果你正在运行需要等待某些事情的代码(例如某些IO),那么它可能会很有意义。

但是线程库不会让你使用额外的CPU核心。

多线程可以外包到操作系统(通过多处理),一些调用Python代码的外部应用程序(例如,Spark或Hadoop),或者Python代码调用的一些代码例如:

你可以使用你的Python代码调用一个C函数来完成昂贵的多线程事务。

因为GIL是一个A-hole。

在学习GIL之前,很多人花了很多的时间在他们的Python多线程中遇到了瓶颈。

问题5

如何跟踪代码的不同版本?

回答:

版本控制!

此时,你应该表现的非常兴奋,并告诉他们你如何使用Git(或任何你最喜欢的)来跟踪与Granny的通信。

Git是我首选的版本控制系统,但还有其他版本控制系统,例如subversion。

因为没有版本控制的代码就像没有杯子的咖啡。

有时我们需要编写一次性丢弃的脚本,这没关系,但是如果你正在处理大量的代码,版本控制系统将是一个优势。

版本控制有助于跟踪谁对代码库进行了哪些更改;

找出Bug是什么时候引入代码的;

跟踪软件的版本和发布版本;

在团队成员之间分发源代码;

部署和某些自动化。

它允许你在破坏代码之前将代码转回到自己的代码之上。

等等很多东西。

这太棒了。

问题6

这段代码输出了什么:

deff(xl=[]):

foriinrange(x):

l.append(i*i)

print(l)

f

(2)

f(3[321])

f(3)

[01]

[321014]

[01014]

为什么重要?

第一个函数调用应该相当明显,循环将0和1附加到空列表中l.l是指向存储在内存中的列表的变量的名称。

第二个调用通过在新的内存块中创建新列表开始。

l然后指向这个新列表。

然后它将01和4附加到这个新列表中。

这太好了。

第三个函数调用是奇怪的。

它使用存储在原始内存块中的原始列表。

这就是它从0和1开始的原因。

如果你不明白,试试这个:

l_mem=[]

l=l_mem#thefirstcall

foriinrange

(2):

print(l)#[01]

l=[321]#thesecondcall

foriinrange(3):

print(l)#[321014]

l=l_mem#thethirdcall

print(l)#[01014]

问题7

什么是猴子补丁?

,这是个好主意吗?

猴子补丁是在定义函数或对象已经定义后进行更改的行为。

例如:

importdatetime

datetime.datetime.now=lambda:

datetime.datetime(20121212)

大多数时候,这是一个非常糟糕的想法-如果事情以明确的方式运行,通常是最好的。

猴子补丁的一个原因是测试。

该模拟包对此还是非常有用的。

它表明你对单元测试中的方法有所了解。

你提到避免使用猴子补丁会表明你不是那些喜欢花哨的代码而不喜欢可维护代码的程序员(他们就在那里,而且合作起来会非常糟糕)。

它表明你对Python如何在较低层次上工作,如何实际存储和调用函数等有所了解。

问题8

这是什么东西的意思是:

*args,**kwargs?

我们为什么要用它呢?

当我们不确定要向函数传递多少参数时,或者我们想向函数传递已存储的列表或参数元组时使用*args。

**kwargs用于当我们不知道将多少关键字参数传递给函数时,或者它可以用用于关键字参数传递字典的值。

标识符args和kwargs是一种约定,你也可以使用*bob,**billy但这不是明智的。

这是一个小示例:

deff(*args**kwargs):

print(argskwargs)

l=[123]

t=(456)

d={'

7'

8'

9}

f()

f(123)#(123){}

f(123"

groovy"

)#(123'

groovy'

){}

f(a=1b=2c=3)#(){'

2}

f(a=1b=2c=3zzz="

hi"

)#(){'

zzz'

'

hi'

}

f(123a=1b=2c=3)#(123){'

f(*l**d)#(123){'

7'

9'

8}

f(*t**d)#(456){'

f(12*t)#(12456){}

f(q="

winning"

**d)#(){'

q'

winning'

f(12*tq="

**d)#(12456){'

deff2(arg1arg2*args**kwargs):

print(arg1arg2argskwargs)

f2(123)#12(3){}

f2(123"

)#12(3'

f2(arg1=1arg2=2c=3)#12(){'

3}

f2(arg1=1arg2=2c=3zzz="

)#12(){'

f2(123a=1b=2c=3)#12(3){'

f2(*l**d)#12(3){'

f2(*t**d)#45(6){'

f2(12*t)#12(456){}

f2(11q="

**d)#11(){'

f2(12*tq="

**d)#12(456){'

为什么关心?

有时我们需要将未知数量的参数或关键字参数传递给函数。

有时我们会想要存储参数或关键字参数供以后使用。

有时它只是节省时间。

问题9

这些对你来说意味着:

@classmethod,@staticmethod,@property?

回答背景知识

这些是装饰者。

装饰器是一种特殊的函数,它既可以获取函数并可以返回一个函数,或者获取一个类并返回一个类。

该@符号只是语法糖,允许你以一种易于阅读的方式装饰一些东西。

@my_decorator

defmy_func(stuff):

do_things

相当于

my_func=my_decorator(my_func)

实际答案

装饰器@classmethod,@staticmethod和@property是在类中定义的函数的时候使用。

以下是他们的行为方式:

classMyClass(obxxxxject):

def__init__(self):

self._some_property="

propertiesarenice"

self._some_other_property="

VERYnice"

defnormal_method(*args**kwargs):

print("

callingnormal_method({0}{1})"

.format(argskwargs))

@classmethod

defclass_method(*args**kwargs):

callingclass_method({0}{1})"

@staticmethod

defstatic_method(*args**kwargs):

callingstatic_method({0}{1})"

@property

defsome_property(self*args**kwargs):

callingsome_propertygetter({0}{1}{2})"

.format(selfargskwargs))

returnself._some_property

@some_property.setter

callingsome_propertysetter({0}{1}{2})"

self._some_property=args[0]

defsome_other_property(self*args**kwargs):

callingsome_other_propertygetter({0}{1}{2})"

returnself._some_other_property

o=MyClass()

#未修饰方法的工作原理与普通方法一样,它们将当前实例(self)作为第一个参数

o.normal_method

#<

boundmethodMyClass.normal_methodof<

__main__.MyClassinstanceat0x7fdd2537ea28>

>

o.normal_method()

#normal_method((<

){})

o.normal_method(12x=3y=4)

12){'

y'

4'

x'

3})

#classmethodsalwaysgettheclassasthefirstargument

o.class_method

boundmethodclassobj.class_methodof<

class__main__.MyClassat0x7fdd2536a390>

o.class_method()

#class_method((<

o.class_method(12x=3y=4)

#staticmethodshavenoargumentsexcepttheonesyoupassinwhenyoucallthem

o.static_method

functionstatic_methodat0x7fdd25375848>

o.static_method()

#static_method((){})

o.static_method(12x=3y=4)

#static_method((12){'

#propertiesareawayofimplementinggettersandsetters.It'

sanerrortoexplicitlycallthem

#"

readonly"

attributescanbespecifiedbycreatingagetterwithoutasetter(asinsome_other_property)

o.some_property

#callingsome_propertygetter(<

__main__.MyClassinstanceat0x7fb2b70877e8>

(){})

#'

propertiesarenice'

o.some_property()

#Traceback(mostrecentcalllast):

#File"

<

stdin>

line1in<

module>

#TypeError:

str'

obxxxxjectisnotcallable

o.some_other_property

#callingsome_other_propertygetter(<

VERYnice'

#o.some_other_property()

#TypeE

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 公务员考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1