Python基础回顾总结
一 . Python入门
1.编程语言分为编译型和解释型
#1. 编译型(需要编译器,相当于用谷歌翻译):如C,执行速度快,调试麻烦
#2. 解释型(需要解释器,相当于同声传译):如python,执行速度慢,调试方便
优点:
#编译型语言执行速度快,不依赖语言环境运行,跨平台差
#解释型跨平台好,一份代码,到处使用,缺点是执行速度慢,依赖解释器运行
2.Python有哪些种类
#CPython:
CPython是使用最广且被的Python解释器。
当我们从Python官方网站下载并安装好Python 2.7后,我们就直接获得了一个官方版本的解释器:CPython。
这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。
#IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,
但是执行Python代码的功能和CPython是完全一样的。好比很多国产浏览器虽然外观不同,但内核其实都是调用了IE。
CPython用>>>作为提示符,而IPython用In [序号]:作为提示符。 #PyPy
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),
所以可以显著提高Python代码的执行速度。绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,
就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,
就需要了解PyPy和CPython的不同点。
#Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行 #IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,
可以直接把Python代码编译成.Net的字节码。
3.小整数池(优化机制)
Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池,范围是[-5,256],该范围内的小整数对象是全局解释器范围内被重复使用, 永远不会被GC回收 4.变量的修改与内存管理(引用计数与垃圾回收机制) Python中垃圾回收是以引用计数为主,分带收集为辅
引用计数:
原理:跟踪每个值被引用的次数
流程: 1.声明了一个变量并将一个引用类型的值赋值给这个变量,这个引用类型值的引用次数就是1。 2.同一个值又被赋值给另一个变量,这个引用类型值的引用次数加1. 3.当包含这个引用类型值的变量又被赋值成另一个值了,那么这个引用类型值的引用次数减1. 4.当引用次数变成0时,说明没办法访问这个值了。 5.当垃圾收集器下一次运行时,它就会释放引用次数是0的值所占的内存。 一句话:引用计数就是跟踪每个值被引用的次数,如果引用次数为0则会被当做垃圾回收。这种机制简单,实时性好, 一旦没有引用就直接释放了。但是需要维护引用计数,而且当面对循环引用时会消耗大量资源,无法回收内存 会导致内存泄漏。 标记-清理 python标记删除时通过两个容器完成:死亡容器、存货容器 1.对执行删除操作后的每个引用-1,此时如果对象的引用为0则将其放入死亡容器中。把那些引用仍然大于0的放到存活容器 2.遍历存活容器,查看是否有的存活对象引用了死亡容器内的对象,如果有就把该对象从死亡容器中取出放入存活容器 3.删除死亡容器所有对象 一句话:标记-清理如果要删除循环引用,必须将循环引用的双发对象全部删除才可以被回收
分代收集
目的:更合理的进行标记-删除,需要对对象进行分代处理
1.新创建的对象作为0代
2.每执行一个标记-删除,存活的对象代数+1
3.代数越高的对象(存活越持久的对象),进行标记-删除的时间间隔就越长。这个间隔江湖人称阀值。
三种情况触发垃圾回收
1.调用gc.collect()
2.GC达到阀值
3.程序退出时
5.数据类型 int,float,str,list,dict,bool,set,tuple str: 单、双、三引号的区别:
单双引号没有区别,只有在一个str内出现了单引号时应该用双引号包裹,反之亦然
多行字符必须用三引号
逻辑运算:
not、or、and优先级: not > or > and
6.函数
*名称空间加载顺序*
#1、python解释器先启动,因而首先加载的是:内置名称空间
**#2、执行test.py文件,然后以文件为基础,加载全局名称空间
**#3、在执行文件的过程中如果调用函数,则临时产生局部名称空间
名字的查找顺序
**局部名称空间—->全局名称空间—->内置名称空间
闭包函数
内部函数引用了外部函数变量,且外部函数返回的是内嵌函数对象的一个嵌套函数。
意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹着一层作用域,这使得,该函数无论在何处调用,优先
使用自己外层包裹的作用域。
7.装饰器
* 装饰器就是闭包函数的一种应用场景*
开放封闭原则:对封闭修改,对外扩展开放
作用:在不改变装饰对象源代码和调用方式的情况下为函数添加新功能
可迭代对象指的是内置有__iter__方法的对象
什么是迭代器对象?
可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
而迭代器对象指的就是内置有—__iterII又内置有__next__方法的对象
迭代器对象一定是一个可迭代对象,而可迭代对象不一定是迭代器对象 优点: 提供一种统一的、不依赖于索引的迭代方式 惰性计算,节省内存 缺点: 无法获取长度(只有在next完毕才知道到底有几个值)
一次性的,只能往后走,不能往前退 9.生成器 只要函数内部有yield关键字,那么函数名()得到的结果就是生成器,并且不会执行函数代码 生成器就是迭代器 10.三元表达式 name=input('姓名>>: ')
res='SB' if name == 'alex' else 'NB' print(res)
11.列表推导式 egg_list=[]
for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i for i in range(10)] 12.生成器表达式 把列表推导式的[]换成()就是生成器表达式 #2、示例:生一筐鸡蛋变成给你一只老母鸡,用的时候就下蛋,这也是生成器的特性 >>> chicken=('鸡蛋%s' %i for i in range(5)) >>> chicken <generator object <genexpr> at 0x10143f >>> next(chicken)
'鸡蛋0' >>> list(chicken) #因chicken可迭代,因而可以转成列表 ['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4',] #3、优点:省内存,一次只产生一个值在内存中 13.递归调用的定义 递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用 递归调用函数会产生局部名称空间,占用内存,python解释器的内存管理机制为了防止其无限制占用内存,对函数的递归调用 做了最大的层级限制。 递归调用的两个明确阶段: 递推:从里向外一层一层结束递归 回溯:从外向里一层一层调用下去,回溯阶段必须有一个明确的结束条件,没进入下一次递归,问题规模都应该有所减少 否则无限制的重复调用自身是没有意义的 总结: 1.必须要有一个明确的结束条件 2.每次进入更深一层递归时,问题规模应相比上次递归有所减少 3.递归效率不高,层次过多会导致内存溢出,在python中递归效率低,且没有尾递归优化(在函数的最后一步而非最后一行调用自己)
14.
转载于//www.cnblogs.com/zhoukaige/p/11153818.html
还没有评论,来说两句吧...