Garbage collection entry of python, user interaction with the basic operators

First, the garbage collection mechanism

1. What is garbage?

	我们写代码过程中对变量引用过的一些值,在后续操作中这个值不在使用了,
没有变量能找到它了,我们称这个值是垃圾。

2. Why is garbage to be recycled

	在我们编写代码的过程中会有给变量赋值的操作,赋值过程中会在内存空间
中为值开辟出一个空间来存储这个值,然后将值的内存地址给到变量。变量与值地
址所在区域我们称为栈区,值所在区域称为堆区,例如:x=10,y=20 如下图

Variable value accessible location

	当执行x=y时x会指向20,x与10的关系解除了,没有变量可以找到10了,
10也就没意义了,当这样的值多了会大量占用内存,导致内存溢出,所以需要
进行垃圾回收,释放内存空间

3. What is garbage collection mechanism

	垃圾回收机制(简称GC)是Python解释器自带一种机,专门用来回收不可
用的变量值所占用的内存空间

4, the principle of garbage collection

4.1, the reference count

	引用计数就是值被变量名关联的次数。
	如:x=10
	我们就说10被关联了一次
	如果y=x,这样10也被y关联了,10的计数就 为2,这叫**计数增加**。
	del x   将x的关联解除,10的计数变为1,这叫**计数减少**。
	当计数被减为0时,该值没有变量与它关联,它就变为了垃圾,需要进行回
收

4.2, clear the mark

	有两个列表
	l1 = [1,2,l2]
	l2 = [1,2,l1]
	可以看到俩个列表互相引用,你中有我,我中有你。但是,这样会出现一个
问题,我们说一个值被回收有个前提,是没有关联计数了,如果我们将l1、l2的
关联解除 :
	del l1
	del l2
	这俩列表没有变量可以引用他们了,但由于他俩又在互相引用,引用计数不
为0,但是这俩列表又没有变量相关联也就不会被调用了,内存被占用。所以为了
解决这个问题引入了标记与清除。
	再运行程序到内存快满的时候,程序会停下来,进行扫描标记,标记什么呢?
就是那些引用计数不为0,但是又没有变量引用的数据,进行清除,释放内存。

4.3, recovered generational

	分代回收是为了提升python的回收效率设定的以空间换时间的方法。
	python会将数据进行分代,每次扫描垃圾时会将一些正在使用的值进行
标记,当标记积累到一定程度时会升代,然后,减少该值的扫描频率,增加扫描效
率。这会导致一些辈分高的数据不能及时回收,会占用内存空间,但会使扫描效
率加,所以说分代回收是以空间换时间

Second, the user interaction input

1, interaction

	交互说白了就是人与计算机交流的过程,人进行信息输入(input)计算机进行结果
输出(print)例如:输入
user_name = input('请输入账号:')
user_password = input('请输入密码:')
	输出
print(user == user_name)
print(password == user_password)

2, string formatting

2.1 Why do string formatting?

我们在需要输出某些固定格式的字符串时,例如:
‘’我们去***玩,坐***去,住***酒店”,我们需要将***替换成具体的内容,这

We need to format string on the line.

2.2, how to format string

2.2.1, placeholders

占位符例如%s、%d
print('我们去%s玩,坐%s去,住%s酒店,价钱是%d元' %('迪士尼','飞机',
'上海大酒店',100))
我们去迪士尼玩,坐飞机去,住上海大酒店酒店,价钱是100

2.2.2、format

	使用方式是:str.format
'''
1、
用户输入姓名、年龄、工作、爱好 ,然后打印成以下格式
------------ info of Egon -----------
Name  : Egon
Age   : 22
Sex   : male
Job   : Teacher
------------- end -----------------

'''

user_name = input('请输入姓名:')
user_age = int(input('请输入年龄:'))
user_work = input('请输入工作:')
user_like = input('请输入爱好:')

res = '''
------------ info of Egon -----------
Name  : {name}
Age   : {age}
Sex   : {like}
Job   : {work}
------------- end -----------------

'''.format(name=user_name, age=user_age, like=user_like, work=user_work)
print(res)

3, basic operators

1. The arithmetic operators

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

2, comparison operators

< > = <= >= !=
 print(10 > 3)
 print(10 == 10)
 print(10 >= 10)
 print(10 >= 3)

 name=input('your name: ')
 print(name == 'egon')

3, the assignment operator

 =  += -= *= %= /= //= **=
 age = 18
 age += 1  # age=age + 1
 print(age)
 age*=3
 age/=3
 age%=3
 age**=3 # age=age**3

3.1, chain assignment

 x=10
 y=x
 z=y
 z = y = x = 10 # 链式赋值
 print(x, y, z)
 print(id(x), id(y), id(z))
 

3.2, cross assignment

 m=10
 n=20
 print(m,n)
 交换值
 temp=m
 m=n
 n=temp
 print(m,n)
 m,n=n,m # 交叉赋值
 print(m,n)

3.3, unzip assignment

salaries=[111,222,333,444,555]
mon0,mon1,mon2,mon3,mon4=salaries
 print(mon0)
 print(mon1)
 print(mon2)
 print(mon3)
 print(mon4)
 mon0,mon1,mon2,mon3=salaries # 对应的变量名少一个不行
 mon0,mon1,mon2,mon3,mon4,mon5=salaries # 对应的变量名多一个也不行
# 引入*,可以帮助我们取两头的值,无法取中间的值
# 取前三个值
 x,y,z,*_=salaries=[111,222,333,444,555] # *会将没有对应关系的值存成列表然后赋值给紧跟其后的那个变量名,此处为_
 print(x,y,z)
 print(_)

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

 x,*_,y,z=salaries=[111,222,333,444,555]
 print(x,y,z)

 salaries=[111,222,333,444,555]
 _,*middle,_=salaries
 print(middle)

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


4, member operator

	只有一个 :in
1.判断一个字符或字符串是否在一个大字符串中
 print("world" in "hello world")
 print('w' in 'hello world')
2、判断元素是否在一个列表中
list1 = ['age','name','sex']
print('age' in list1)
3、判断key是否在字典中
dict1 = {'name':'dog','age':18,'sex':'play'}
print('name' in dict1)
4not in
print ('world' not in 'hello world')

5, the identity of the operator

	只有一个:is
	作用:判断两个变量id是否相等

6, logical operators

包含:not and or
优先级:not > and > or
1、逻辑非not #就是把跟在not后面的条件结果取反,即:真变假,假变真
# ps:not与紧跟其后的那个条件是一个不可分割的整体
 print(not 16 > 13)
 print(not True)
 print(not False)
 print(not 10)
 print(not 0)
 print(not None)
 print(not '')

2、逻辑与 and #and用来链接左右两个条件,两个条件同时为True,最终结果
#才为真
 print(True and 10 > 3)
 print(True and 10 > 3 and 10 and 0) # 条件全为真,最终结果才为True
 print( 10 > 3 and 10 and 0 and 1 > 3 )  # 偷懒原则
 3、逻辑或 or#or用来链接左右两个条件,两个条件但凡有一个为True,最终结果就为True,
# 两个条件都为False的情况下,最终结果才为False
print(3 > 2 or 0)
print(3 > 4 or False or 3 != 2 or 3 > 2 or True) # 偷懒原则

	
Published 16 original articles · won praise 0 · Views 157

Guess you like

Origin blog.csdn.net/weixin_46466247/article/details/104684805