day04

发布时间 2023-11-30 14:35:38作者: 王苗鲁

1.今日内容介绍

今日内容
1.垃圾回收机制详解(了解)
    引用计数
    标记清除
    分代回收

2.与用户交互
    接受用户输入
        # python3中
        # python2.7(了解)
            input
            raw_input
    格式化输出
        %
        str.format
        f''
        
3.基本运算符
    算数运算符
    赋值运算符
    比较运算符
    逻辑运算符
        not、and、or
        区分优先级:not > and > or
        
        了解:
            短路运算
    成员运算符
        in
    身份运算符
        is

4.流程控制之if判断
    if条件
        代码块
    elif条件:
        代码块

2.垃圾回收机制

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

# 2.为什么要用垃圾回收机制?
# 程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间,如果不及时清理的话会导致内存殆尽(内存溢出),导致程序崩溃,因此管理内存是一件重要且繁杂的事情,而python解释器自带的垃圾回收机制把程序员从繁杂的内存管理中心解放出来。

# 3.垃圾回收机制原理简单分析
# 3.1 引用计数
x = 10  # 直接引用
print(id(x))
y = x
z = x

l = ['a', x]  # 间接引用
print(id(l[1]))
# 3.2 标记清除0
# 3.3 分代回收

3.列表在内存中存储的方式part1

# 1.引用计数
x = 10  # 直接引用
print(id(x))
y = x
z = x

l = ['a', 'b', x]  # 间接引用
print(id(l[2]))

d = {'mmm': x}  # 间接引用

print(id(d['mmm']))

4.列表在内存中存储的方式part2

x = 10
l = ['a', 'b', x]  
# 底层
# l=['a'的内存地址,'b'的内存地址,10的内存地址]
x = 123
# 不变
print(l[2])
# 变了
print(x)

5.直接引用与间接引用

直接引用:直接引用指的是从栈区出发直接引用到内存地址
间接引用:间接引用指的是从栈区出发引用到堆区之后,再通过进一步的引用才能到达内存地址

# 直接引用
x = 10
# 间接引用,两个内存地址
x = [10, ]

l = ['a', 'b', 10]

6.循环引用带来的内存泄露问题

# 2 标记清除(直接引用被摘掉后,标记清除会把内存地址标记为垃圾然后清除)
# 循环引用=>导致内存泄漏
l1 = [111, ]
l2 = [222, ]

l1.append(l2)  # l1=[值111的内存地址,l2列表的内存地址]
l2.append(l1)  # l2=[值222的内存地址,l1列表的内存地址]

print(id(l1[1]))
print(id(l2))

print(id(l2[1]))
print(id(l1))

# 通过这个例子告诉大家,这两个列表在相互引用

print(l2)
print(l1[1])

del l1  # 直接引用没了,间接引用还在
# del l2  # 直接引用没了,间接引用还在
print(l2[1])  # 还是可以取到
# 成为了永远不会删除的垃圾,一直占用内存

7.标记清除机制

标记清除
    """
    本质就是把栈区与堆区不存在直接引用,但是堆区存在互相引用的空间给删了
    """

8.标记清除机制

标记清除
    """
    本质就是把栈区与堆区不存在直接引用,但是堆区存在互相引用的空间给删了
    """

9.分代回收

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

10.逻辑运算符与优先级

# 1.逻辑运算
"""
not:就是把紧跟其后的那个条件结果取反
"""
# p.s:not与紧跟其后的那个条件是一个不可分割的整体
print(not 16 > 13)
print(not True)
print(not False)
print(not 10)
print(not 0)
print(not None)
print(not '')

