5.垃圾回收机制、交互、运算符、可变不可变类型

1.垃圾回收机制详解(了解)

  • 栈区与堆区

    • 栈区:变量名与值内存地址的关联关系存放于栈区
    • 堆区:变量值存放于堆区,内存管理回收的是堆区的内容
  • 引用计数

    x = 10	#直接引用:指的是从栈区出发直接引用到内存的地址
    print(id(x))
    
    l = ['a',x]	#间接引用:指的是从栈区出发引用到堆区后,再通过进一步引用才能到达的内存地址,一般指容器型数据
    print(id(l[1]))
    
  • 标记清除:解决引用计数循环引用问题

  • 分带回收:提升回收效率

2.与用户交互

  • 接收用户输入

    在python3中:input会将用户输入的所有内容都存成字符串类型

    age = input("请输入你的年龄: ")
    print(age,type(age))
    age = int(age)	#int只能将纯数字的字符串转化成整形
    

    在python2中:

    raw_input():用法与python3的input一模一样

    input():要求用户必须输入一个明确的数据类型,输入的是什么类型,输出的就是什么类型

  • 字符串的格式化输出

    • %,值按照位置与%s一一对应,少一个不行,多一个也不行;

      %s实际上可传入任意数据类型,%d只能接受int

      %%替代%符号

      ①按照位置传值

      res = 'my name is %s my age is %s' %('egon','18')
      res = 'my name is %s my age is %s' %('18','egon')
      res = 'my name is %s' %'egon'
      print(res)
      

      ②以字典形式,打破位置的限制

      res = '我的名字是 %(name)s 我的年龄是 %(age)s' %{'age':'18','name':'egon'}
      print(res)
      
    • str.format:兼容性好

      ①按照位置传值

      res = '我的名字是{} 我的年龄是{}'.format('egon',18)
      print(res)
      
      res = '我的名字是{0}{0}{0} 我的年龄是{1}{1}'.format('egon',18)
      print(res)
      

      ②打破位置限制,按照key=value传值

      res = '我的名字是{name}我的年龄是{age}'.format(age=18,name='egon')
      print(res)
      

      ③填充特殊数量字符

      print('{x}=========='.format(x='开始执行'))
      print('{x:=<10}'.format(x='开始执行')) # 字符串左对齐,不足10个的用=填充
      print('{x:=>10}'.format(x='开始执行')) # 字符串右对齐,不足10个的用=填充
      print('{x:=^10}'.format(x='开始执行')) # 字符串居中对齐,不足10个的用=填充
      

      ④精度与进制(四舍五入)

      print('{salary:.3f}.format(sarlary=1235.12345)') #精确到小数点后三位
      
    • f:python3.5以后才推出

      ①直接输出,{{}}代表输出{}符号,类似%

      x = input('your name: ')
      y = input('your age: ')
      res = f'我的名字是{x},我的年龄是{y}'
      print(res)
      

      ②{}内的字符串可以被当做表达式运行

      res = f'{10+3}'
      print(res)
      
      f'{print('aaa')}'
      
  • print

print('hello',end='')
print('world')
'''          
helloworld    #空字符替代换行
'''

print('hello',end='*')
print('world',end='*')
'''
hello*world*		#星号替代换行
'''

print('hello','world','egon')
'''
hello world egon    #逗号替代空格
'''

3.基本运算符

3.1算数运算符

print(10 + 3.1)
print(10 + 3)
print(10 / 3)  # 结果带小数
print(10 // 3)  # 只保留整数部分
print(10 % 3)  # 只保留余数
print(10 ** 3)  # 幂

3.2赋值运算符

=:变量的赋值

  • 增量赋值:
age = 18
age += 1 # age = age + 1
print(age)

age *= 3
age /= 3
age %= 3
age **= 3
  • 链式赋值
x = 10
y = x
z = y
z = y = x = 10
print(x, y, z)
print(id(x), id(y), id(z))
  • 交叉赋值
m = 10
n = 20
print(m, n)
# 交换值
# temp = m
# m = n
# n = temp
# print(m,n)

m, n = n, m
print(m, n)
  • 解压赋值
salaries = [111,222,333,444,555]
把五个月的工资取出来分诶赋值给不同的变量名
mom0=salaries[0]
mom1=salaries[1]
mom2=salaries[2]
mom3=salaries[3]
mom4=salaries[4]

print(mom0)
print(mom1)
print(mom2)
print(mom3)
print(mom4)
mom0,mom1,mom2,mom3,mom4=salaries #对应的变量名少一个不行

引入*,可以帮助我们取两头的值,默认不用来取中间的值
取前三个值
x,y,z,*_=salaries=[111,222,333,444,555]
*会将没有对应关系的值存成列表然后赋值给紧跟其后的那个变量名,此处变量名为为_

取后三个值
*_,x,y,z=salaries=[111,222,333,444,555]

解压字典默认解压出来的是key
x,y,z=dic={'a':1,'b':2,'c':3}
print(x,y,z)

4.可变不可变类型

  • 可变类型:值改变,id不变,证明改的是原值,证明原值是可以改变的(list、dict)
  • 不可变类型:值改变,id也变了,证明是产生了新的值,压根没有改变原值,证明原值是不可以被修改的(int、float、str、tuple)
posted @ 2020-10-30 22:30  Psc-mmf  阅读(66)  评论(0编辑  收藏  举报