linux及Python语法面试题.pdf
《linux及Python语法面试题.pdf》由会员分享,可在线阅读,更多相关《linux及Python语法面试题.pdf(14页珍藏版)》请在咨信网上搜索。
1、1.大数据的文件的读取大数据的文件的读取1.1.读取大几读取大几 G G 的大文件,可以利用生成器的大文件,可以利用生成器 generatorgenerator2.2.对可迭代对象对可迭代对象 filefile,进行迭代遍历:,进行迭代遍历:forfor lineline inin filefile,会,会自动地使用缓冲自动地使用缓冲 IOIO(bufferedbuffered IOIO)以及内存管理,而不必担心任何)以及内存管理,而不必担心任何大文件的问题。大文件的问题。withwith open(filename)open(filename)asas file:file:forfor li
2、neline inin file:file:do_things(line)do_things(line)2.迭代器和生成器区别迭代器和生成器区别?答答:(1 1)迭代器是一个更抽象的概念迭代器是一个更抽象的概念,任何对如果它类有任何对如果它类有 nexnext t方法和方法和 iteriter 方法返回自己本身方法返回自己本身。对于对于 stringsstrings、listlist、dictdict、tupltuple e等这类容器对象,使用等这类容器对象,使用 forfor 循环遍历是很方便的。在后台循环遍历是很方便的。在后台 forfor 语句语句对容器象调用对容器象调用 iter()i
3、ter()函数函数,iter()iter()是是 pythonpython 的内置函数的内置函数。iter()iter()会返回一个定义会返回一个定义 next()next()方法的迭代器对象,它在方法的迭代器对象,它在容器容器中逐个访问容中逐个访问容器内元素,器内元素,next()next()也是也是 pythonpython 的内置函数。在没有后续元素时,的内置函数。在没有后续元素时,next()next()会会 抛出一个抛出一个 StopIterStopIter 异常异常(2 2)生成器()生成器(GeneratorGenerator)是创建迭代器的简单而强大工具)是创建迭代器的简单而强
4、大工具。它们写起来就像是正规的函数,只在需要返回据时候使用它们写起来就像是正规的函数,只在需要返回据时候使用 yieldyield 语语句。每次句。每次 next()next()被调用,生成器会返回它脱离的位置被调用,生成器会返回它脱离的位置,记忆语句最记忆语句最后一次执行和所有数据后一次执行和所有数据。区别:生成器能做到迭代的所有事区别:生成器能做到迭代的所有事,而且因为自动创建了而且因为自动创建了_iter_()_iter_()和和 next()next()方法方法,生成器显得特别简洁生成器显得特别简洁,而且生成器也是而且生成器也是高效的高效的,使用生成器表,使用生成器表 达式取代列解析可
5、以同时节省达式取代列解析可以同时节省 内存。除了内存。除了创建和保程序状态的自动方法创建和保程序状态的自动方法,当发生器终结时当发生器终结时,还会自动抛出还会自动抛出StopIterationStopIteration 异常。异常。3.线程线程、进程进程、协程协程进程是具有一定独立功能的程序关于某个数据集合上的一次运进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间都有自己的独立内存空间,不同进程通过进程间通信来通信不同进程通过进程间通信来通信。由于进
6、由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。线程是进程的一个实体线程是进程的一个实体,是是 CPUCPU 调度和分派的基本单位调度和分派的基本单位,它它是比进程更小的能独立运行的基本单位是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统线程自己基本上不拥有系统资源资源,只拥有一点在运行中必不可少的资源只拥有一点在运行中必不可少的资源(如程序计数器如程序计数器,一组寄存一组寄存器和栈器和栈),
7、),但是它可与同属一个进程的其他的线程共享进程所拥有的但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源全部资源。线程间通信主要通过共享内存线程间通信主要通过共享内存,上下文切换很快上下文切换很快,资源开资源开销较少,但相比进程不够稳定容易丢失数据。销较少,但相比进程不够稳定容易丢失数据。协程是一种用户态的轻量级线程,协程的调度完全由用户控制协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈协程拥有自己的寄存器上下文和栈。协程调度切换时协程调度切换时,将寄存器上下将寄存器上下文和栈保存到其他地方文和栈保存到其他地方,在切回来的时候在切回来的时候,恢复
8、先前保存的寄存器上恢复先前保存的寄存器上下文和栈下文和栈,直接操作栈则基本没有内核切换的开销直接操作栈则基本没有内核切换的开销,可以不加锁的访可以不加锁的访问全局变量,所以上下文的切换非常快。问全局变量,所以上下文的切换非常快。4.装饰器装饰器装饰器是一个很著名的设计模式装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,经常被用于有切面需求的场景,较为经典的有插入日志较为经典的有插入日志、性能测试性能测试、事务处理等事务处理等。装饰器是解决这类装饰器是解决这类问题的绝佳设计问题的绝佳设计,有了装饰器有了装饰器,我们就可以抽离出大量函数中与函数我们就可以抽离出大量函数中与函数功能本身无关
9、的雷同代码并继续重用功能本身无关的雷同代码并继续重用。概括的讲概括的讲,装饰器的作用就是装饰器的作用就是为已经存在的对象添加额外的功能为已经存在的对象添加额外的功能装饰器装饰器(decorator)(decorator)里引入通用功能处理:里引入通用功能处理:引入日志引入日志函数执行时间统计函数执行时间统计执行函数前预备处理执行函数前预备处理执行函数后清理功能执行函数后清理功能权限校验等场景权限校验等场景缓存缓存fromfrom timetime importimport ctime,ctime,sleepsleepdefdef timefun(func):timefun(func):defd
10、ef wrappedfunc():wrappedfunc():print(%sprint(%s calledcalled atat%s%(func._name_,%s%(func._name_,ctime()ctime()returnreturn func()func()returnreturn wrappedfuncwrappedfunctimefuntimefundefdef foo():foo():print(Iprint(I amam foo)foo)foo()foo()sleep(2)sleep(2)foo()foo()5.谈谈你对同步异步阻塞非阻塞理解所谓同步,就是在发出一个功能调
11、用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如 sin,isdigit 等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是 SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的 LRESULT 值返回给调用者。异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。以 CAsycSocket 类为例(注意,CSocke
12、t 从CAsyncSocket 派生,但是起功能已经由异步转化为同步),当一个客户端通过调用 Connect 函数发出一个连接请求后,调用者线程立刻可以朝下运行。当连接真正建立起来以后,socket 底层会发送一个消息通知该对象。这里提到执行部件和调用者通过三种途径返回结果:状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除非执行部件提供多种选择,否则不受调用者控制。如果执行部件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一种很严重的错误)。如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额
13、外的操作。至于回调函数,其实和通知没太多区别。阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在 CSocket 中调用 Receive 函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。socket 接收数据的另外一个函数 recv 则是一个阻塞调用的例子。
14、当 socket 工作在阻塞模式的时候,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。对象的阻塞模式和阻塞函数调用。对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一一对应的。阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的 API 去轮询状态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。函数 select 就是这样的一个例子。6.GIL 对多线程的影响?GIL 的全称是 Global Interpreter
15、Lock(全局解释器锁),来源是 python 设计之初的考虑,为了数据安全所做的决定。每个 CPU 在同一时间只能执行一个线程(在单核 CPU 下的多线程其实都只是并发,不是并行,并发和并行从宏观上来讲都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。)在 Python 多线程下,每个线程的执行方式:1、获取 GIL2、执行代码直到 sleep 或者是 python 虚拟机将其挂起。3、释放 GIL可见,某个线程想要执行,必须先拿到 GIL,我们可以把 GIL 看作是“通行证”,并且在一个 python 进
16、程中,GIL 只有一个。拿不到通行证的线程,就不允许进入 CPU 执行。在 Python2.x 里,GIL 的释放逻辑是当前线程遇见 IO 操作或者ticks 计数达到 100(ticks 可以看作是 Python 自身的一个计数器,专门做用于 GIL,每次释放后归零,这个计数可以通过sys.setcheckinterval 来调整),进行释放。而每次释放 GIL 锁,线程进行锁竞争、切换线程,会消耗资源。并且由于 GIL 锁存在,python 里一个进程永远只能同时执行一个线程(拿到 GIL 的线程才能执行)。IO 密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有 IO
17、 操作会进行 IO 等待,造成不必要的时间浪费,而开启多线程能在线程 A 等待时,自动切换到线程 B,可以不浪费 CPU的资源,从而能提升程序执行效率),所以多线程对 IO 密集型代码比较友好。7.python 中的反射?python中反射的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动。8.8.1.1.pythonpython2 2 和和 python3python3 的区别的区别?1.性能性能Py3.0 运行 pystone benchmark 的速度比 Py2.5 慢 30%。Guido 认为 Py3.0 有极大的优化空间,在
18、字符串和整形操作上可以取得很好的优化结果。Py3.1 性能比 Py2.5 慢 15%,还有很大的提升空间。2.编码编码Py3.X 源码文件默认使用 utf-8 编码,这就使得以下代码是合法的:中国=chinaprint(中国)china3.语法语法1)去除了,全部改用!=2)去除,全部改用 repr()3)关键词加入 as 和 with,还有 True,False,None4)整型除法返回浮点数,要得到整型结果,请使用/5)加入 nonlocal 语句。使用 noclocal x 可以直接指派外围(非全局)变量6)去除 print 语句,加入 print()函数实现相同的功能。同样的还有 ex
19、ec 语句,已经改为 exec()函数7)改变了顺序操作符的行为,例如 x bytes)or.decode()(bytes-str)方法相互转化。3)dict 的.keys()、.items 和.values()方法返回迭代器,而之前的 iterkeys()等函数都被废弃。同时去掉的还有dict.has_key(),用 in 替代它吧6.面向对象面向对象1)引入抽象基类(Abstraact Base Classes,ABCs)。2)容器类和迭代器类被 ABCs 化,所以 cellections 模块里的类型比 Py2.5 多了很多。import collections print(n.join
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux Python 语法 试题
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。