zoukankan      html  css  js  c++  java
  • 疫情环境下的网络学习笔记 python Day 05

    今日内容

    1. 垃圾回收机制
      • 引用计数
      • 标记清楚
      • 分代回收
    2. 与用户交互
      • 接收用户输入
        • input:py3,py2
      • 格式化输出
        • 按照某种格式,往格式里传入不同的值,%,format,f’{}’
    3. 基本运算符
      1. 算术运算符
      2. 赋值运算符:交叉,链式
      3. 比较运算符
      4. 逻辑运算符:and not or
      5. 成员运算符:in
      6. 身份运算符:is

    正课

    垃圾回收机制

    直接引用:变量名直接关联变量值

    x = 10
    y=x
    print(y) # 10的引用计数为1
    

    间接引用:容器通过变量名访问,只出现在容器类型里(字典列表集合)

    l = ['a',x]
    print(l[2])  # 10的引用计数为2
    

    什么是垃圾回收:简称GC,python解释器自带的一种机制

    为什么要用:帮助管理内存

    怎么用:python解释器自己运行

    列表在内存中的存储方法

    • 列表不存放真正的值,而是存放列表名与值绑定的内存地址,等于是个值的内存地址的目录。

    • 取到索引对应值的内存地址,再通过这个内存地址找到对应的值

      x = 10
      l=['a',x]  # 此处的x存的是 10 的内存地址,而不是x对应的值
      x=123 # 新开辟一个内存地址,将x与10解绑,再将x与10绑定,10的内存地址和值不变
      print(l[1])  # l[1]仍然指向10的内存地址,所以输出结果 10
      

    交叉引用

    • 对两个列表l1和l2

      l1 = [111,]
      l2 = [111,]
      l1.append(l2) # l1引用l2,计数+1
      l2.append(l1) # l2引用l1,计数+1
      

      则现在列表l1和l2之间存在相互引用

      此时

      del l1
      del l2
      

      解除l1,l2与其值的绑定关系,则此时无法被变量名访问到,应该被回收。但由于l1,l2互相引用,其引用计数不为0,所以无法被回收

    标记清除

    互相引用问题会导致垃圾无法被回收,标记清除就是用来清除循环引用情况下引用计数无法清除的垃圾

    变量存储空间分为两个区域,堆区与栈区,变量名存放在栈区,变量值存放在堆区

    标记清除不会时时启用,在内存将要耗尽才会启用

    分代回收

    标记清除只是引用计数的缺点的一个解决方案,主要的管理内存方法还是引用计数。引用计数要定时启动运行,效率较低

    分代回收:用来降低引用计数的扫描频率,提升垃圾回收的效率

    例子:对班上的人区别待遇,对尖子生检查作业的频率更少,对捣蛋的学生检查作业频率更高

    分代回收的核心思想:在历经多次扫描的情况下,都没有被回收的变量,垃圾回收机制就会认为,该变量是常用变量,对其扫描的频率会降低

    用户交互

    • 什么是用户交互:
      • 用户交互就是人往计算机中input/输入数据,计算机print/输出结果
    • 为什么要有用户交互
      • 为了让计算机能够像人一样与用户沟通交流,接收人的指令
    • 怎么用

    接收用户输入

    接收用户的输入:input

    user_name = input('输入用户名:')
    print(user_name)
    

    python3中input会将输入的所有内容保存成字符串类型

    int() :将纯数字组成的str转换成整型,若不是纯数字则报错

    • python2中input:要求用户必须输入一个明确的数据类型,输入的是什么类型,就存成什么类型
    • python2中 raw_input 与python3中一样,存成str

    格式化输出

    print 普通输出

    格式化字符的三种形式:%,format,f

    • %s,%d

      • 右侧传值按顺序填入左边的%内,如果右边的值不够或多了都报错

        name = 'deimos'
        age =18
        print('my name is %s,my age is %s'%(name,age))  #按照变量接收值
        
      • 以字典形式传值,不用按位置

        name = 'deimos'
        age =18
        print('my name is %(name)s,my age is %(age)s'%{'name':'deimos','age':18})
        

        %d 只能传入整型,如果传入浮点型会得到整型

    • str.format (推荐使用)

      • format方法,按照位置传值

        print('my name is{},my age is{}'.format('deimos'n18))
        
      • 打破位置方法,按照key=value传值

        print('my name is{name},my age is{age}'.format(age = 18, name = 'deimos'))
        
    • f:python3.5以后开始支持

      •   x = input('input your name:')
          y = input('input your age:')
          res = f'my name is {x},my age is {y}'
        

    三种方式速度有差别:

    ​ f > format > %s,推荐使用format,因为兼容性好

    基本运算符

    1. 算术运算符:加减乘除

      除法:/ 结果带小数,地板除 // 结果只保留整数部分

      幂运算:**,取模:%

    2. 比较运算符:

      > < >= <= == != 返回结果True / False

    3. 赋值运算符

      1. 增量赋值:age = age + 1,简写 :age += 1

        变量名在左边,运算符号和等号黏在一起

        • age += 3 #age = age + 3
        • age *= 3 #age = age ** 3
      2. 链式赋值:想要把一个值绑定给多个变量名

        z = y = x = 10  # 相当于x=10,y=x,z=y
        
      3. 交叉赋值:把两个变量的变量值互换

        以往可以用一个第三者变量,在覆盖变量前存储

        x,y=y,x  # python内部帮你做了这几步
        

        交换完后x,y指向的内存地址交换

      4. 解压赋值:

        要将列表中的多个值赋值,用索引一个个取值

        lis = [111,22,33,44,55]
        a=lis[0]
        b=lis[1]
        

        可以使用解压赋值

        lis = [111,22,33,44,55]
        a,b,c,d,e=lis
        

        这样赋值,如果左边变量个数与右边元素个数不一样会报错

        引入 * 帮助我们取两头的值,无法取中间的值

        •   lis = [111,22,33,44,55]
            a,b,*_=lis
            print(a,b,_)
            # 输出结果 111 22 [33, 44, 55]
          

          其中 * 把列表中剩下没有赋值的元素,存成一个列表,赋值给下划线_

          在python中通常用下划线_ 表示废弃的变量,仅用作占位

        •   lis = [111,22,33,44,55]
            *_,a,b=lis
            print(a,b,_)
            # 输出结果 44 55 [111, 22, 33]
          
        • 把要赋值的变量放在两头,中间用*_放不需要的元素,也可也

        • 对字典进行解压赋值,得到的结果是字典的key

  • 相关阅读:
    Android Sensor Test
    [转]Android重力感应开发
    nexus5 root教程
    C# split字符串 依据1个或多个空格
    leetcode
    [ffmpeg 扩展第三方库编译系列] 关于须要用到cmake 创建 mingw32编译环境问题
    JAVA网络爬虫WebCollector深度解析——爬虫内核
    Apache htaccess 重写假设文件存在!
    javascript --- 事件托付
    LeetCode——Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/telecasterfanclub/p/12420844.html
Copyright © 2011-2022 走看看