当前位置首页 > 电子工程/通信技术 > 考试/面试试题
搜柄,搜必应! 快速导航 | 使用教程  [会员中心]

python面试题100

文档格式:DOCX| 92 页|大小 236.49KB|积分 12|2021-10-14 发布|文档ID:32371496
第1页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 92
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • python面试题100Python语言特性1 Python的函数参数传递看两个如下例子,分析运行结果:代码一:def fun (a): fun(a) print(a) # 1代码二:a 二口def fun (a):a. append (1) fun(a)print(a) # [1]所有的变量都可以理解是内存中一个对象的“引用“,或者,也可以看似C中void* 的感觉这里记住的是类型是属于对象的,而不是变量而对象有两种,“可更改"(mutable) 与“不可更改"(immutable)对象在 python 中,strings, tuples,和 numbers 是不可更改的对象,而list,diet等则是可以修改的对象这就是这个问题的重点)当一个引用传递给函数的时候,函数自动复制T分引用,这个函数里的引用和外边的 引用没有半毛关系了,所以第一个例子里函数把引用指向了一个不可变对象,当函数 返回的时候,外面的引用没半毛感觉.而第二介例子就不一样了,函数内的引用指向的 是可变对象,对它的操作就和定位了指针地址一样,在内存里进行修改.2 Python 中的元类(metadass)元类就是用来创建类的“东西7你创建类就是为了创建类的实例对象,但是我们已 经学习到了 Python中的类也是对象。

    好吧,元类就是用来创建这些类(对象)的, 元类就是类的类这个非常的不常用,详情请看:《深刻理解Python中的元类(metadass)》3 @staticmethod f[]@classmethodPython其实有3个方法,即静态方法(staticmethod),类方法(classmethod)和实 例方法,如下: class A(object): def foo(self,x): print "executing foo(%s,%s)"%(self,x)@classmethod def class_foo(cls,x): print( "executing class_foo(%s,%s)%(ds,x))@staticmethod def static_foo(x): print ("executing static_foo( %s)"%x)a=A()这里先理解下函数参数里面的self和ds.这个self和cis是对类或者实例的绑定.对于实例方法>我们知道在类里每次定义方法的时候都需要绑定这个实例,就是 foo(self, x),为什么要这么做呢?因为实例方法的调用离不开实例,我们需要把实 例自己传给函数调用的时候是这样的a・fg(x)(其实是foo(a, x)).类方法一样, 只不过它传递的是类而不是实例,A.class.foo(x).注意这里的self和ds可以替换 别的参数但是python的约定是这俩,还是不要改的好•对于静态方法其实和普通的方法一样,不需要对谁进行绑定唯一的区别是调用的时 候需要使用3.51811(:_1:00(乂)或者八.5七31设_化0(乂)来调用.实例方法类方法静态方法a = AO a.foo(x)A 不可用a.classjoo(x)A.class_foo(x)a.static__foo(x)A.static_foo(x)4类变量和实例变量class Person: naine=naaaHpl=Person()p2=Person()pl.nanie=MbbbMprint(pl.name) # bbbprint(p2.name) # aaa print(Person.name) # aaa类变量就是供类使用的变量实例变量就是供实例使用的.这里pl.name=“bbb”是实例调用了类变量这其实和上面第一个问题一样,就是函数传参的问题Pl.name 一开始是指向的类变量namefaaa",但是在实例的作用域里 把类变量的引用改变了,就变成了一个实例变量self.name不再引用Person的类 变量name 了.可以看看下面的例子:class Person: nanie=[]pl=Person()p2=Person() pl.name. append ⑴ print(pl.name) # [1] print(p2.name) # [1] print(Person.name) # [1]5 Python 自省这个也是python彪悍的特性.自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型.简单一句就是 运行时能够获得对象的类型.比如typeO,dirO,getattrO,hasattrOJsinstanceO.6字典推导式可能你见过列表推导时,却没有见过字典推导式在2 7中才加入的:d = {key: value for (key, value) in iterable}7 Python中单下划线和双下划线1 > class MyClassO:2 ... def _init_(self):3 ... self._superprivate = "Hello”4 ... self._seniiprivate = ", world!115 •••6 > me = MyClassO7 > print(nic._superprivate)8 Traceback (most recent call last):9 File M,\ line 1, in 10 AttributeError: myClass instance has no attribute _superprivate,11 > print(nic._semiprivate)12 , world!13 > print me._diet_14 {_MyClass_superprivate1: HelloJ_semiprivate: \ world!,}_化。

    一种约定Python内部的名字,用来区别其他用户自定义的命名,以防冲突._f 一种约定用来指定变量私有.程序员用来指定私有变量的一种方式._f这个有真正的意义:解析器用_classname_fo来代替这个名字,以区别和其他类相同的命名・ 详情见:http://Vvww.N 549418字符串格式化:%和.「11131.format在许多方面看起来更便利.对于%最烦人的是它无法同时传递一个变量和元 组.你可能会想下面的代码不会有什么问题:Python:“hi there %U % name但曷如果name恰好是(1,2,3),它将会抛出一个TypeError异常.为了保证它总是 正确的,你必须这样做:"hi there %U % (name,) #提供一个单元素的数组而不是一个参数9迭代器和生成器在Python中,这种一边循环一边计算的机制, 称为生成器:generator可以被next函数调用并不断返回下一个值的对象称为迭代器:Iterator0这个是stackoverflow里python排名第一的问题,值得一看: word-do-in-python10 *args and **kwargs用*args和**kwargs只是为了方便并没有强制使用它们•当你不确定你的函数里将要传递多少参数时你可以用*a「gs.例如,它可以传递任意数量的参数:1 > def print_everything(*args):2 for count, thing in enunierate(args):3 ... print >{0}. {l}.forniat(count, thing)4...5 > print_everything(,apple*, vbanana\ rcabbage1)6 0. apple7 1. banana8 2. cabbage相似的,"kwargs允许你使用没有事先定义的参数名:1 > def table_things(**kwargs):2 ... for name, value in kwargs.items():3 ... print *{0} = {IJ.formattname, value)4...5 > table_things(apple = fruit, cabbage = * vegetable1)6 cabbage = vegetable7 apple = fruit你也可以混着用.命名参数首先获得参数值然后所有的其他参数都传递给*args和**kwargs.命名参数在列表的最前端.例如:1 def table_things(titlestring, **kwargs)*args和**1<\^「目5可以同时在函数的定义中,但是*args必须在**kwargs前面.当调用函数时你也可以用*和**语法.例如:1 > def print_three_things(a, b, c):2 ... print ,a = {()}, b = {1}, c = {2}9.format(a9b9c)3 •・♦4 > mylist =「aardvark: baboon, cat]5 > print_three_things(*mylist)67 a = aardvark, b = baboon, c = cat就像你看到的一样,它可以传递列表(或者元组)的每一项并把它们解包.注意必须与 它们在函数里的参数相吻合.当然,你也可以在函数定义或者函数调用时用*.11面向切面编程AOP和装饰器这个AOP 一听起来有点懵,同学面试的时候就被问懵了…装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插 入日志、性能测试、事务处理等。

    装饰器是解决这类问题的绝佳设计,有了装饰器, 我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用概括的 讲,装饰器的作用就是为已经存在的对象添加额外的功能这个问题比较大,推荐: of-function-decorators-in-python中文:http://taizilongxu.gitbooks.io/stackoverflow-about-python/content/3/README.html12鸭子类型“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就 可以被称为鸭子我们并不关心对象是什么类型,到底是不是鸭子,只关心行为比如在 python 中,有很多 file-like 的东西,比如 StringIO,GzipFile,socketo它们有很多相同的方法,我们把它们当作文件使用又比如Hst.extendO方法中,我们并不关心它的参数是不是list只要它是可迭代的, 所以它的参数可以是list/tuple/dict号符串/生成器等.鸭子类型在动态语言中经常使用,非常灵活,使得python不想java那样专门去 弄一大堆的设计模式13 Python中重载弓 I 自知乎:http://Vwvw.N函数重载主要是为了解决两个问题。

    1. 可变参数类型2. 可变参数个数另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外, 其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么 不应当使用重载,而应当使用一个名字不同的函数好吧,那么对于情况1 ,函数功能相同,但是参数类型不同,python如何处理? 答案是根本不需要处理,因为python可以接受任何类型的参数,如果函数的功能 相同,那么不同的参数类型在python中很可能是相同的代码,没有必要做成两个 不同函数那么对于情况2 ,函数功能相同,但参数个数不同,python如何处理?大家知道,答案就是缺省参数对那些缺少的参数设定为缺省参数即可解决问题因为你 假设函数功能相同,那么那些缺少的参数终归是需要用的好了,鉴于情况1跟情况2都有了解决方案,python自然就不需要函数重载 了14新式类和旧式类这个面试官问了,我说了老半天不知道他问的真正意图是什么.这篇文章很好的介绍了新式类的特性:http:/A tml 新式类很早在2.2就出现了,所以旧式类完全是兼容的问题,Python3里的类全部都 是新式类.这里有一个MR问题可以了解下(新式类是广度优先,旧式类是深度优 先)/Python核心编程>里讲的也很多.15 _new_和_init_的区别这个_new_确实很少见到,先做了解吧•L _new_是一个静态方法,而是一个实例方法.2. _new_方法会返回一个创建的实例,而什么都不返回•3. 只有在_new_返回一个Cis的实例时后面的才能被调用•4. 当创建一个新实例时调用一初始化一个实例时用一init一ps:_metaclass_是创建类时起作用.所以捌口可以分别使用_metaclass一_new_和_init_来分别在类创建实例创建和实例初始化的时 候做一些小手脚.16单例模式这个绝对常考啊.绝对要记住1~2个方法,当时面试官是让手写的.1使用_new_方法class Singleton(object):def _new_(cis, *args, **kw):if not hasattr(c】s, [instance): orig = super(Singleton, cis) cls._iiistance = orig._new_(cis, *args, **kw)return cls._instanceclass MyClass(Singleton):a = 12共享属性创建实例时把所有实例的指向同一个字电这样它们具有相同的属性和方 法.1 class Borg(object):2 .state = {}3 def _new_(cis, *args, **kw):4 ob = super(Borg, cis)._new_(cis,左args, **kw)5 ob._diet_ = cls._state6 return ob78 class MyClass2(Borg):9 a = l12345678910113装饰器版本def singleton(cls, *args9 **kw):instances = {}def getinstanceO:if cis not in instances:instances[cls] = cls(*args, **kw) return instances[cls]return getinstance @singletonclass MyClass:4 import 方法作为python的模块是天然的单例模式# mysingleton.pyclass My_Singleton(object):def foo(self):passmy_singleton = My_Singleton()# to usefrom mysingleton import my_singletonmy_singleton.foo()17 Python中的作用域Python中,一个变量的作用域总是由在代码中被赋值的地方所决定的。

    当Python遇到一个变量的话他会按照这样的顺序进行搜索:本地作用域(Local) 一当前作用域破嵌入的本地作用域(Enclosing locals) 一全局/模块作用域(Global) 一内置作用域(Built-in )18 GIL线程全局锁线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程・解决办法就是多进程和下面的协程(协程也只是单CPU,但是能减小切换代价提升性能)•19协程 简单点说协程是进程和线程的升级版进程和线程都面临着内核态和用户态的切换 问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统 的内核态.Python里最常见的yield就是协程的思想!可以查看第九个问题.20闭包闭包(closure)是函数式编程的重要的语法结构闭包也是一种组织代码的结构,它 同样提高了代码的可重复使用性当一个内嵌函数引用其外部作作用域的变量,我们就会得到一个闭包•总结一下,创 建一个闭包必须满足以下几点:1. 必须有一个内嵌函数2. 内嵌函数必须引用外部函数中的变量3. 外部函数的返回值必须是内嵌函数感觉闭包还是有难度的,几句话是说不明白的,还是查查相关资料.重点是函数运行后并不会被撤销,就像16题的instance字典一样,当函数运行完 后,instance并不被销毁,而是继续留在内存空间里.这个功能类似类里的类变量,只 不过迁移到了函数上.闭包就像个空心球一样,你知道外面和里面,但你不知道中间是什么样.21 lambda 函数其实就是一个匿名函数为什么叫lambda?因为和后面的函数式编程有关.22 Python函数式编程这个需要适当的了解一下吧,毕竟函数式编程在Python中也做了引用.python中函数式编程支持:filter函数的功能相当于过滤器。

    调用一个布尔函数booi^func来迭代遍历每个 seq中的元素;返回一个使booi-seq返回值为true的元素的序列>a = [123,4,567]>b = filter(lambda x: x > 5, a)>print b>>>67]map函数是对一个序列的每个项依次执行函数,下面是对一个序列每个项都乘以2 :> a = map(lambda x:x*2,[l^,3])> list(a)[2,4,6]reduce函数是对一个序列的每个项迭代调用函数,下面是求3的阶乘:> reduce(lambda x,y:x*y,range(l,4)) 623 Python里的拷贝弓I用和copyO.deepcopyO的区别1 import copy2 a = [l,2,3,4,[a*,b*]] #原始对象34 b = a #赋值,传对象的引用5 c = copy.copy(a) #对象拷贝,浅拷贝6 d =copy.deepcopy(a) #对象拷贝,深拷贝78 a.append(S) #修改对象 a9 a[4].appendCc,) #修改对象a中的[宣,E]数组对象1011 print *a = \ a12 print *b = \ b13 print = \ c14 print *d = \ d1516输出结果:17 a = [L2,3,4Ja,b「c15]18 b= [l,2,3,4,ra,b,c],5]19c= [l,2,3,4,[*a*,b; c*]]20 d= [L2,3,4Ja,b]]24 Python垃圾回收机制Python GC主要使用引用计数(reference counting )来跟踪和回收垃圾。

    在引 用计数的基础上,通过“标记-清除"(mark and sweep )解决容器对象可能产 生的循环引用问题,通过“分代回收"(generation collection )以空间换时间 的方法提高垃圾回收效率1引用计数PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数当一个对象有新的引用时,它的就会增加,当引用它的对象被删除,它的□b.refcnt就会减少.引用计数为0时,该对象生命就结束了优点:1 .简单2 . 实时性缺点:1. 维护引用计数消耗斐源2. 循环引用2标记•清除机制基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发, 遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然 后清扫一遍内存空间,把所有没标记的对象程放3分代技术分代回收的整体思想是:将系统中的所有内存块根据其存活时间划分为不同的集合, 每个集合就成为一个“代”,垃圾收集频率随着“代”的存活时间的增大而减小, 存活时间通常利用经过几次垃圾回收来度量Python默认定义了三代对象集合,索引数越大,对象存活时间越长举例:当某些内存块M经过了 3次垃圾收集的清洗之后还存活时,我们就将内存块M划 到一个集合A中去,而新分配的内存都划分到集合B中去。

    当垃圾收集开始工作时, 大多数情况都只对集合B进行垃圾回收,而对集合A进行垃圾回收要隔相当长一段 时间后才进行,这就使得垃圾收集机制需要处理的内存少了,效率自然就提高了在这个过程中,集合B中的某些内存块由于存活时间长而会被转移到集合A中,当 然,集合A中实际上也存在一些垃圾,这些垃圾的回收会因为这种分代的机制而被 延迟25 Python里面如何实现tuple和list的转换?: tuple,可以说是不可变的他t,访问方式还是通过索引下标的方式当你明确定义个仅p/e是,如果仅有一个元素,必须带有,例如:(九)当然,在2.7以后的版,pg仍八里还增加了命名式的Wp/e!至于有什么用,首先第一点,楼主玩过python都知道,阳th八的函数可以有多返回仇的,而python 里,多返回值,就是用仅p/e来表示,这是用的最广的了,比如说,你需要定义一个常量的列表,但你又不想使用那也可以是要你管协,e,例如: if a M CABDpass26 Python 的 isis是对比地址==是对比值27 read,readline 和 readlinesread读取整个文件• readline读取下一行,使用生成器方法・ readlines读取整个文件到一个迭代器以供我们遍历28 Python2和3的区别大部分Python库都同时支持Python 2.7.x和3.x版本的,所以不论选择哪个版 本都是可以的。

    但为了在使用Python时避开某些版本中一些常见的陷阱,或需要 移植某个Python项目使用_future_模块print函数整数除法Unicodexrange触发异常处理异常next函数和.next方法For循环变量与全局命名空间泄漏比较无序类型 使用input解析输入内容 返回可迭代对象,而不是列表推荐:《Python 2.7.x和3.x版本的重要区别》29到底什么是Python ?你可以在回答中与其他技术进行对比答案下面是一些关键点:• Python是一种解释型语言这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需要编译其他解释型语言还包括PHP和Ruby• Python是动态类型语言,指的是你在声明变量时,不需要说明变量的类型你可以直接编写类似x=lll和x=Tm a string”这样的代码,程序不会报错Python非常适合面向对象的编程(OOP ),因为它支持通过组合(composition )与继承(inheritance )的方式定义类(class ) 0 Python中没有访问说明符(access spe Cifier,类似C++中的public和private),这么设计的依据是“大家都是成年人了”。

    • 在python语言中,函数是第一类对象(first-class objects )这指的是它们可以被 指定给变量,函数既能返回函数类型,也可以接受函数作为输入类(class )也是第一类 对象• Python代码编写快,但是运行速度比编译语言通常要慢好在Python允许加入基于c语言编写的扩展,因此我们能够优化代码,消除瓶颈,这点通常是可以实现的nump y就是一个很好地例子,它的运行速度真的非常快,因为很多算术运算其实并不是通过Py thon实现的• Python用途非常广泛一网络应用,自动化,科学建模,大数据应用,等等它也常被用作“胶水语言",帮助其他语言和组件改善运行状况• Python让困难的事情变得容易,因此程序员可以专注于算法和数据结构的设计,而不 用处理底层的细节为什么提这个问题:如果你应聘的是一个Python开发词位,你就应该知道这是门什么样的语言,以及它为什么这 么酷以及它哪里不好30补充缺失的代码def pnnt_directory_contents(sPath):这个函数接受文件夹的名称作为输入参数,返回该文件夹中文件的路径,以及其包含文件夹中文件的路径Hint#补充代码答案def pnnt_directory_contents(sPath):import osfor sChild in os.listdir(sPath):sChildPath = os.path.join(sPathrsChild)if os.path.isdir(sChildPath):print_directory_contents(sChildPath)else:print sChildPath特别要注意以下几点:命名规范要统一。

    如果样本代码中能够看出命名规范,遵循其已有的规范• 递归函数需要递归并终止确保你明白其中的原理,否则你将面临无休无止的调用栈(Callstack)• 我IiJ使用os模块与操作系统进行交互,同时做到交互方式是可以跨平台的你可以把代码写成sChildPath = sPath + / + sChild ,但是这个在Windows系统上会出错• 熟悉基础模块是非常有价值的,但是别想破脑袋都背下来,记住Google是你工作中的艮师益友• 如果你不明白代码的预期功能,就大胆提问• 蚂寺KISS原则!保持简单,不过脑子就能懂!为什么提这个问题:• 说明面试者对与操作系统交互的基础知识• 递归真是太好用啦31阅读下面的代码,写出AO , A1至An的最终值AO = dict(zip(Ca7bfc/d7e,),(l,2,3,4,5)))Al = range(lO)A2 = [i for i in Al if i in AO]A3 = [AO[s] for s in AO]A4 = [i for i in Al if i in A3]AS = {i:i*i for i in Al)A6 = [[i,i*i] for i in Al]答案AO = {a: 1, c: 3,,: 2, e: 5, d1: 4)Al = [0,1, 2, 3, 4, 5, 6,7, 8, 9]A2 = []A3 = [1, 3, 2, 5, 4]A4 = [1, 2. 3, 4r 5]A5 = {0: Q, 1:1, 2: 4, 3: 9, 4:16, 5: 25, 6: 36,7:49, 8: 64, 9: 81]A6 = [[0, 0]r [1, 1]. [2, 4], [3, 9], [4, 16]r [5, 25], [6, 36], [7, 49], [8, 64], ⑶ 81]]为什么提这个问题:• 列表解析(list comprehension )十分节约时间,对很多人来说也是一个大的学习瞳碍。

    • 如果你读懂了这些代码,就很可能可以写下正确地值其中部分代码故意写的怪怪的因为你共事的人之中也会有怪人32下面代码会输出什么:def f(xj=[]):for i in range(x):l.append(i*i)print(l)f(2)f(3f[3f2,l])f⑶答案:[0f 1][3, 2, L 0f lf 4][Of lf Of lf 4]呃? 第一个函数调用十分明显,for循环先后将0和1添加至了空列表I中I是变量的名字,指向内 存中存储的一个列表第二个函数调用在一块新 的内存中创建了新的列表I这时指向了新生成 的列表之后再往新列表中添加o. 1和4彳;棒吧第三个函数调用的结果就有些奇怪了它 使用了之前内存地址中存储的旧列表这就是为 什么它的前两个元素是33你如何管理不同版本的代码?答案: 版本管理!被问到这个问题的时候,你应该要表现得很兴奋,甚至告诉他们你是如何使用Git(或 是其他你最喜欢的工具)追踪自己和奶奶的书信往来我偏向于使用Git作为版本控制系统(VC5 ),但还有其他的选择,比如subversion ( SVN ) 0为什么提这个问题:因为没有版本控制的代码,就像没有杯子的咖啡。

    有时候我们需要写一些一次性的、可以随手扔 掉的脚本,这种情况下不作版本控制没关系但是如果你面对的是大量的代码,使用版本控制系 统是有利的版本控制能够帮你追踪谁对代码库做了什么操作;发现新引入了什么bug ;管理 你的软件的不同版本和发行版;在团队成员中分享源代码;部署及其他自动化处理它能让你回 滚到出现问题之前的版本,单凭这点就特别棒了还有其他的好功能怎么一个棒字了得!34 〃猴子补丁“( monkey patching脂的是什么? 这种做法好吗?答案:“猴子补丁”就是指,在函数或对象已经定义之后,再去改变它们的行为举个例子:import datetimedatetime.datetime.now = lambda: datetime.datetime(2012, 12, 12)大部分情况下,这是种很不好的做法・因为函数在代码库中的行为最好是都保持一致打“猴 子补丁”的原因可能是为了测试mock包对实现这个目的很有帮助为什么提这个问题? 答对这个问题说明你对单元测试的方法有一定了解你如果提到要避免“猴子补丁",可以说明 你不是那种喜欢花里胡哨代码的程序员(公司里就有这种人,跟他们共事真是糟糕透了),而是 更注重可维护性。

    还记得KISS原则码?答对这个问题还说明你明白一些Python底层运作的方 式,函数实际是如何存储、调用等等另外:如果你没读过mock模块的话,真的值得花时间读一读这个模块非常有用35阅读下面的代码,它的输出结果是什么?class A(object):def go(self):print "go A go!"def stop(self):print "stop A stop!"def pause(self):raise ExceptionCNot Implemented11)class B(A):def go(self):super(Bf self).goOprint "go B go!"class C(A):def go(self):super(C self).goOprint "go C go!"def stop(self):super(C self).stopOprint "stop C stop!"class D(B,C):def go(self):super(D, self).goOprint "go D go!"def stop(self):super(Df self).stopOprint "stop D stop111def pause(self):print "wait Dwaitfclass E(BfC): passa = AOb = B0c = C0d = D0e = EO*说明下列代码的输出结果a.goOb.goOc.goQd.goOe.goOa.stopOb.stopOc.stopOd.stopOe.stopOa.pauseOb.pauseOc.pauseOd.pauseOe.pauseO兹去口木输出结果以注释的形式表示:# go A go!b.goO# go A go!# g。

    B go!c.goO# go A go!# go C go!d.goO# go A go!# go C go!# gB go!# go D go*e.goQ# go A go!# go C go!# go B go!a.stopO# stop A stop!b.stopO* stop A stop!c.stopO# stop A stop!# stop C stop!d.stopO# stop A stop!* stop C stop!# stop D stop!e.stopO# stop A stop!a.pauseOException: Not Implementedb.pauseO# ... Exception: Not ImplementedcpauseOException: Not Implementedd.pauseQ # wait D wait!e.pauseO# ...Exception: Not Implemented为什么提这个问题?因为面向对象的编程真的真的很重要答对这道问题说明你理解了继承和Python中 super函数的用法36阅读下面的代码,它的输出结果是什么?class Node(object):def _init_(selfr sN a me):self.JChildren =[]self.sName = sNamedef _repr_(self):return"".format(self.sName)def append(self,*args,**kwargs):self.JChildren.append(*argsf**kwargs)def print_all_l(self):print selffor oChild in self. IChildren:oChild.prir>t_alL10def print_all_2(self):def gen(o):IAII = [o,]while IAII:oNext = lAll.pop(O)lAll.extend(oNext.JChildren)yield oNextfor oNode in gen(self):print oNodeoRoot = NodeCroot")oChildl = NodeCchildl")oChild2 = NodeCchild2")oChild3 = NodeCchildS")oChildS = NodeCchildB")oChild6 = NodeCchildG")oChild7 = NodeCchild7")oChild8 = NodeCchild8")oChild9 = NodeCchild9")oChildlO = NodeCchildlO")oRoot.append(oChildl)oRoot.append(oChild2)oRoot.append(oChild3)oChildl.append(oChild4)oChildl.append(oChild5)oChild2.append(oChild6)oChild4.append(oChild7)oChild3.append(oChild8)oChild3.append(oChild9)oChild6.append(oChildlO)*说明下面代码的输出结果oRoot.print_all_10oRoot.print_all_20答案oRoot.print_alL:LO会打印下面的结果:vNode root〉 oRoot.print_aHJLO会打印下面的结果:为什么提这个问题?因为对象的精髓就在于组合(composition )与对象构造(object construction ) o对象需要有组合成分构成,而且得以某种方式初始化。

    这里也涉及到递归和生成器(generator )的使 生成器是很棒的数据类型你可以只通过构造一个很长的列表,然后打印列表的内容,就可以取 得与print_all_2类似的功能生成器还有一个好处,就是不用占据很多内存有一点还值得指出,就是print_all_l会以深度优先(depth-first)的方式遍历树(tree),而 print_all_2则是定度优先(width-first)有时候,一种遍历方式比另一种更合适但这要 看你的应用的具体情况36 .介绍一下except的用法和作用?答:try... except... except... [else... ] [finaIly...]执行try下的语句,如果引发异常,则执行过程会跳到except语句对每个 except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行 相应的语句如果所有的except都不匹配,则异常会传递到下一个调用本代码 的最高层try代码中try下的语句正常执行,则执行else块代码如果发生异常,就不会执行如果存在finally语句,最后总是会执行37 . Python中pass语句的作用是什么?答:pass语句不会执行任何操作,一般作为占位符或者创建占位程序,whileFalse:pass38 .介绍一下Python下range ()函数的用法?答:列出一组数据,经常用在for in range。

    循环中39 .如何用Python来进行查询和替换一个文本字符 串?答:可以使用re模块中的sub函数或者subnO函数来进行查询和替换,格式:sub(replacement string[rcount=0]) ( replacement 替换成的 文本,string是需要被替换的文本,count是一个可选参数,指最大被替换的 数量)>>> import re>>>p=pile( /blue|white|red,)>>>print(p.sub( colour /blue socks and red shoesr ))colour socks and colourshoes>>>prirrt(p.sub( colour /blue socks and red shoesr ,count=1))colour socks and redshoessubnO方法执行的效果跟sub一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量40. Python 里面 match ()和 search ()的区别?答:re 模块中 match(pattern,string[Jlags]),检查 string 的开头是否与 pattern 匹配。

    re 模块中 research(patternrstring[fflags])fg string 搜索 pattern 的第一个匹配值> > > print(re.match( "super",superstition J.spanQ)(0, 5)> > > print(re.match( "super",insuperable))None> > > print(re.search( super’,superstition ).spanQ)(0, 5)> > > print(re.search( "super",insuperable ).spanQ)(2,7)41.用Python匹配HTML tag的时候,<.*>和<.*?>有 什么区别?答:术语叫贪婪匹配(< *> )和非贪婪匹配(<.*?> )例如:test<.*> :test<.*?> :42 . Python里面如何生成随机数?答:random模块随机整数:random.randint(a,b):返回随机整数x,av=xv=brandom.randrange(startstop,[fstep]):返回一个范围在(start,stop,step) 之间的随机整数,不包括结束值。

    随机实数:random.random():返回到1之间的浮点数random.uniform(a,b):返回指定范围内的浮点数43 .有没有一个工具可以帮助查找python的bug和进行静态的代码分析?答:PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug,会对代码的复杂度和格式提出警告Pylint是另外一个工具可以进行codingstandard检查44 .如何在一个function里面设置一个全局的变量?答:解决方法是在function的开始插入一个global声明:def f()global x45 .单引号,双引号,三引号的区别答:单引号和双引号是等效的,如果要换行,需要符号三引号则可以直接换行,并且可以包含注释如果要表示Let s go这个字符串单引号:s4= LetV sg’双引号:s5= "Let sgs6 = I realy like "python” !这就是单引号和双引号都可以表示字符串的原因了46 Python 和多线程(multi-threading)这是个好主意码?列举一些让Python代码以并行方式运行的方法答案Python并不支持真正意义上的多线程。

    Python中提供了多线程包,但是如果 你想通过多线褂1高代码的速度,使用多线程包并不是个好主意Python中有 一个被称为Global Interpreter Lock ( GIL)的东西,它会确保任何时候你的 多个线程中,只有一个被执行线程的执行速度非常之快,会让你误以为线程是 并行执行的,但是实际上都是轮流执行经过GIL这一道关卡处理,会增加执 行的开销这意味着,如果你想提高代码的运行速度,使用threading包并不 是一个很好的方法不过还是有很多理由促使我们使用threading包的如果你想同时执行一些任 务,而且不考虑效率问题,那么使用这个包是完全没问题的,而且也很方便但 是大部分情况下,并不是这么一回事,你会希望把多线程的部分外包给操作系统 完成(通过开启多个进程),或者是某些调用你的Python代码的外音解序(例 如Spark或Hadoop ),又或者是你的Python代码调用的其他代码(例如, 你可以在Python中调用C函数,用于处理开销较大的多线程工作X为什么提这个问题因为GIL就是个混账东西(A-hole 1很多人花费大量的时间,试图寻找自己多线程代码中的瓶颈,直到他们明白GIL的存在。

    47将下面的函数按照执行效率高低排序它们都接受由至1之间的数字构成的列表作为输入这个列表可以很长一 个输入列表的示例如下:[random.randomO for i in range(100000)]o 你如 何证明自己的答案是正确的def fl(IIn):11 = sorted(IIn)12 = [i for i in 11 if i<0.5]return [i*i for i in 12] def f2(IIn):13 = [i for i in Iln if i<0.5]14 = sorted(ll)return [i*i for i in 12]def f3(IIn):11 = [i*i for i in Iln]12 = sorted(ll)return [i for i in 11 if i< (0.5*0.5)]答案按执行效率从高到低排列:f2, fl和f3要证明这个答案是对的,你应该知道 如何分析自己代码的性能Python中有一个很好的程序分析包,可以满足这个 需求import cProfileIln = [random.randomO for i in range(lOOOOO)]cProfile.runCfl(IIn),)cProfile.runCf2(IIn),)cProfile.runCf3(IIn),)为了向大家进行完整地说明,下面我们给出上述分析代码的输出结果:>>> eProfile.run(fl(IIn),)4 function calls in 0.045 sec。

    点击阅读更多内容
    卖家[上传人]:靓仔靓仔
    资质:实名认证