疫情环境下的网络学习笔记 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

posted @ 2020-03-05 16:14  黑猫警长紧张  阅读(105)  评论(0编辑  收藏  举报