还剩40页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
函数参数传递1Python看两个例子:Python la=1def funa:1:funa5print a#Python la=[]def funa:a.append1:funa
[1]Sprint a#全部变量都能够了解是内存中一个对象〃引用〃,或者,也能够看似C中void*感觉这里记住是类型是属于对象,而不是变量而对象有两种,〃可更改〃mutable与〃不可更改〃immutable对象在python中,strings,tuples,和numbers是不可更改对象,而list,diet等则是能够修改对象这就是这个问题重点当一个引用传递给函数时候,函数自动复制T分弓I用,这个函数里引用和外边引用没有半毛关系了.所以第一个例子里函数把引用指向了一个不可变对象,当函数返回时候,外面引用没半毛感觉.而第二个例子就不一样了,函数内引用指向是可变对象,对它操作就和定位了指针地址一样,在内存里进行修改.假如还不明白话,这里有愈加好解释中元类2Python metaclass—new_是一个静态方法,而_init_是一个实例方法.
1.—new—方法会返回一个创建实例,而—init—什么都不返回.
2.只有在__new__返回一个Cis实例时后面_init__才能被调用.
3.当创建一个新实例时调用_new_初始化一个实例时用_i nit
4.stackoverflow ps_metaclass_是创建类时起作用.所以我们能够分别使用_metaclass,new_和_init来分别在类创建,实例创建和实例初始化时候做一些小手脚.单例模式16这个绝对常考啊.绝对要记住1~2个方法,当初面试官是让手写.使用_方法1newPythonclass Singletonobject:def_new_cis,*args,**kw:「if nothasattrclsz instance:orig=superSingleton,ciscis._instance=orig._new_cis,*args,**kwreturn cis._instance8class MyClassSingleton:a=1共享属性2创建实例时把全部实例__色“_指向同一个字典,这么它们具备相同属性和方法.Pythonclass Borgobject:_state={}def_new__cis,*args,**kw:ob=superBorg,cis._new_cis,*args,**kw ob._diet_=cis._statereturn ob7class MyClass2Borg:a=1装饰器版本3Pythondef singletoncis,*args,**kw:instances={}def getinstance:if cisnot ininstances:instances[cis]=cis*argsA**kw returninstances[cis]return getinstance8^singletonclass MyClass:方法4import作为python模块是天然单例模式Pythonmysingleton.py1#z classMy_Singletonobject:def fooself:pass56my_singleton=My_Singletonto use8#from mysingletonin^ort my_singleton10my_singleton.foo中作用域17PythonPython中,一个变量作用域总是由在代码中被赋值地方所决定当Python碰到一个变量话他会按照这么次序进行搜索当地作用域Local一当前作用域被嵌入当地作用域Enclosing locals一全局/模块作用域Global一内置作用域Built-in线程全局锁18GIL线程全局锁Global InterpreterLock,即Python为了确保线程安全而采取独立线程运行限制,说白了就是一个核只能在同一时间运行一个线程.见Python最难问题处理方法就是多进程和下面协程什办程也只是单CPU,不过能减小切换代价提升性能.协程19知乎被问到了,呵呵哒,跪了简单点说协程是进程和线程升级版,进程和线程都面临着内核态和用户态切换问题而花费许多切换时间,而协程就是用户自己控制切换时机,不再需要陷入系统内核态.Python里最常见yield就是协程思想!能够查看第九个问题.闭包20闭包closure是函数式编程主要语法结构闭包也是一个组织代码结构,它一样提升了代码可重复使用性当一个内嵌函数引用其外部作作用域变量,我们就会得到一个闭包.总结一下,创建一个闭包必须满足以下几点必须有一个内嵌函数
1.内嵌函数必须引用外部函数中变量
2.外部函数返回值必须是内嵌函数
3.感觉闭包还是有难度,几句话是说不明白,还是查查相关资料.重点是函数运行后并不会被撤消,就像16题instance字典一样,当函数运行完后,in stance并不被销毁,而是继续留在内存空间里.这个功效类似类里类变量,只不过迁移到了函数上.闭包就像个空心球一样,你知道外面和里面,但你不知道中间是什么样.函数21lambda其实就是一个匿名函数,为何叫lambda因为和后面函数式编程关于.推荐:知乎函数式编程22Python这个需要适当了解一下吧,毕竟函数式编程在Python中也做了引用.推荐:酷壳python中函数式编程支持:filter函数功效相当于过滤器调用一个布尔函数来迭代遍历每个seq中元素;返回一个使bool_seq返回值为true元素序列Pythonl»a=[1,2,3,4,5,6,7]2b=filterlambda x:x5,a3print b4»[6Z7]m叩函数是对一个序列每个项依次执行函数,下面是对一个序列每个项都乘以2:Python2,1a=maplambda x:x*2z[lz3]/list a3[2Z4,6]reduce函数是对一个序列每个项迭代调用函数,下面是求3阶乘Python reducelambday:x*y,range1,426里拷贝23Python弓I用和copy,deepcopy区分Pythonimport copy#原始对象[lz2,3,4,[a\b]]#赋值,传对象引用4b=a#对象拷贝,浅拷贝5c=copy.copy a,对象拷贝,深拷贝6d=copy.deepcopy a7#修改对象a8a.append5#修改对象中[0,1数组对象9a
[4].appendc*a10llprint*a=,a12print*b=,b13print1c=,cImprint*d=*,d15输出结果17a=[1,2,3,4,cM,5]18b=[1,2,3,4,[0,b,e],5]19c=[1,2,3,4,[0,3,c]]2,3,4,[a1,b]]20d=[1,垃圾回收机制24PythonPython GC主要使用引用计数reference counting来跟踪和回收垃圾在引用计数基础上,经过〃标识-去除〃mark andsweep处理容器对象可能产生循环引用问题,经过〃分代回收〃generation collection以空间换时间方法提升垃圾回收效率引用计数1PyObject是每个对象必有内容,其中ob_refcnt就是做为引用计数当一个对象有新引用时,它ob_refcnt就会增加,当引用它对象被删除,它ob_refcnt就会降低.引用计数为0时,该对象生命就结束了O优点
1.简单缺点:维护引用计数消耗资源
1.循环引用
2.标识-去除机制2基本思绪是先按需分配,等到没有空闲内存时候从存放器和程序栈上引用出发,遍历以对象为节点、以引用为边组成图,把全部能够访问到对象打上标识,然后清扫一遍内存空间,把全部没标识对象释放分代技术3分代回收整体思想是:将系统中全部内存块依照其存活时间划分为不一样集合,每个集合就成为一个〃代〃,垃圾搜集频率伴随〃代〃存活时间增大而减小,存活时间通常利用经过几次垃圾回收来度量Python默认定义了三代对象集合,索引数越大,对象存活时间越长举例当一些内存块M经过了3次垃圾搜集清洗之后还存活时,我们就将内存块M划到一个集合A中去,而新分配内存都划分到集合B中去当垃圾搜集开始工作时,大多数情况都只对集合B进行垃圾回收,而对集合A进行垃圾回收要隔相当长一段时间后才进行,这就使得垃圾搜集机制需要处理内存少了,效率自然就提升了在这个过程中,集合B中一些内存块因为存活时间长而会被转移到集合A中,当然,集合A中实际上也存在一些垃圾,这些垃圾回收会因为这种分代机制而被延迟25PythonList推荐:26Pythonisis是对比地址尸二是对比值27read,readline fQreadlines•read读取整个文件•readline读取下一行,使用生成器方法•readlines读取整个文件到一个迭代器以供我们遍历和区分28Python23推荐《和
3.x版本主要区分》操作系统和1select pollepollf其实全部I/O都是轮询方法,只不过实现层面不一样罢了.这个问题可能有点深入了,但相信能回答出这个问题是对I/O多路复用有很好了解了.其中tornado使用就是epoll.seleqpoll和epoll区分总结基本上select有3个缺点连接数受限
1.poll改进了第一个缺点epoll改了三个缺点.关于epoll:调度算法
21.先来先服务FCFS,First ComeFirst Serve
2.短作业优先SJF,Shortest JobFirst
3.最高优先权调度Priority Scheduling
4.时间片轮转RR,Round Robin
5.多级反馈队歹I」调度multilevel feedbackqueue scheduling实时调度算法
1.最早截至时间优先EDF
2.最低松弛度优先LLF死锁3原因
1.竞争资源
2.程序推进次序不妥必要条件:互斥条件
1.请求和保持条件
2.不剥夺条件
3.环路等候条件
4.处理死锁基本方法预防死锁摒弃除1以外条件
1.防止死锁银行家算法
2.检测死锁资源分配图
3.解除死锁
4.剥夺资源
1.撤消进程
2.程序编译与链接4推荐:Bulid过程能够分解为4个步骤预处理Prepressing,编译Compilation、汇编Assembly、链接Linking以c语言为例预处理1预编译过程主要处理那些源文件中以〃#〃开始预编译指令,主要处理规则有这个非常不惯用,不过像ORM这种复杂结构还是会需要,详情请看太深刻了解Python中元类metaclass》3@staticmethod fn@classmethodPython其实有3个方法,即静态方法staticmethod,类方法classmethod和实例方法,以下:Pythondef foo x:print executingfoo%sn%x4class Aobject:def fooself,x:print executingfoo%s,%s**%self zx@classmethoddef classfooclsz x:10print executingclass_foo%sz%s,%cls,x12@staticmethod13def static foo x:1114print executingstatic foo%s1%x15L6a=A这里先了解下函数参数里面self和cis.这个self和cis是对类或者实例绑定,对于通常函数来说我们能够这么调用foox,这个函数就是最惯用,它工作跟任何东西类,实例无关.对于实例方法,我们知道在类里每次定义方法时候都需要绑定这个实例,就是foo self,x,为何要这么做呢因为实例方法调用离不开实例,我们需要把实例自己传给函数调用时候是这么a-foox其实是foo a,x.类方法一样,只不过它传递是类而不是实例,A.class_foox.注意这里self和cis能够替换别参数,不过python约定是这俩,还是不要改好.对于静态方法其实和普通方法一样,不需要对谁进行绑定,唯一区分是调用时候需要使用a.static foox或者A.staticfoox来调用.〃〃
1.将全部#define删除,并展开所用宏定义〃〃〃〃〃〃〃〃
2.处理全部条件预编译指令,比如#if、#ifdef、#elif、#endif〃
3.处理#include〃预编译指令,将被包含文件插入到该编译指令位置,注此过程是递归进行
4.删除全部注释
5.添加行号和文件名标识,方便于编译时编译器产生调试用行号信息以及用于编译时产生编译错误或警告时可显示行号
6.保留全部#pragma编译器指令编译2编译过程就是把预处理完文件进行一系列词法分析、语法分析、语义分析及优化后生成对应汇编代码文件这个过程是整个程序构建关键部分汇编3汇编器是将汇编代码转化成机器能够执行指令,每一条汇编语句几乎都是一条机器指令经过编译、链接、汇编输出文件成为目标文件Object File链接4链接主要内容就是把各个模块之间相互引用部分处理好,使各个模块能够正确拼接链接主要过程包块地址和空间分配Address andStorage Allocation、符号决议Symbol Resolution和重定位Relocation等步骤静态链接和动态链接5静态链接方法静态链接时候,载入代码就会把程序会用到动态代码或动态代码地址确定下来静态库链接能够使用静态链接,动态链接库也能够使用这种方法链接导入库动态链接方法使用这种方式程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用那部分)动态代码逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间性能比不上静态链接程序虚拟内存技术6虚拟存放器是值具备请求调入功效和置换功效,能从逻辑上对内存容量加以扩充一个存放系统.分页和分段7分页用户程序地址空间被划分成若干固定大小区域,称为〃页〃,对应地,内存空间分成若干个物理块,页和块大小相等可将用户程序任一页放在内存任一块中,实现了离散分配分段将用户程序地址空间分成若干个大小不等段,每段能够定义一组相对完整逻辑信息存放分配时,以段为单位,段与段在内存中能够不相邻接,也实现了离散分配分页与分段主要区分页是信息物理单位,分页是为了实现非连续分配,方便处理内存碎片问题,或者说分页是因为系统管
1.理需要.段是信息逻辑单位,它含有一组意义相对完整信息,分段目标是为了愈加好地实现共享,满足用户页大小固定,由系统确定,将逻辑地址划分为页号和页内地址是由机器硬件实现.而段长度却不固定,
2.决定于用户所编写程序,通常由编译程序在对源程序进行编译时依照信息性质来划分.分页作业地址空间是一维.分段地址空间是二维.
3.页面置换算法8最好置换算法OPT:不可能实现
1.先进先出FIFO
2.最近最久未使用算法LRU:最近一段时间里最久没有使用过页面给予置换.
3.clock算法
4.边缘触发和水平触发9边缘触发是指每当状态改变时发生一个io事件,条件触发是只要满足条件就发生一个io事件数据库事务1数据库事务Database Transaction是指作为单个逻辑工作单元执行一系列操作,要么完全地执行,要z么完全地不执行数据库索引2推荐MySQL索引背后数据结构及算法原理聚集索弓I,非聚集索弓l,B-Tree,B+Tree,最左前缀原理原理3Redis
2.乐观锁和消极锁4消极锁假定会发生并发冲突,屏蔽一切可能违反数据完整性操作乐观锁假设不会发生并发冲突,只在提交操作时检验是否违反数据完整性5MVCC和6MylSAM InnoDBMylSAM适合于一些需要大量查询应用,但其对于有大量写操作并不是很好甚至你只是需要update一个字段,整个表都会被锁起来,而别进程,就算是读进程都无法操作直到读操作完成另外,MylSAM对于SELECT COUNTS)这类计算是超快无比InnoDB趋势会是一个非常复杂存放引擎,对于一些小应用,它会比MylSAM还慢他是它支持〃行锁〃,于是在写操作比较多时候,会更优异而且,他还支持更多高级应用,比如事务网络三次握手
11.客户端经过向服务器端发送一个SYN来创建一个主动打开,作为三路握手一部分客户端把这段连接序号设定为随机数A服务器端应该为一个正当SYN回送一个SYN/ACKACK确实认码应为A+l,SYN/ACK包本身又有一个随机序号B最终,客户端再发送一个ACK当服务端受到这个ACK时候,就完成了三路握手,并进入了连O
3.接创建状态此时包序号被设定为收到确实认号A+1,而响应则为B+1四次挥手2协议3ARP地址解析协议Address ResolutionProtocol:依照IP地址获取物理地址一个TCP/IP协议区分4urllibfl]urllib2这个面试官确实问过,当初答urllib2能够Post而urllib不能够.urllib提供urlencode方法用来GET查询字符串产生而urllib2没有这是为何urllib常和urllib
21.一起使用原因urllib2能够接收一个Request类实例来设置URL请求headers,urllib仅能够接收URL这意
2.味着,你不能够伪装你User Agent字符串等和5Post GetGET和POST有什么区分?及为何网上多数答案都是错get:RFC2616一Hypertext TransferProtocol一HTTP/
1.1post:RFC2616-Hypertext TransferProtocol一HTTP/
1.1和6Cookie SessionCookieSession储存位置客户端服务器端目标跟踪会话,也能够保留用户偏好设置或者保留用户名密码等跟踪会话安全性不安全安全session技术是要使用到cookie,之所以出现session技术,主要是为了安全和区分7apache nginxnginx相对apache优点:轻量级,一样起web服务,比apache占用更少内存及资源•抗并发,nginx处理请求是异步非阻塞,支持更多并发连接,而apache则是阻塞型,在高并发•下nginx能保持低资源低消耗高性能配置简练•高度模块化设计,编写模块相对简单•小区活跃•apache相又寸nginx优点:rewrite,比nginx rewrite强大模块超多,基本想到都能够找到少bug,nginx bug相对较多超稳定网站用户密码保留8明文hash后保留,如md
52.MD5+Salt方式,这个salt能够随机
3.知乎使用了Bcrypy(好像)加密
4.和9HTTP HTTPS状态码定义1XX汇报接收到请求,继续进程2xx成功步骤成功接收,被了解,并被接收3xx重定向为了完成请求,必须采取深入方法4xx客户端犯错请求包含错次序或不能完成5xx服务器犯错服务器无法完成显然有效请求403:Forbidden404:Not FoundHTTPS握手/寸称力口密,非对称力口密,TLS/SSL,RSA和10XSRF XSS•CSRFCross-site requestforgery跨站请求伪造•XSSCross SiteScripting跨站脚本攻击CSRF重点在请求,XSS重点在脚本幕等11IdempotenceHTTP方法幕等性是指一次和数次请求某一个资源应该具备一样副作用(注意是副作用)GET,不会改变资源状态,不论调用一次还是N次都没有副作用请注意,这里强调是一次和N次具备相同副作用,而不是每次GET结果相同GET,但它本身并没有产生任何副作用,因而是满足幕等性,DELETE方法用于删除资源有副作用,但它应该满足幕等性比如DELETE,调用一次和N次对系统产生副作用是相同,即删掉id为4231帖子;所以,调用者能够数次调用或刷新页面而无须担心引发错误POST所对应URI并非创建资源本身,而是资源接收者比如POST://.com/articles下创建一篇帖子,HTTP响应中应包含帖子创建状态以及帖子URL两次相同POST请求会在服务器端创建两份资源,它们具备不一样URI;所以,POST方法不具备幕等性PUT所对应URI是要创建或更新资源本身比如PUT对同一URI进行数次PUT副作用和一次PUT是相同;所,以PUT方法具备黑等性架构12RESTful SOAP,RPC推荐:13SOAPSOAP原为Simple ObjectAccess Protocol首字母缩写,即简单对象访问协议是交换数据一个协议规范,使用在计算机网络Web服务web service中,交换带结构信息SOAP为了简化网页服务器Web Server从XML数据库中提取数据时,节约去格式化页面时间,以及不一样应用程序之间按照HTTP通信协议,遵从XML格式执行资料交换,使其抽象于语言实现、平台和硬件14RPCRPC RemoteProcedure CallProtocol——远程过程调用协议,它是一个经过网络从远程计算机程序上请求服务,而不需要了解底层网络技术协议RPC协议假定一些传输协议存在,如TCP或UDP,为通信程序之间携带信息数据在OSI网络通信模型中,RPC跨越了传输层和应用层RPC使得开发包含网络分布式多程序在内应用程序愈加轻易总结:服务提供两大流派.传统意义以方法调用为导向通称RPC为了企业SOA,若干厂商联合推出webservice,制订了wsdl接口定义传输so叩,当互联网时代臃肿SOA被简化为http+xml/json.不过简化出现各种混乱以资源为导向,任何操作无非是对资源增删改查,于是统一REST出现了.进化次序:RPC-SOAP-RESTful和15CGI WSGICGI是通用网关接口,是连接web服务器和应用程序接口,用户经过CGI来获取动态数据或文件等CGI程序是一个独立程序,它能够用几乎全部语言来写,包含perl,c,lua,python等等WSGI WebServer GatewayInterface,是Python应用程序或框架和Web服务器之间一个接口,WSGI其中一Z个目标就是让用户能够用统一语言Python编写前后端官方说明PEP-3333中间人攻击16在GFW里屡见不鲜,呵呵.中间人攻击(Man-in-the-middle attack,通常缩写为MITM)是指攻击者与通讯两端分别创建独立联络,并交换其所收到数据,使通讯两端认为他们正在经过一个私密连接与对方直接对话,但实际上整个会话都被攻击者完全控制问题17clOk所谓clOk问题,指是服务器同时支持成千上万个客户端问题也就是concurrent10000connection(这也是clOk这个名字由来)推荐:18socket推荐:Socket=Ip address+TCP/UDP+port浏览器缓存19推荐304Not Modified和20HTTP
1.0HTTP
1.1推荐:长链接
2.请求头Host字段,一个服务器多个网站
1.\实例方法类方法静态方法a=A a.foox a.class_foox a.static_fooxA不可用A.class_foox A.static_foox更多关于这个问题类变量和实例变量4Pythonclass Person:name=,,aaan«pl=Person5p2=Person Cpl.name=nbbb#bbb7print pl.nameaaa8print p
2.name#9print Person.name#aaa类变量就是供类使用变量,实例变量就是供实例使用.这里pl.name=”bbb”是实例调用了类变量,这其实和上面第一个问题一样就是函数传参问题,pl.name一开始是指向类变量name=naaan不过在实例作用域里把类变量引用改变了,就变成了一个实例变ftself.name不再弓zI用Person类变量name了.能够看看下面例子:Pythonclass Person:name=[]3pl=Person5p2=Person
3.文件断点续传pl.name.append
14.身份认证,状态管理,Cache缓存21AjaxAJAX,Asynchronous JavaScriptand XML(异步JavaScript和XML),是与在不重新加载整个页面情况下,与服务器交换数据并更新部分网页技术*NIX进程间通信方式()unix IPC
1.管道(Pipe):管道可用于具备亲缘关系进程间通信,允许一个进程和另一个与它有共同祖先进程之间进行通信
2.命名管道(named pipe):命名管道克服了管道没有名字限制,所以,除具备管道所具备功效外,它还允许无亲缘关系进程间通信命名管道在文件系统中有对应文件名命名管道经过命令mkfifo或系统调用mkfifo来创建
3.信号(Signal):信号是比较复杂通信方式,用于通知接收进程有某种事件发生,除了用于进程间通信外,进程还能够发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.l标准信号函数sigaction(实际上,该函数是基于BSD,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)
4.消息(Message)队列消息队列是消息链接表,包含Posix消息队列system V消息队列°有足够权限进程能够向队列中添加消息,被赋予读权限进程则能够读走队列中消息消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺
5.共享内存使得多个进程能够访问同一块内存空间,是最快可用IPC形式是针对其余通信机制运行效率较低而设计往往与其它通信机制,如信号量结合使用,来达成进程间同时及互斥(
6.内存映射mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制进程经过把一个共享文件映射到自己进程地址空间来实现它
7.信号量(sem叩hore):主要作为进程间以及同一进程不一样线程之间同时伎俩
8.套接口(Socket):更为通常进程间通信机制,可用于不一样机器之间进程间通信起初是由Unix系统BSD分支开发出来,但现在通常能够移植到其它类Unix系统上Linux和System V变种都支持套接字数据结构红黑树1红黑树与AVL比较AVL是严格平衡树,所以在增加或者删除节点时候,依照不一样情况,旋转次数比红黑树要多;红黑是用非严格平衡来换取增删节点时候旋转次数降低;所以简单说,假如你应用中,搜索次数远远大于插入和删除,那么选择AVL,假如搜索,插入删除次数几乎差不多,应该选择RB编程题台阶问题/斐波纳挈1一只青蛙一次能够跳上1级台阶,也能够跳上2级求该青蛙跳上一个n级台阶总共有多少种跳法Python[fib=lambda n:n if n=2else fib n-1+fibn-2第二种记忆方法Python1def memofunc:cache={}def wrap*args:if argsnot incache:cache[args]=func*argsreturn cache[args]return wrap900memodef fibi:if i2:return1return fibi-1+fibi-2第三种方法def fibn:Pythona,b=0,1for_in xrangen:a,b=b,a+breturn b变态台阶问题一只青蛙一次能够跳上1级台阶,也能够跳上2级……它也能够跳上n级求该青蛙跳上一个n级台阶总共有多少种跳法Python-fib=lambda n:n ifn2else2*fibn-1矩形覆盖3我们能够用小矩形横着或者竖着去覆盖更大矩形请问用n个2*1小矩形无重合地覆盖一个2*n大2-1矩形,总共有多少种方法?第2夫n个矩形覆盖方法等于第2*n-l加上第2夫n-2方法Python1f=lambda n:1ifn2else fn-1+fn-2杨氏矩阵直找4在一个m行n列二维数组中,每一行都按照从左到右递增次序排序,每一列都按照从上到下递增次序排序请完成一个函数,输入这么一个二维数组和一个整数,判断数组中是否含有该整数去除列表中重复元素5用集合PythonHist set1用字典Pythonin=jb-c,d,b,e,a,a]212={}.fromkeys
11.keysprint12用字典并保持次序Python,,,,111=[b c,d b c a,a]212=listset
11312.sortkey=ll.index4print12列表推导式Python,,,,111=[b,c dbca,a]212=[]3[
12.appendi for i in11if noti in12]面试官提到,先排序然后删除.链表成对调换61-2-3-4转换成2-1-4-
3.Pythonclass ListNode:def_init_self,x:self.val=xself.next=None6class Solution:#@param aListNode#^return aListNodedef swapPairsself,head:if head!=None andhead.next!=None:next=head.nexthead.next=self.swapPairsnext.nextnext.next=headreturn nextreturnhead创建字典方法7直接创建1Pythondiet={Tname*:*earth*,port:80}工厂方法2Pythonlitems=[*name*,*earth*f*port,80*]2dict2=dictitems3dictl=dict[name*,earth*],[port*z*80*]方法3fromkeysPythonldictl={}.fromkeysx*A*y1z-12dict={*x*:-1z*y*:-13dict2={}.fromkeys*x*,*y*4dict2={*x:Noner*y:None}合并两个有序列表8知乎远程面试要求编程尾递归Python1def_recursion_merge_sort211,12,tmp:if len11==0or len12==0:tmp.extend11return tmpelse:if11
[0]12
[0]:tmp.append11
[0]del11
[0]else:tmp.append12
[0]del12
[0]return_recursion_merge_sort2llz12,tmp1415def recursion_merge_sort211,12:return_recursion_merge_sort2llz12,[]循环算法Python1def loop_merge_sort11,12:tmp=[]while len110and len120:if11
[0]12
[0]:tmp,append11
[0]del11
[0]else:・tmp append12
[0]del12
[0]tmp.extend11tmp.extend12return tmp交叉链表求交点9去哪儿面试,没做出来.Pythonclass ListNode:def_init_self,x:self.val=xself.next=NoneE defnode11,12:6lengthl,lenth2=0z0#求两个链表长度78while
11.next:911=
11.next10lengthl+=111while
12.next:1212=
12.next13length2+=114#长链表先走15if lengthllenth2:16for_in rangelengthl-length2:1711=
11.next18else19for_in rangelength2-lengthl:2012=
12.next21while11and12:22if
11.next==
12.next:23return
11.next24else:2511=
11.next2612=
12.next二分查找10PythonIdef binarysearchlz t:low,high=0,len1-1while lowhigh:print low,highmid=low+high/2if1[mid]t:high=midelif1[mid]t:low=mid+1else:return midreturnlow if1[low]——t elseFalse1314if__name_==_main_1:1=[1,4,12,45,66,99,120,444]print binarysearchlz12print binarysearchlz118print binarysearch1,13print binarysearch1,444快排11Pythondef qsortseq:if seq==[]:return[]else:pivot=seq
[0]lesser=qsort[x forx inseq[1:]if xpivot]greater=qsort[x forx inseq[1:]if x=pivot]returnlesser+[pivot]+greater9_______________lOif name==*main1:seq=[5,6,78,9,0,-1,2,3,-65,12]printqsortseq找零问题12PythoncoinsUsed={i:0foriin rangemoney+l coinChangevalues,money,coinsUsed广度遍历和深度遍历二叉树13给定一个数组,构建二叉树,而且按层次打印这个二叉树Python14二叉树节点1##z classNodeobject:def_init_self,data,left=Nonez right=None:self.data=dataself.left=left self.right=right72,8tree=NodelzNode3ZNode7,Node0,Node6zNode Node5,Node415层次遍历910##def lookuproot:stack=[root]while stack:current=stack.pop0print current.data ifcurrent.left:stack.appendcurrent.leftif current.right:stack.appendcurrent.right16深度遍历20##def deeproot:if notroot:returnprint root.datadeep root.leftdeep root.right28if_name==*_main_:lookup treedeeptree前中后序遍历177print pl.nameprint p
2.name9print Person.name参考自省5Python这个也是python彪悍特征.自省就是面向对象语言所写程序在运行时,所能知道对象类型.简单一句就是运行时能够取得对象类型.比如type,dir,getattr,hasattr,isinstance.字典推导式6可能你见过列表推导时,却没有见过字典推导式,在
2.7中才加入Pythond={key:value forkey,value initerable}中单下划线和双下划线7PythonPython1class MyClass:・・・def self:
3...self._superprivate=Hello*,
4...self._semiprivate=world!6me=MyClass7print me._superprivate8Traceback mostrecent calllast:File,stdin,,line1,in moduleCAttributeError:myClass instancehas noattribute*_superprivate print me._semiprivate,world!深度遍历改变次序就0K了求最大树深18Pythondef maxDepthroot:if notroot:return0return maxmaxDepthroot.left,maxDepthroot.right+1求两棵树是否相同19def isSameTreep,q:Pythonreturn Trueifp==None andq==None:elif pandreturn p.val==q.val andisSameTreep.left,q.left andisSameTreep.right,q.rightelse:return False20前序中序求后序推荐:PythonIdef rebuildpre,center:if notpre:returncur=Nodepre
[0]index=center.indexpre
[0]cur.left=rebuildpre[1:index+1],center[:index]cur.right=rebuildpre[index+1:],center[index+1:]return curdefdeeproot:if notroot:returndeep root.left21单链表逆置deep root.right printroot.dataPythonclass Nodeobject:def_init_self,data=None,next=None:self.data=data self.next=next561ink=Nodelz Node2ZNode3,Node4,Node5,Node6,Node7,Node8ZNode97t defrevlink:pre=link cur=link.next pre.next=None whilecur:tmp=cur.next cur.next=pre pre=cur cur=tmp returnpre19root=revlinkwhile root:22root root.nextprint root.data___________13printme.diet14{*_MyClass_superprivate*:*Hello*f1_semiprivate*:,world!foo_一个约定Python内部名字,用来区分其余用户自定义命名,以防冲突._f一个约定,用来指定变量私有.程序员用来指定私有变量一个方式.f这个有真正意义:解析器用classname foo来代替这个名字,以区分和其余类相同命名.详情见:或者:字符串格式化%和「
8311131.format在许多方面看起来更便利.对于%最烦人是它无法同时传递一个变量和元组.你可能会想下面代码不会有什么问题:Python:“hi there%sn%name不过,假如name恰好是Q,2,3,它将会抛出一个TypeError异常为了确保它总是正确,你必须这么做:Python#提供一个单元素数组面不是-hi there%s”%name,不过有点丑..format就没有这些问题.你给第二个问题也是这么,.format好看多了.你为何不用它不知道它在读这个之前%为了和Python
2.5兼容譬如logging库提议使用issue#4迭代器和生成器9这个是stackoverflow里python排名第一问题,值得一看:这是汉字版9*args and**kwargs★用大args和夫kwargs只是为了方便并没有强制使用它们.当你不确定你函数里将要传递多少参数时你能够用*args.比如,它能够传递任意数量参数:Python def print_everything*args:for count,thing inenumerateargs:
3...print,{0}.{1}.formatcount,thing
4...5print_everything*apple,banana*,*cabbage1£
0.apple
1.banana
32.cabbage相同广大kwargs允许你使用没有事先定义参数名Python1def table_things**kwargs:
2...for name,value inkwargs.items:
3...print1{0}={1}
1.formatname,value
4...5table_thingsapple=1fruit,cabbage=1vegetable6cabbage=vegetableapple=fruit你也能够混着用.命名参数首先取得参数值然后全部其余参数都传递给*args和kwargs.命名参数在列表最前端.比如Pythondef table_things titlestring,**kwargs夫args和火火kwargs能够同时在函数定义中不过*args必须在**kwargs前面.当调用函数时你也能够用★和★★语法.比如:Python1»defprintthree thingsa,b,c:
2...print*a={0},b={1},c={2}T.formata,b,c4mylist=[aardvark1,*baboon*,*cat*]5print_three_things*mylistaardvark,b=baboon,c=cat就像你看到一样,它能够传递列表(或者元组)每一项并把它们解包.注意必须与它们在函数里参数相吻合.当然,你也能够在函数定义或者函数调用时用*.面向切面编程和装饰器11AOP这个AOP一听起来有点懵,同学面阿里时候就被问懵了…装饰器是一个很著名设计模式,经常被用于有切面需求场景,较为经典有插入日志、性能测试、事务处理等装饰器是处理这类问题绝佳设计,有了装饰器,我们就能够抽离出大量函数中与函数功效本身无关雷同代码并继续重用概括讲,装饰器作用就是为已经存在对象添加额外功效这个问题比较大,推荐:汉字鸭子类型12〃当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就能够被称为鸭子〃我们并不关心对象是什么类型,到底是不是鸭子,只关心行为比如在python中,有很多file-like东西,比如StringIO,GzipFile,socket它们有很多相同方法,我们把它们看成文件使用又比如list.extend方法中,我们并不关心它参数是不是list,只要它是可迭代,所以它参数能够是li st/tuple/di ct/字符串/生成器等.鸭子类型在动态语言中经常使用,非常灵活,使得python不想java那样专门去弄一大堆设计模式中重载13Python引自知乎函数重载主要是为了处理两个问题可变参数个数
2.可变参数类型
1.另外,一个基本设计标准是,仅仅当两个函数除了参数类型和参数个数不一样以外,其功效是完全相同,此时才使用函数重载,假如两个函数功效其实不一样,那么不应该使用重载,而应该使用一个名字不一样函数,,,好吧那么对于情况1,函数功效相同不过参数类型不一样python怎样处理?答案是根本不需要处理,因为python能够接收任何类型参数,假如函数功效相同,那么不一样参数类型在python中很可能是相同代码,没有必要做成两个不一样函数那么对于情况2,函数功效相同,但参数个数不一样,python怎样处理?大家知道,答案就是缺省参数对那些缺乏参数设定为缺省参数即可处理问题因为你假设函数功效相同,那么那些缺乏参数终究是需要用好了,鉴于情况1跟情况2都有了处理方案,python自然就不需要函数重载了新式类和旧式类14这个面试官问了,我说了老半天,不知道他问真正意图是什么.stackoverflow这篇文章很好介绍了新式类特征新式类很早在
2.2就出现了,所以旧式类完全是兼容问题,Python3里类全部都是新式类.这里有一个MRO问题能够了解下(新式类是广度优先,旧式类是深度优先),v Python关键编程>里讲也很多.和区分15new init这个new确实极少见到,先做了解吧.:def coinChangevalues,money,coinsUsed:lvalues数组2^valuesCounts钱币对应种类数3money找出来总钱数4#coinsUsed对应于现在钱币总数i所使用硬币数目5for centsin range1,money+1:#从第一个开始到money全部情况初始minCoins=centsfor valuein values:if value=cents:temp=coinsUsed[cents-value]+1if tempminCoins:minCoins=tempcoinsUsed[cents]-minCoins「面值为{}最小硬币数目为{}print
0112345.format cents,coinsUsed[cents]1516if_____name____==____main____1:5,values=[25,21,10,1]money=63。
个人认证
优秀文档
获得点赞 0