zoukankan      html  css  js  c++  java
  • 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.
     

      

      
     
     
  • 相关阅读:
    monorepo使用教程
    pnpm教程
    Vite 从入门到精通,玩转新时代前端构建法则
    browserslist 目标浏览器配置表
    VS项目属性的一些配置项的总结
    FastAPI入门教程(持续更新中)
    FastAPI 学习之路(六十)打造系统的日志输出
    FastAPI 学习之路(六十一)使用mysql数据库替换sqlite数据库
    FastAPI 学习之路(五十九)封装统一的json返回处理工具
    FastAPI 学习之路(五十八)对之前的代码进行优化
  • 原文地址:https://www.cnblogs.com/zhoukaige/p/11153818.html
Copyright © 2011-2022 走看看