"""
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 and 4 == 4 and 3 != 3)  # 偷懒原则

"""
or:逻辑或,and用来连接左右两个条件,两个条件但凡有一个为True,最终结果为True,两个条件都为False的情况下,最终结果为False
"""
print(3 > 2 or 0)
print(3 > 4 or False or 3 != 2 or True)

# 2.优先级not>and>or
# p.s
# 如果单独就只是一串and连接,或者说单独
# 如果是混用,则需要考虑优先级

# res = 3 > 4 and not 4 > 3 or 1 == 3 and 'x' == 'x' or 3 > 3
# print(res)
# res = (3 > 4 and (not 4 > 3)) or (1 == 3 and 'x' == 'x') or 3 > 3
# 
# # 全新的逻辑算法
# res = 3 > 4 and ((not 4 > 3) or 1 == 3) and ('x' == 'x' or 3 > 3)
# print(res)

11.短路运算(了解)

# 1.or逻辑
# or的左侧逻辑为Ture,则直接输出or左侧表达式
# or的左侧逻辑为False,则直接输出or右侧的表达式

# 2.and逻辑
# and的左侧逻辑值为False,则直接输出and左侧表达式
# and的左侧逻辑为True,则直接输出and右侧表达式

# 短路运算:偷懒原则,偷懒到那个位置,就把当前位置的值返回
# and逻辑与:and用于连接左右两个条件,只有在两个条件判断的结果都为True的情况下,and运算最终的结果才为True
print(1 > 2 and 3 > 4)
print(2 > 1 and 3 > 4)
print(True and True and True and False)
# or逻辑或:有一个为真结果就为真
print(True or False)
print(True or False and False)
print((True or False) and False)

print(False or False and True or False and True)  # 结果为False
print(False and True or False and True)  # 结果为False

12.接受用户输入

# 1.在python3中
# 接收用户的输入
# 在pthon3:input会将用户输入的所有内容都存成字符串类型
username = input("请输入你的账号>>:")  # egon
print(username, type(username))

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

# 转成整数型
int("123456")
# 无法转成整数型
int("123456.5")
# 无法转成整数型
int("123456abc")

# 2.在python2中
# raw_input():用法与python3中input一模一样
# input():要求用户输入一个明确的数据类型,输入是什么类型就存什么类型

13.格式化输出

# 字符串的格式化输出

# 1.%
# 值按照位置与%s一一对应,少一个不行,多一个也不行
res = "my name is %s my age is %s" % ('egon', "18")
res2 = "my name is %s my age is %s" % ('18', "egon")
res3 = "my name is %s" % "egon"
print(res)
print(res2)
print(res3)

# 以字典的形式传值,打破位置的限制
res1 = "我的名字是%(name)s 我的年龄是%(age)s" % {"age": "18", "name": "wangmiaolu"}
print(res1)

# %s可以接受任意类型
print("my age is %s" % 18)
print("my age is %s" % [1, 23])
print("my age is %s" % {'name': 'wangmiaolu'})
# 只能接受int
print("my age is %d" % 18)

# 2.str.format:兼容性好
# 按照位置传值
res = '我的名字是{} 我的年龄是{}'.format('egon', 18)
print(res)

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

# 打破位置的限制,按照key=value取值
res2 = "我的名字是{name} 我的年龄是{age}".format(age=18, name='egon')
print(res2)

# 3.f:python3.5以后才出
x = input('your name>>:')
y = input('your age>>:')
res = f'我的名字是{x} 我的年龄是{y}'
print(res)

14.流程控制之if判断part1

"""
完整语法:
if 条件1:
    代码1
    代码2
    代码3
    ...
elif 条件2:
    代码1
    代码2
    代码3
    ...
elif 条件3:
    代码1
    代码2
    代码3
    ...
......
else:
    代码1
    代码2
    代码3
    ...
"""

# 1、单分支
print('start...')
inp_name = input("请输入您的用户名:")
if inp_name == "egon":
    print('ok')
print('end...')

# 2、双分支
print('start...')
inp_name = input("请输入您的用户名:")
if inp_name == "egon":
    print('ok')
else:
    print('error')
print('end...')

15.流程控制之if判断part2

# 3、多分支
# 如果:成绩>=90,那么:优秀
# 如果成绩>=80且<90,那么:良好
# 如果成绩>=70且<80,那么:普通
# 其他情况:很差
score = input("your score: ")
score = int(score)
if score >= 90:
    print("优秀")
    if 10 > 3:
        print('ok')
elif score >= 80 and score < 90:
    print("良好")
elif score >= 70 and score < 80:
    print("普通")
else:
    print('很差')

# 优化版
score = input("your score: ")
score = int(score)
if score >= 90:
    print("优秀")
elif score >= 80:
    print("良好")
elif score >= 70:
    print("普通")
else:
    print('很差')

"""
请输入您的用户名
请输入您的密码
判断 输入的用户名 等于 正确的用户名 并且 输入的密码 等于 正确的密码:
    告诉用户登录成功
否则:
    告诉用户账号密码错误
"""
inp_name = input("username: ")
inp_pwd = input("password: ")

if inp_name == "egon" and inp_pwd == "123":
    print("登录成功")
else:
    print("账号密码错误")

16.小案例

"""
请输入您的用户名
请输入您的密码
判断 输入的用户名 等于 正确的用户名 并且 输入的密码 等于 正确的密码:
    告诉用户登录成功
否则:
    告诉用户账号密码错误
"""
inp_name = input("username: ")
inp_pwd = input("password: ")

if inp_name == "egon" and inp_pwd == "123":
    print("登录成功")
else:
    print("账号密码错误")