《Python技术必备:基础知识笔试面试全攻略.docx》由会员分享,可在线阅读,更多相关《Python技术必备:基础知识笔试面试全攻略.docx(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 Python函数参数传递看两个例子:Python la = 1def fun(a):fun(a) 5print a # 1Python la =def fun(a):a.append(1) :fun(a)Sprint a # 1全部变量都能够了解是内存中一个对象引用,或者,也能够看似C中void*感觉。这里记住是类型是属于对象,而不是变量。而对象有两种,可更改(mutable与不可更改(immutable ) 对象。在python中,strings, tuples,和numbers是不可更改对象,而list,diet等则是能够修改对象。(这 就是这个问题重点)当一个引用传递给函数时候,函数
2、自动复制T分弓I用,这个函数里引用和外边引用没有半毛关系了.所以第一 个例子里函数把引用指向了一个不可变对象,当函数返回时候,外面引用没半毛感觉.而第二个例子就不一样 了,函数内引用指向是可变对象,对它操作就和定位了指针地址一样,在内存里进行修改.假如还不明白话,这里有愈加好解释:2 Python 中元类(metaclass)1. new_是一个静态方法,而_init_是一个实例方法.2. new方法会返回一个创建实例,而init什么都不返回.3. 只有在_new_返回一个Cis实例时后面_init_才能被调用.4. 当创建一个新实例时调用_ new_初始化一个实例时用_i nitstacko
3、verflow ps: _metaclass_是创建类时起作用.所以我们能够分别使用_metaclass,new_和_init来分别在类创建,实例创建和实例初始化时候做一些小手脚.16单例模式这个绝对常考啊.绝对要记住12个方法,当初面试官是让手写.1使用_new方法Pythonclass Singleton(object):def _new_(cis, *args, *kw):if not hasattr(clszinstance):orig = super(Singleton, cis)cis._instance = orig._new_(cis, *args, *kw)return ci
4、s._instance8class MyClass(Singleton):a = 12共享属性创建实例时把全部实例_色“_指向同一个字典,这么它们具备相同属性和方法.Pythonclass Borg(object):_state = def _new_(cis, *args, *kw):ob = super(Borg, cis)._new_(cis, *args, *kw) ob._diet_ = cis._statereturn ob7class MyClass2 (Borg):a = 13装饰器版本Pythondef singleton (cis, *args, *kw):instance
5、s = def getinstance ():if cis not in instances:instancescis = cis (*argsA *kw) return instancescisreturn getinstance8singletonclass MyClass:4 import方法作为python模块是天然单例模式Python1# mysingleton.pyz class My_Singleton(object):def foo(self):pass56my_singleton = My_Singleton()8 # to usefrom mysingleton inort
6、 my_singleton 10my_singleton.foo()17 Python中作用域Python中,一个变量作用域总是由在代码中被赋值地方所决定。当Python碰到一个变量话他会按照这么次序进行搜索:当地作用域(Local ) 一当前作用域被嵌入当地作用域(Enclosing locals ) 一全局/模块作用域(Global ) 一内置作用域(Built-in )18 GIL线程全局锁线程全局锁(Global Interpreter Lock),即Python为了确保线程安全而采取独立线程运行限制,说白了就是 一个核只能在同一时间运行一个线程.见Python最难问题处理方法就是多进
7、程和下面协程什办程也只是单CPU,不过能减小切换代价提升性能).19协程知乎被问到了,呵呵哒,跪了简单点说协程是进程和线程升级版,进程和线程都面临着内核态和用户态切换问题而花费许多切换时间,而协程就是用户自己控制切换时机,不再需要陷入系统内核态.Python里最常见yield就是协程思想!能够查看第九个问题.20闭包闭包(closure)是函数式编程主要语法结构。闭包也是一个组织代码结构,它一样提升了代码可重复使用性。当一个内嵌函数引用其外部作作用域变量,我们就会得到一个闭包.总结一下,创建一个闭包必须满足以下几点:1. 必须有一个内嵌函数2. 内嵌函数必须引用外部函数中变量3. 外部函数返回
8、值必须是内嵌函数感觉闭包还是有难度,几句话是说不明白,还是查查相关资料.重点是函数运行后并不会被撤消,就像16题instance字典一样,当函数运行完后,in stance并不被销毁,而是继续留在内存空间里.这个功效类似类里类变量,只不过迁移到了函数上.闭包就像个空心球一样,你知道外面和里面,但你不知道中间是什么样.21 lambda 函数其实就是一个匿名函数,为何叫lambda?因为和后面函数式编程关于.推荐:知乎22 Python函数式编程这个需要适当了解一下吧,毕竟函数式编程在Python中也做了引用.推荐:酷壳python中函数式编程支持: filter函数功效相当于过滤器。调用一个布
9、尔函数来迭代遍历每个seq中元素;返回一个使bool_seq返回值为true元素序列。Pythonla = 1,2,3, 4,5, 6,72b = filter(lambda x: x 5, a)3print b46Z7m叩函数是对一个序列每个项依次执行函数,下面是对一个序列每个项都乘以2:Python1 a = map(lambda x:x*2z lz2,3)/ list (a)32Z4, 6reduce函数是对一个序列每个项迭代调用函数,下面是求3阶乘:Python reduce(lambda y:x*y,range(1,4)2623 Python里拷贝弓 I用和 copy(),deepc
10、opy()区分Pythonimport copylz 2, 3, 4, a b#原始对象4b = a #赋值,传对象引用5c = copy .copy (a)#对象拷贝,浅拷贝6d = copy .deepcopy (a),对象拷贝,深拷贝78a.append (5) #修改对象a9a 4 . append ( c*) #修改对象a中0 ,1数组对象10llprint * a = , a 12print *b = , b 13print 1c = , cImprint *d = *, d输出结果:17a =1,18b =1,19c =1,20d =1,2, 3, 4,2, 3, 4,2, 3,
11、 4,2, 3, 4,15cM, 50, b, e, 50, 3, ca1, b24 Python垃圾回收机制Python GC主要使用引用计数(reference counting )来跟踪和回收垃圾。在引用计数基础上,经过标 识-去除(mark and sweep )处理容器对象可能产生循环引用问题,经过分代回收 (generation collection )以空间换时间方法提升垃圾回收效率。1引用计数PyObject是每个对象必有内容,其中ob_refcnt就是做为引用计数。当一个对象有新引用时,它 ob_refcnt就会增加,当引用它对象被删除,它ob_refcnt就会降低.引用计数
12、为0时,该对象生命就 结束了 O优点:1. 简单缺点:1 .维护引用计数消耗资源2 .循环引用2标识-去除机制基本思绪是先按需分配,等到没有空闲内存时候从存放器和程序栈上引用出发,遍历以对象为节点、以引 用为边组成图,把全部能够访问到对象打上标识,然后清扫一遍内存空间,把全部没标识对象释放。3分代技术分代回收整体思想是:将系统中全部内存块依照其存活时间划分为不一样集合,每个集合就成为一个代, 垃圾搜集频率伴随代存活时间增大而减小,存活时间通常利用经过几次垃圾回收来度量。Python默认定义了三代对象集合,索引数越大,对象存活时间越长。举例:当一些内存块M经过了 3次垃圾搜集清洗之后还存活时,我
13、们就将内存块M划到一个集合A中去,而新 分配内存都划分到集合B中去。当垃圾搜集开始工作时,大多数情况都只对集合B进行垃圾回收,而对集 合A进行垃圾回收要隔相当长一段时间后才进行,这就使得垃圾搜集机制需要处理内存少了,效率自然就 提升了。在这个过程中,集合B中一些内存块因为存活时间长而会被转移到集合A中,当然,集合A中实 际上也存在一些垃圾,这些垃圾回收会因为这种分代机制而被延迟。25 PythonList推荐:26 Pythonisis是对比地址尸二是对比值27 read,readline fQ readlines read读取整个文件 readline读取下一行,使用生成器方法 readli
14、nes读取整个文件到一个迭代器以供我们遍历28 Python2 和 3 区分推荐:和3.x版本主要区分操作系统1 selectfpoll 和 epoll其实全部I/O都是轮询方法,只不过实现层面不一样罢了.这个问题可能有点深入了,但相信能回答出这个问题是对I/O多路复用有很好了解了.其中tornado使用就是 epoll.seleqpoll和epoll区分总结基本上select有3个缺点:1.连接数受限poll改进了第一个缺点epoll改了三个缺点.关于epoll:2调度算法1. 先来先服务(FCFS, First Come First Serve)2. 短作业优先(SJF, Shortest
15、 Job First)3. 最高优先权调度(Priority Scheduling)4. 时间片轮转(RR, Round Robin)5. 多级反馈队歹I调度(multilevel feedback queuescheduling)实时调度算法:1. 最早截至时间优先EDF2. 最低松弛度优先LLF3死锁原因:1. 竞争资源2. 程序推进次序不妥必要条件:1. 互斥条件2. 请求和保持条件3. 不剥夺条件4. 环路等候条件处理死锁基本方法:1. 预防死锁(摒弃除1以外条件)2. 防止死锁(银行家算法)3. 检测死锁(资源分配图)4. 解除死锁1. 剥夺资源2. 撤消进程4程序编译与链接推荐:B
16、ulid过程能够分解为4个步骤预处理(Prepressing),编译(Compilation)、汇编(Assembly)、链接 (Linking)以c语言为例:1预处理预编译过程主要处理那些源文件中以#开始预编译指令,主要处理规则有:这个非常不惯用,不过像ORM这种复杂结构还是会需要,详情请看太深刻了解Python中元类(metaclass)3 staticmethod fnclassmethodPython其实有3个方法,即静态方法(staticmethod),类方法(classmethod)和实例方法,以下:Pythondef foo (x):print executing foo(%s)
17、n%(x)4class A(object):def foo(self,x):print executing foo (%s, %s) *% (self zx)classmethoddef class foo(clsz x):10print executing class_foo (%sz%s) ,% (cls,x)1112staticmethod13def static foo (x):14print executing static foo (%s) 1%x15L6a=A()这里先了解下函数参数里面self和cis.这个self和cis是对类或者实例绑定,对于通常函数来说我们能够这 么调用f
18、oo (x),这个函数就是最惯用,它工作跟任何东西(类,实例)无关.对于实例方法,我们知道在类里每次定义方法时候都需要绑定这个实例,就是foo (self, x),为何要这么做呢?因为实例方法调用离不开实例,我们需要把实例自己传给函数调用时候是这么a-foo (x)(其实是foo (a, x).类方法一样,只不过它传递是类而不是实例,A. class_foo(x).注意这里self和cis能够替换别参数,不过python约定是这俩,还是不要改好.对于静态方法其实和普通方法一样,不需要对谁进行绑定,唯一区分是调用时候需要使用 a.static foo (x)或者A. static foo (x)
19、来调用.1. 将全部#define删除,并展开所用宏定义2. 处理全部条件预编译指令,比如#if、#ifdef、 #elif、#endif3. 处理#include预编译指令,将被包含文件插入到该编译指令位置,注:此过程是递归进行4. 删除全部注释5. 添加行号和文件名标识,方便于编译时编译器产生调试用行号信息以及用于编译时产生编译错误或警告时可显示行号6. 保留全部#pragma编译器指令。2编译编译过程就是把预处理完文件进行一系列词法分析、语法分析、语义分析及优化后生成对应汇编代码文件。 这个过程是整个程序构建关键部分。3汇编汇编器是将汇编代码转化成机器能够执行指令,每一条汇编语句几乎都是
20、一条机器指令。经过编译、链接、 汇编输出文件成为目标文件(Object File)4链接链接主要内容就是把各个模块之间相互引用部分处理好,使各个模块能够正确拼接。链接主要过程包块地址和空间分配(Address and Storage Allocation )、符号决议(Symbol Resolution) 和重定位(Relocation)等步骤。5静态链接和动态链接静态链接方法:静态链接时候,载入代码就会把程序会用到动态代码或动态代码地址确定下来 静态库链接能够使用静态链接,动态链接库也能够使用这种方法链接导入库动态链接方法:使用这种方式程序并不在一开始就完成动态链接,而是直到真正调用动态库代
21、码时,载入 程序才计算(被调用那部分)动态代码逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时, 载入程序又去计算这部分代码逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间性能比不上 静态链接程序6虚拟内存技术虚拟存放器是值具备请求调入功效和置换功效,能从逻辑上对内存容量加以扩充一个存放系统.7分页和分段分页:用户程序地址空间被划分成若干固定大小区域,称为页,对应地,内存空间分成若干个物理块, 页和块大小相等。可将用户程序任一页放在内存任一块中,实现了离散分配。分段:将用户程序地址空间分成若干个大小不等段,每段能够定义一组相对完整逻辑信息。存放分配时, 以段为单位,段与段在
22、内存中能够不相邻接,也实现了离散分配。分页与分段主要区分1. 页是信息物理单位,分页是为了实现非连续分配,方便处理内存碎片问题,或者说分页是因为系统管理需要.段是信息逻辑单位,它含有一组意义相对完整信息,分段目标是为了愈加好地实现共享,满足用户2. 页大小固定,由系统确定,将逻辑地址划分为页号和页内地址是由机器硬件实现.而段长度却不固定,决定于用户所编写程序,通常由编译程序在对源程序进行编译时依照信息性质来划分.3. 分页作业地址空间是一维.分段地址空间是二维.8页面置换算法1. 最好置换算法OPT:不可能实现2. 先进先出FIFO3. 最近最久未使用算法LRU:最近一段时间里最久没有使用过页
23、面给予置换.4. clock 算法9边缘触发和水平触发边缘触发是指每当状态改变时发生一个io事件,条件触发是只要满足条件就发生一个io事件数据库1事务数据库事务(Database Transaction) z是指作为单个逻辑工作单元执行一系列操作,要么完全地执行,要么完全地不执行。2数据库索引推荐:MySQL索引背后数据结构及算法原理聚集索弓I,非聚集索弓l,B-Tree,B+Tree,最左前缀原理3 Redis原理4乐观锁和消极锁消极锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性操作乐观锁:假设不会发生并发冲突,只在提交操作时检验是否违反数据完整性。5 MVCC6 MylSAM 和 In
24、noDBMylSAM适合于一些需要大量查询应用,但其对于有大量写操作并不是很好。甚至你只是需要update 一 个字段,整个表都会被锁起来,而别进程,就算是读进程都无法操作直到读操作完成。另外,MylSAM对 于SELECT COUNTS)这类计算是超快无比。InnoDB趋势会是一个非常复杂存放引擎,对于一些小应用,它会比MylSAM还慢。他是它支持行锁, 于是在写操作比较多时候,会更优异。而且,他还支持更多高级应用,比如:事务。网络1三次握手1.客户端经过向服务器端发送一个SYN来创建一个主动打开,作为三路握手一部分。客户端把这段连接序号设定为随机数A。2.服务器端应该为一个正当SYN回送一
25、个SYN/ACK。ACK确实认码应为A+l , SYN/ACK包本身又有一个随机序号B。3.最终,客户端再发送一个ACKO当服务端受到这个ACK时候,就完成了三路握手,并进入了连接创建状态。此时包序号被设定为收到确实认号A+1 ,而响应则为B + 1。2四次挥手3 ARP协议地址解析协议(Address Resolution Protocol):依照IP地址获取物理地址一个TCP/IP协议4urllibflurllib2 区分这个面试官确实问过,当初答urllib2能够Post而urllib不能够.1. urllib提供urlencode方法用来GET查询字符串产生而urllib2没有。这是为
26、何urllib常和urllib2一起使用原因。2. urllib2能够接收一个Request类实例来设置URL请求headers , urllib仅能够接收URL。这意味着,你不能够伪装你User Agent字符串等。5 Post 和 GetGET和POST有什么区分?及为何网上多数答案都是错get: RFC 2616 一 Hypertext Transfer Protocol 一 HTTP/1.1post: RFC 2616 - Hypertext Transfer Protocol 一 HTTP/1.16 Cookie 和 SessionCookieSession储存位置客户端服务器端目标
27、 跟踪会话,也能够保留用户偏好设置或者保留用户名密码等跟踪会话安全性 不安全安全session技术是要使用到cookie ,之所以出现session技术,主要是为了安全。7 apache 和 nginx 区分nginx相对apache优点: 轻量级,一样起web服务,比apache占用更少内存及资源 抗并发,nginx处理请求是异步非阻塞,支持更多并发连接,而apache则是阻塞型,在高并发下nginx能保持低资源低消耗高性能 配置简练 高度模块化设计,编写模块相对简单 小区活跃apache相又寸nginx优点:rewrite ,比 nginx rewrite 强大 模块超多,基本想到都能够找
28、到 少bug , nginx bug相对较多超稳定8网站用户密码保留2. 明文hash后保留,如md53. MD5+Salt方式,这个salt能够随机4. 知乎使用了 Bcrypy(好像)加密9 HTTP和 HTTPS状态码1XX汇报2xx成功3xx重定向4xx客户端犯错5xx服务器犯错定义接收到请求,继续进程步骤成功接收,被了解,并被接收为了完成请求,必须采取深入方法请求包含错次序或不能完成服务器无法完成显然有效请求403: Forbidden404: Not FoundHTTPS握手/寸称力口密,非对称力口密,TLS/SSL,RSA10 XSRF 和 XSS CSRF(Cross-site
29、 request forgery)跨站请求伪造 XSS(Cross Site Scripting)跨站脚本攻击CSRF重点在请求,XSS重点在脚本11 幕等 IdempotenceHTTP方法幕等性是指一次和数次请求某一个资源应该具备一样副作用。(注意是副作用)get ,不会改变资源状态,不论调用一次还是N次都没有副作用。请注意,这里强调是一次和N次具备 相同副作用,而不是每次GET结果相同。GET,但它本身并没有产生任何副作用,因而是满足幕等性。DELETE方法用于删除资源,有副作用,但它应该满足幕等性。比如:DELETE ,调用一次和N次对系统 产生副作用是相同,即删掉id为4231帖子;
30、所以,调用者能够数次调用或刷新页面而无须担心引发错误。POST所对应URI并非创建资源本身,而是资源接收者。比如:POST :/. com/articles下创建一篇 帖子,HTTP响应中应包含帖子创建状态以及帖子URL两次相同POST请求会在服务器端创建两份资源, 它们具备不一样URI ;所以,POST方法不具备幕等性。PUT所对应URI是要创建或更新资源本身。比如:put。对同一 URI进行数次PUT副作用和一次PUT 是相同;所以,PUT方法具备黑等性。12 RESTful 架构(SOAP,RPC)推荐:13 SOAPSOAP (原为Simple Object Access Protoc
31、ol首字母缩写,即简单对象访问协议)是交换数据一个协议 规范,使用在计算机网络Web服务(web service )中,交换带结构信息。SOAP为了简化网页服务器(Web Server)从XML数据库中提取数据时,节约去格式化页面时间,以及不一样应用程序之间按照HTTP通 信协议,遵从XML格式执行资料交换,使其抽象于语言实现、平台和硬件。14 RPCRPC( Remote Procedure Call Protocol ) 远程过程调用协议,它是一个经过网络从远程计算机程序 上请求服务,而不需要了解底层网络技术协议。RPC协议假定一些传输协议存在,如TCP或UDP,为通 信程序之间携带信息数
32、据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包含网络 分布式多程序在内应用程序愈加轻易。总结:服务提供两大流派.传统意义以方法调用为导向通称RPC。为了企业SOA,若干厂商联合推出 webservice,制订了 wsdl接口定义传输so叩,当互联网时代臃肿SOA被简化为http+xml/json.不过简化 出现各种混乱。以资源为导向,任何操作无非是对资源增删改查,于是统一 REST出现了.进化次序:RPC - SOAP - RESTful15 CGI 和 WSGICGI是通用网关接口,是连接web服务器和应用程序接口,用户经过CGI来获取动态数据或文件等。CGI程序是
33、一个独立程序,它能够用几乎全部语言来写,包含perl , c , lua , python等等。WSGIZ Web Server Gateway Interface,是Python应用程序或框架和Web服务器之间一个接口,WSGI 其中一个目标就是让用户能够用统一语言(Python)编写前后端。官方说明:PEP-333316中间人攻击在GFW里屡见不鲜,呵呵.中间人攻击(Man-in-the-middle attack ,通常缩写为MITM )是指攻击者与通讯两端分别创建独立联络, 并交换其所收到数据,使通讯两端认为他们正在经过一个私密连接与对方直接对话,但实际上整个会话都 被攻击者完全控制。
34、17 clOk问题所谓clOk问题,指是服务器同时支持成千上万个客户端问题也就是concurrent 10 000 connection(这 也是clOk这个名字由来)。推荐:18 socket推荐:Socket=Ip address+ TCP/UDP + port19浏览器缓存推荐:304 Not Modified20 HTTP1.0 和 HTTP1.1推荐:1.请求头Host字段,一个服务器多个网站2.长链接实例方法a = A()a.foo(x)A不可用更多关于这个问题:类方法a.class_foo(x)A.class_foo(x)静态方法a.static_foo(x)A.static_f
35、oo(x)4类变量和实例变量Pythonclass Person:name=,aaan pl=Person ()5p2=Person ()Cpl.name=nbbb7print pl.name # bbb8print p2.name # aaa9print Person.name # aaa类变量就是供类使用变量,实例变量就是供实例使用.这里pl.name=”bbb”是实例调用了类变量,这其实和上面第一个问题一样就是函数传参问题,pl. name 一开始是指向类变量 name=naaanz不过在实例作用域里把类变量引用改变了,就变成了一个实例变 ftself.name 不再弓I用 Person
36、 类变量 name 了.能够看看下面例子:Pythonclass Person:name=3pl=Person ()5p2=Person()pl.name.append(1)3.文件断点续传4.身份认证,状态管理,Cache缓存21 AjaxAJAX,Asynchronous JavaScript and XML (异步 JavaScript 和 XML ),是与在不重新加载整个页面情 况下,与服务器交换数据并更新部分网页技术。*NIXunix进程间通信方式(IPC)1. 管道(Pipe ):管道可用于具备亲缘关系进程间通信,允许一个进程和另一个与它有共同祖先进 程之间进行通信。2. 命名管道
37、(named pipe ):命名管道克服了管道没有名字限制,所以,除具备管道所具备功效 外,它还允许无亲缘关系进程间通信。命名管道在文件系统中有对应文件名。命名管道经过命令mkfifo 或系统调用mkfifo来创建。3. 信号(Signal):信号是比较复杂通信方式,用于通知接收进程有某种事件发生,除了用于进程 间通信外,进程还能够发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支 持语义符合Posix.l标准信号函数sigaction (实际上,该函数是基于BSD , BSD为了实现可靠信号 机制,又能够统一对外接口,用sigaction函数重新实现了 sign
38、al函数)。4. 消息(Message )队列:消息队列是消息链接表,包含Posix消息队列system V消息队列有 足够权限进程能够向队列中添加消息,被赋予读权限进程则能够读走队列中消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺5. 共享内存:使得多个进程能够访问同一块内存空间,是最快可用IPC形式。是针对其余通信机制运行效率较低而设计。往往与其它通信机制,如信号量结合使用,来达成进程间同时及互斥。6. 内存映射(mapped memory ):内存映射允许任何多个进程间通信,每一个使用该机制进程经 过把一个共享文件映射到自己进程地址空间来实现它。7.
39、 信号量(sem叩hore ):主要作为进程间以及同一进程不一样线程之间同时伎俩。8. 套接口( Socket):更为通常进程间通信机制,可用于不一样机器之间进程间通信。起初是由 Unix系统BSD分支开发出来,但现在通常能够移植到其它类Unix系统上:Linux和System V变种 都支持套接字。数据结构1红黑树红黑树与AVL比较:AVL是严格平衡树,所以在增加或者删除节点时候,依照不一样情况,旋转次数比红黑树要多;红黑是用非严格平衡来换取增删节点时候旋转次数降低;所以简单说,假如你应用中,搜索次数远远大于插入和删除,那么选择AVL ,假如搜索,插入删除次数几 乎差不多,应该选择RB。编程
40、题1台阶问题/斐波纳挈一只青蛙一次能够跳上1级台阶,也能够跳上2级。求该青蛙跳上一个n级台阶总共有多少种跳法。Pythonfib = lambda n: n if n = 2 else fib (n - 1) + fib (n - 2)第二种记忆方法Python1 def memo(func):cache = def wrap (*args):if args not in cache:cacheargs = func (*args)return cacheargsreturn wrap900 memodef fib (i):if i 2:return 1return fib (i-1) + f
41、ib(i-2)第三种方法Pythondeffib(n):a, b = 0, 1for _ in xrange (n):a, b = b, a + breturn b变态台阶问题一只青蛙一次能够跳上1级台阶,也能够跳上2级它也能够跳上n级。求该青蛙跳上一个n级台阶总 共有多少种跳法。Python- fib = lambda n: n if n 2 else 2 * fib(n - 1)3矩形覆盖我们能够用2-1小矩形横着或者竖着去覆盖更大矩形。请问用n个2*1小矩形无重合地覆盖一个2*n大矩形,总共有多少种方法?第2夫n个矩形覆盖方法等于第2* (n-l)加上第2夫(n-2)方法。Python1
42、f = lambda n: 1 if n 2-3-4 转换成 2-1 -4-3.Pythonclass ListNode: def _init_(self, x):self.val = xself.next = None6class Solution:# param a ListNode# (return a ListNodedef swapPairs(self, head):if head != None and head.next != None:next = head.nexthead.next = self.swapPairs(next.next)next.next = headret
43、urn nextreturn head7创建字典方法1直接创建Pythondiet = Tname *:* earth *, port:802工厂方法Pythonlitems=(* name *,* earth *)f (* port, 80 *)2dict2=dict(items)3dictl=dict(name *, earth *, port * z* 80 *)3 fromkeys()方法Pythonldictl=.fromkeys(x* A* y1)z-1)2dict=* x *:-1z* y *:-1)3dict2=.fromkeys(* x *, * y*)4dict2=*x:Noner* y :None8合并两个有序列表知乎远程面试要求编程尾递归Python1 def _recursion_merge_sort2(11, 12, tmp):if len (11) = 0 or len (12) = 0:tmp.extend(11)return tmpelse:if 11 0 12 0:tmp.append(110)del 110else:tmp.append(120)del 12 0return _recursion_merge_sort2 (llz 12, tmp)1415def recursion_merge_sort2(
限制150内