一 . 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.
 

  

 


  
 

 

 

 

posted on 2019-07-08 21:01  大肠刺身  阅读(121)  评论(0编辑  收藏  举报