今日内容:
    1、垃圾回收机制详解
        引用计数
        标记清除
        分代回收

    2、与用户交互
        接受用户输入
        格式化输出
    3、基本运算符
        算数运算符
        赋值运算符
        比较运算符
        逻辑运算符
        成员运算符
        身份运算符

    4、流程控制(if判断)
        if 条件 :
            代码块
        elif 条件 :
            代码块
        。。。
        else :
            代码块

----------上节课复习----------

----------今日内容-----------
    1、垃圾回收机制详解(简称GC,python解释自带的一种机制)
        解释器在执行代码的时候会申请内存空间,用来储存变量值;会在合适的时间回收这个用不到的变量值的内存空间。
      1.1、引用计数
        直接引用:变量值直接被捆绑给变量名
            eg:x=10
               y=x
               z=x
        间接引用(针对容器类型list&dict)
            eg:l=['a',x]  # 在内存中,列表先在一个小房间里放上索引对应的内存地址,'a'存的是'a'的内存地址,x存的是10的内存地址
               print (l[1])
      1.2、标记清除:扫描栈区,里面的变量名是否存活(有没有堆区里的地址直接引用);栈区的变量名(直接&间接都不存在)之后,清理所对应的堆区内的内存地址。
        循环引用=>导致内存泄漏问题
             eg:l1 = [111,]
                l2 = [222,]
                l1.append(l2)
                l2.append(l1)
                
                del l1  # 去掉列表l1的直接引用
                del l2  # 去掉列表l2的直接引用
###!!!去掉两个列表的直接引用之后,两者之间还是存在着间接引用,但是两者已经互相访问不到了(这种情况就是内存泄漏)
      1.3、分代回收
        关于引用计数的扫描栈区频率&优化。
            使用频率高的,提升一层权重,对这一层减低扫描频率;针对于使用频率低的扫描,从而优化工作效率。

    2、与用户交互
        2.1、接受用户输入
                # python3中
                    input会将用户输入的所有内容都存成字符串类型
                        eg:age = input('请输入你的年龄: ')
                           age = int(age)  # int只能讲纯数字的字符转成整型
                # python2.7
                    raw_input():用法与python3的input一模一样
                    input():要求用户必须输入一个明确的数据类型,输入的是什么类型,就存成什么类型
        2.2、格式化输出
                %(python诞生之初就存在,各个版本都可以使用)
                    值按照位置与%s一一对应,少了多了都不行
                      eg:res = 'my name is %s my age is %s' %('egon','18')
                         print (res)
                    以字典的形式传值,没有位置的限制,根据key传值
                    res = "my name is %(name)s my age is %(age)s" %{"name":'egon',"age":'18'}
                            %s可以接受任意类型
                                eg:print ('my age is %s' %18)
                                   print ('my age is %s' %[1,123])
                            %d只能接受int
                                eg:print ('my age is %d' %18)

                str.format(兼容性好,从2.6开始引入)
                    按照位置取值
                        res = 'my name is {} my age is {}'.format('egon',18)
                        print (res)
                        res = 'my name is {0} my age is {1}'.format('egon',18)
                        print (res)
                    按照key=value传值
                        res = 'my name is {name} my age is {age}'.format(age=18,name='name')
                        print (res)

                f''(3.5引入)
                    x = input('your name: ')
                    y = input('your age: ')
                    res = f'my name is {x} my age is {y}'
                    print (res)

###!!!常见的位format和f''
###!!!速度比较:f'' > format > %
###!!!推荐使用format

    3、基本运算符
       1、算数运算符
            print (10 + 3)
            print (10 \ 3)  # 结果带小数
            print (10 \\ 3)  # 地板除,只保留整数部分
            print (10 % 3)  # 取模、取余数
            print (10 ** 3)  # 取模、取余数

        2、比较运算符:>、>=、<、<=、==、!=
            !=  # 判断两个值是不是不相等

        3、赋值运算符
           3.3.1、=:变量的赋值

           3.3.2、增量赋值
                eg:age = 18
                   age += 1  # age = age + 1
                   print (age)

                   age *= 1
                   age /= 1
                   age %= 1
                   age **= 1
 
            3.3.3、链式赋值
                eg:z = y = x = 10

            3.3.4、交叉赋值
                eg:m = 10
                   n = 20
                   temp = m  # 中间者交换值
                   m = n
                   n = temp

                   m,n = n,m  # 交叉赋值,一行代码搞定上面三行

            3.3.5、解压赋值
                salaries = [111,222,333,444,555]  # 取出五个月的工资
                mon1 = salaries [0]
                mon2 = salaries [1]
                mon3 = salaries [2]
                mon4 = salaries [3]
                mon5 = salaries [4]
                print (mon1,mon2,mon3,mon4,mon5)

                mon1,mon2,mon3,mon4,mon5 = salaries  # python自动与列表内的值一一对应,进行赋值;左侧对应的变量名多了少了都不行
                print (mon1,mon2,mon3,mon4,mon5)

                引入*,可以帮我们取两头的值,无法取中间的值:
                    取前三个值  eg:x,y,z,*_ = salaries  # *代表全部,_当成剩下的变量名,通常当一个占位变量名。
                    取后三个值  eg:*_,x,y,z = salaries

        比较运算符
        逻辑运算符
            not、and、or
            区分优先级:not>and>or