linux及Python语法面试题.pdf

所需积分/C币:9 2019-08-20 20:49:40 565KB PDF
11
收藏 收藏
举报

linux及Python语法面试题 pdf
def foo o print( i am foo ") foo o sleep (2) food 5.谈谈你对同步异步阻塞非阻塞理解 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该 调用就不返回。按照这个定义,其实绝大多数函数都同步调用(例一 如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候, 特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的 例子就是 Send Mes sage。该函数发送一个消息给某个窗口,在对方处 理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把 消息处理函数所返回的 LRESULT值返回给调用者。 异步的概念和同步相对。当一个异步过程调用发出后,调用者不能 立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知 利回调来通知调用者。以 CASVeSocket类为例(注意, CSocket从 CAsyncSocket派生,但是起功能已经由异步转化为同步),当一个 客户端通过调用 Connect函数发出一个连接请求后,调用者线程立 刻可以朝下运行。当连接真正建立起来以后, socket底层会发送 个消息通知该对象。这里提到执行部件和调用者通过三种途径返回结 果:状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除 非执行部件提供多种选择,否则不受调用者控制。如果执行部件用状 态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有 些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这 其实是一种很严重的错误)。如果是使用通知的方式,效率则很高, 因为执行部件几乎不需要做额外的操作。至于回调函数,其实和通知 没太多区别。 阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在 得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来, 实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活 的,只是从逻辑上当前函数没有返回而已。例如,我们在 CSocket中 调用 Receive函数,如果缓冲区中没有数据,这个函数就会一直等待, 直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。 如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函 数中调用,其实主界面还是应该可以刷新。 socket接收数据的另外 个函数recv则是一个阻塞调用的例子。当 socket工作在阻塞模式 的时候,如果没有数据的情况下调用该函数,则当前线程就会被挂起 直到有数据为止。 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数 不会阻塞当前线程,而会立刻返回。 对象的阻塞模式和阻塞凼数调用。对象是否处于阻塞模式和函数是 不是阻塞调用有很强的相关性,但是并不是一一对应的。阻塞对象上 可以有非阻塞的调用方式,我们可以通过一定的API去轮询状态,在 适当的时候调用阻塞函数,就可以避免阻塞。而对亍非阻塞对象,调 用特殊的函数也可以进入阻塞调用。函数 select就是这样的一个例 6.GL对多线程的影响? GIL的全称是 Global interpreter lock(全局解释器锁),来源 是 python设计之初的考虑,为了数据安全所做的决定。每个CPU在 同一时间只能执行一个线程(在单核CPL下的多线程其实都只是并发 不是并行,并发和并行从宏观上来讲都是同时处理多路请求的概念 但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生; 而并发是指两个或多个事件在同一时间间隔内发生。) 在 Python多线程下,每个线程的执行方式 1、获取GLL 2、执行代码直到slep或者是 py thon虚拟机将其挂起。 3、释放GIL 可见,某个线程想要执行,必须先拿到GIL,我们可以把GIL看 作是“通行证”,并且在一个 python进程中,GIL只有一个。拿不 到通行证的线程,就不允许进入CPU执行 在Ptho2里,cL的释放逻辑是当前线程遇见10操作或者 ticks计数达到100( ticks可以看作是 Python自身的一个计数器, 专门做用亍GIL,每次释放后归零,这个计数可以通过 sys. setcheckinterval来调整),进行释放。而每次释放GL锁, 线程进行锁竞争、切换线程,会消耗资源。并且由于GLL锁存在, python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能 执行) I0密集型代码(文件处理、网络爬虫等),多线程能够有效提升 效率(单线程下有I0操作会进行I0等待,造成不必要的时间浪费, 而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CFPU 的资源,从而能提升程序执行效率),所以多线程对I0密集型代码比 较友好。 7. py thon中的反射? python中反射的核心本质其实是利用字符串的形式去对象(模 块)中操作(査找/获取/删除/添加)成员,一种基于字符串的事件 驱动。 8.1. python2和 python3的区别? 1.性能 Py3.运行 pystone benchmark的速度比Py25慢30%。Gudo认为Py30有极大的优化 空间,在字符串和整形操作上可 以取得很好的优化结果 Py3.1性能比Py2.5慢15%,还有很大的提升空间 2编码 Py3.X源杩文件默认使用ut-8编杩,这就使得以下代是合法的 >>中国= china >> print(中国) china 3.语法 1)去除了<>,全部改用!= 2)去除¨,全部改用repr() 3)关键词加入as和wih,还有True, False. None 4)整型除法返回浮点数,要得到整型结果,请使用/∥ 5)加入 nonlocal语句。使用 noclocalx可以直接指派外围(非仝局)变量 6)去除 print语句,加入prnt()函数实现相同的功能同样的还有exec语句,已经改为exec() 函数 7)改变了顺序操作符的行为,例如x<y,当x和y类型不匹配时抛出 Type Error tf不是返 回随即的bool值 8)输入函数改变了,删除了 raw input,用 input代替 2X: guess=int( raw input(" Enter an integer:")#读取键盘输入的方法 3.X: guess int(input(Enter an integer: ) 9)去除元组参数解包。不能def(a,(b,c)pass这样定义函数了 10)新式的8进制字变量,柑应地修改了oct()函数。 11)增加了2进制字面量和bn(函数 12)扩展的可迭代解包。在Py3X里,a,b,rest=seq和'rest,a=seq都是合法的 只要求两点:rest是|st 对象和seq是可迭代的。 13)新的 super(),可以不再给 super()传参数 14)新的 metaclass语法 class Foo(bases, **kwds) 15)支持 class decorator用法与函数 decorator一样: 4.字符串和字节串 1)现在字符串只有str一种类型,但它跟2x版本的 unicode几乎一样。 2)关于字节串,请参阅“数据类型"的第2条目 5数据类型 1)Py3X去除了long类型,现在只有一种整型—nt,但它的行为就像2X版本的|ong 2)新增了 bytes类型,对应于2X版本的八位串,定义一个 bytes字面量的方法如下: s对象和 bytes对象可以使用 encode((str-> bytes) or decode()(ytes->st)方法相互 转化。 3)dict的.keys()、 items和 values(方法返回迭代器,而之前的 iterkeys()等函数都被 废弃。同时去掉的还有 dict has key(),用in替代它吧 6面向对象 1)引入抽象基类( Abstract Base classes,ABCs)。 2)容器类和迭代器类被ABCs化,所以 collections模块里的类型比Py2.5多了很多。 >>import collections print('\n' join(dir(collections))) Callable Container Hashable Itemsview Iterable iterator Keys view Mapping Mapping View Mutable Mapping Mutable Sequence Mutable Set Na medTuple Sequence Set Sized Valuesview builtins do file name boll _ itemgetter sys defaultdict deque gy 外,数值类型也被ABCs化。关于这两点,请参阅PEP3119和PEP3141 3)迭代器的next()方法改名为next(),并增加内置函数next(),用以调用迭代器的 xt()方法 4)增加了@ abstractmethod和@ abstractproperty两个 decorator,编写抽象方法(属性) 更加方便。 7.异常 1)所以异常都从 BaseException继承,并删除了 Stardard error 2)去除了异常类的序列行为和 message属性 3)用 raise Exception(args)代替 raise Exception,args话法 4)捕获异常的语法改变,引入了as关键字来标识异常实例 5)异常链,因为 context在3.0a1版本中没有实现 8模块变动 1)移除了 pIckle模块,可以使用 pickle模块代替。最终我们将会有一个透明高效的模块 2)移除了 Imageop模块 3)tPa audiodev, Bastion bsddb 185, exceptions linuxaudiodev md5, Mime Writer minify, popen2, rexec,sets,sha, stringold, strop, sunaudiodev, timing和xmi模块 4)移除了bsddb模块(单独发布,可以从血tp:/www.jcea.es/programacionρybsddb.htm获 取) 5)移除了new馍块 6) os tmpnam()和 oS tmpfile()函数被移动到 tmpfile模块下 7) tokenize模块现在使用 bytes工作。主要的入口点不再是 generate_ tokens,而是 tokenize tokenize 9其它 1) Xrange()改名为 range(),要想使用 range(获得一个list,必须显式调用 >>list( range(10)10,1,2,3,4,5,6,7,8,9] 2) bytes对象不能hash,也不支持 b lower()、b. strip()和b.splt()方法,但对于后两者 可以使用b.strp(b'ntrf)和bsp(b)达到相同目的 3)zip()、map()和fter都返回迭代器。而appy()、 callable()、 coerce()、 execfile()、 reduce() 和 reload()函数都被去除了现在可以使用 hasatti(Q来替换 callable(). hasattr(的语法如: hasattr(string, name 4) string. letters和相关的 lowercase和. uppercase被去除,请改用 string. ascii letters 5)如果ⅹ<y的不能比较,抛出 TypeError异常。2.x版本是返回伪随机布尔值的 6)_ getslice_系列成员被废弃。a[i门煨据上下文转换为a. getitem(sice(l,j)减 setter和 delete调用 7)fle类被废弃 9.2.什么是pep8? 1变量 常量:大写加下划线 USER CONSTANT 私有变量:小写和一个前导下划线_ private value Python中不存在私有变量一说,若是遇到需要保护的变量,使用小写和 个前导下划线。但这只是程序员之间的一个约定,用于警告说明这是一个私 有变量,外部类不要去访问它。但实际上,外部类还是可以访问到这个变量。 内置变量:小写,两个前导下划线和两个后置下划线_ class 两个前导下划线会导致变量在解释期间被更名。这是为了避免内置变量和 其他变量产生冲突。用户定义的变量要严格避兔这和风格。以免导致混乱 2函数和方法 总体而言应该使用,小写和下划线。但有些比较老的库使用的是混合大小写, 即首单词小写,之后每个单词第一个字母大写,其余小写。但现在,小写和下划 线已成为规范 私有方法:小写和一个前导下划线 def secrete( self) print"don't test me 这里和私有变量一样,并不是真正的私有访问权限。同时也应该注意一般函 数不要使用两个前导下划线(当遇到两个前导下划线时, Python的名称改编特性 将发挥作用) 特殊方法:小写和两个前导下划线,两个后置下划线 def add (self, other) return int. add(other) 这种风格只应用于特殊函数,比如操作符重载等 函数参数:小写和下划线,缺省值等号两边无空格 3类 类总是使用驼峰格式命名,即所有单词首字母大写其余字母小写。类名应该 简明,精确,并足以从中理解类所完成的工作。常见的一个方法是使用表示其类 型或者特性的后缀,例如 SQLEngine, Mime Types对于基类而言,可以使用一个Base或者 Abstract前 n Base Cookie, Abstract Group 4模块和包 除特殊模块init之外,模块名称都使用不带下划线的小写字母。 若是它们实现一个协议,那么通常使用ib为后缀,例如: import smtplib import OS import sys 5关于参数 5.1不要用断言来实现静态类型检测。断言可以用于检查参数,但不应仅仅是进 行静态类型检测。 Python是动态类型语言,静态类型检测违背了其设计思想。断言 应该用于避免函数不被毫无意义的调用 52不要滥用*args和* kwargs。args和* kwargs参数可能会破坏数的健 壮性。它们使签名变得模糊,而且代码常常开始在不应该的地方构建小的参数解析器。 6其他 6.1使用has或is前缀命名布尔元素 is connect= True has member false 62用复数形式命名序列 members luser 1, user 2] 6.3用显式名称命名字典 person address=fuser_ 1:10 road WD, user_2: 20 street huafu 6.4避免通用名称 诸如list,dict, sequence或者 element这样的名称应该避免。 6.5避免现有名称 诸如os,sys这种系统已经存在的名称应该避免。 7一些数字 一行列数:PEP8规定为79列。根据自己的情况,比如不要超过满屏时编辑 器的显示列数。 一个函数:不要超过30行代码,即可显示在一个屏幕类,可以不使用垂直游 标即可看到整个函数 个类:不要超过200行代码,不要有超过10个方法。一个模块不要超 过500 8验证脚本 可以安装一个pep8脚本用于验证你的代码风格是否符合PEP8。 10.什么是线程安全? 线程安全是在多线程的环境下,能够保证多个线程同时执行时程序依旧运行正 确,而且要保证对于共享的数据可以山多个线程存取,但是同一时刻只能有一个线 程进行存取。多线程环境下解决资源竞争问题的办法是加锁来保证存取操作的唯- 11.4.十个常用的1inux命令? Ls, help, cd, more, clear, mkdir, pwd, rm, grep, find, mv su, date 12.5.find和grep? grep命令是一种强大的文木搜索工具,grep搜索内容串可以是正则表达式 允许对文木文件进行模式査找。如果找到匹配模式,grep打印包含模式的所有行 find通常用来在特定的目录下搜索符合条件的文件,也可以用来搜索特定用户 属主的文件 13.6.什么是面向对象编程? 面向对象编程是一种解决软件复用的设计和编程方法。这种方法把软件系统中 相近相似的操作逻辑和操作应用数据、状念,以类的型式摧述出来,以对象实例的形式 在软件系统中复用,以达到提高软件开发效率的作用。 14.8.面向对象有那些技术? 类cass:用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个 对象所共有的属性和方法。对象是类的实例。

...展开详情
试读 14P linux及Python语法面试题.pdf
立即下载 身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • 领英

  • GitHub

  • 回归勋章

  • 签到达人

  • 技术圈认证

关注 私信
上传资源赚钱or赚积分
最新推荐
linux及Python语法面试题.pdf 9积分/C币 立即下载
1/14
linux及Python语法面试题.pdf第1页
linux及Python语法面试题.pdf第2页
linux及Python语法面试题.pdf第3页

试读结束, 可继续读2页

9积分/C币 立即下载