垃圾处理机制
# 垃圾回收机制
# 是python自带的一种自动回收无用内存空间的机制
# 节省内存空间提高运行效率
# 1 引用计数 当变量值被变量名直接连接或者间接连接时,则变量计数加一,当变量计数为零时,则解释器回收内存
# 引用计数分为:直接引用和间接引用
# 直接引用 : x = 10
# 间接引用 : l = [1 ,2,x]
'''
ps: l1 = [1 , 2 , x] 与 l2 = [1,2,10] 一样
x = 10 x 中存储的是x的10的内存地址
l1,l2中存取的是列表 [1,2,10]内存地址
x = 10
l = [x]
x = 123
print(l) == print([10])
当列表中存取变量时只存取变量相对应的内存地址而跟变量无关,变量变列表中的值不变.
'''
# 但是引用计数存在漏洞 为了修补引用计数的漏洞 产生了
# 2 标记清楚算法
# 容器数据类型的循环引用造成漏洞 例如 l1 = ['alex','lee',l2} l2 = ['alex','lee',l1} 当解除l1 l2 与其对应变量值的绑定关系后
# 其变量值相互关联引用计数算法无法不能回收,我们也无法调用,浪费内存空间.所以有了标记清除法
# 栈区 : 存放变量名称
# 堆区 : 存放变量值
# 开始时扫描 从栈区每个变量名出发往后标记.堆区中没有标记的值就是无法被调取的.清除.
# 分代回收(降低引用计数的扫描频率,提高回收效率)
# 给变量设置权重值
# 降低.引用计数扫描中一直存在连接的变量扫描频率.
input('')
用户交互
# 1、接收用户的输入
# 在Python3:input会将用户输入的所有内容都存成字符串类型
# username = input("请输入您的账号:") # "egon"
# print(username, type(username))
# age = input("请输入的你的年龄: ") # age="18"
# print(age, type(age))
# age=int(age) # int只能将纯数字的字符串转成整型
# print(age > 16)
# int("12345")
# int("1234.5")
# int("1234abc5")
# 在python2中:
# raw_input():用法与python3的input一模一样
# input(): 要求用户必须输入一个明确的数据类型,输入的是什么类型,就存成什么类型
# >>> age=input(">>>>>>>>>>>>>>>>>>>>>: ")
# >>>>>>>>>>>>>>>>>>>>>: 18
# >>> age,type(age)
# (18, <type 'int'>)
# >>>
# >>> x=input(">>>>>>>>>>>>>>>>>>>>>: ")
# >>>>>>>>>>>>>>>>>>>>>: 1.3
# >>> x,type(x)
# (1.3, <type 'float'>)
# >>>
# >>> x=input(">>>>>>>>>>>>>>>>>>>>>: ")
# >>>>>>>>>>>>>>>>>>>>>: [1,2,3]
# >>> x,type(x)
# ([1, 2, 3], <type 'list'>)
# >>>
# 2。字符串的格式化输出
# 2.1 %
# 值按照位置与%s一一对应,少一个不行,多一个也不行
# 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)
# %s可以接收任意类型
# print('my age is %s' %18)
# print('my age is %s' %[1,23])
# print('my age is %s' %{'a':333})
# print('my age is %d' %18) # %d只能接收int
# print('my age is %d' %"18")
# 2.2 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)
# 了解知识
"""
2.4 填充与格式化
# 先取到值,然后在冒号后设定填充格式:[填充字符][对齐方式][宽度]
# *<10:左对齐,总共10个字符,不够的用*号填充
print('{0:*<10}'.format('开始执行')) # 开始执行******
# *>10:右对齐,总共10个字符,不够的用*号填充
print('{0:*>10}'.format('开始执行')) # ******开始执行
# *^10:居中显示,总共10个字符,不够的用*号填充
print('{0:*^10}'.format('开始执行')) # ***开始执行***
2.5 精度与进制
print('{salary:.3f}'.format(salary=1232132.12351)) #精确到小数点后3位,四舍五入,结果为:1232132.124
print('{0:b}'.format(123)) # 转成二进制,结果为:1111011
print('{0:o}'.format(9)) # 转成八进制,结果为:11
print('{0:x}'.format(15)) # 转成十六进制,结果为:f
print('{0:,}'.format(99812939393931)) # 千分位格式化,结果为:99,812,939,393,931
"""
# 2.3 f:python3.5以后才推出
x = input('your name: ')
y = input('your age: ')
res = f'我的名字是{x} 我的年龄是{y}'
print(res)
运算符
# 运算符
# 算数运算符
# +,-,*,/,//,**,%
# 比较运算符
# >,>=,<,<=,==,!=
# 赋值运算符
# = 变量的赋值运算
'''
增量赋值
例如
a += 1
b -= 1
c *= c
d **= 2
e %= 2
f //= 2
g /= 2
'''
# 链式赋值
x = 10
y = x
z = y
'+++++++++++++++++++++++++'
x = y = z = 10
print(id(x),id(y),id(z))
# 交叉赋值
x = 10
y = 20
temp = x
x = y
y = temp
print(x,y)
'++++++++++++++++++++'
x = 10
y = 20
x,y = y,x
print(x,y)
# 解压赋值(*****)
# 重点
salaries = [111,222,333,444,555,666,777]
mon_0 = salaries[0]
mon_1 = salaries[1]
mon_2 = salaries[2]
mon_3 = salaries[3]
mon_4 = salaries[4]
mon_5 = salaries[5]
mon_6 = salaries[6]
print(mon_0,mon_1,mon_2,mon_3,mon_4,mon_5,mon_6)
'++++++++++++++++++++++++++++++++++++++++++++++++++++'
mon_6,mon_5,mon_4,mon_3,mon_2,mon_1,mon_0 = salaries
print(mon_0,mon_1,mon_2,mon_3,mon_4,mon_5,mon_6)
'++++++++++++++++++++++++++++++++++++++++++++++++'
# 只取开头
mon_0,mon_1,*_= salaries
print(mon_0,mon_1)
# 只取结尾
*_,mon_5,mon_6 =salaries
print(mon_5,mon_6)
'''众所周知 *代表所有的意思
*讲没有对应关系的值存为列表然后赋值给紧跟其后的变量名
'''
作业
# 1
print('{0:-^36}'.format('in to Egon'))
a = '''Name : {}
Age : {}
Sex : {}
Job : {}
'''
print(a.format('Egon',22,'male','teachor'))
print('{0:-^36}'.format('end'))
''''不熟练待会练习'''
# 2
users = {'enon':'永远18岁','lee':'睡你妹起床学习'}
user_name = input('输入用户名>>>')
if user_name.lower() in users.keys():
password = input('输入密码')
if password == users[user_name.lower()]:
print('登录成功')
else:
print('密码错误,请重试')
else:
print('用户名不存在')
# 3
egon_age = 18
temp_age = int(input('猜一下egon的年龄'))
if temp_age > egon_age:
print('我那么老么,想清楚在说话 啊!')
elif temp_age < egon_age:
print('哈哈,我看起来这么年轻啊,小嘴抹了蜜')
else:
print('聪明,帅气如我永远18')
# 4
print(10000//30)
print(10000%30)
# 5
egon = 18
egon += 3
print(egon)
# 6
x = y = z = 10
# 7
dsb = 'egon'
superman = 'alex'
dsb , superman = superman, dsb
# 8
name_1 , naem_2,name_3,name_4,name_5,name_6 = ['alex_sb','wusir_sb','oldboy_sb','egon_nb','lxx_nb','tank_nb']
print(name_1 , naem_2,name_3,name_4,name_5,name_6)
选做题
import time
user = {'站在远方看童年': '123456',
'背着小包袱去旅行': '123456',
'梦醒安好': '123456',
'LLK': '123456', 'ZHL': '654321',
'llk':'123456'}
fla_user_name = []
with open('.\输入错误.txt', mode='r+', encoding='utf-8') as f:
f.truncate()
while 1:
user_name = input('请输入用户名')
user_password = input('请输入密码')
with open('.\锁定时间.txt', mode='r', encoding='utf-8') as f1:
if f1:
lock_user = {}
for i in f1:
lis = i.strip().split('_')
# print(lis)
# print(lis[0])
# print(lis[1],type(lis[1]))
lock_user[lis[0]] = lis[1]
else:
lock_user = {}
if user_name in lock_user.keys():
now_time = int(time.time())
star_time = int(lock_user[user_name])
time_long = now_time - star_time
if time_long >= 300:
with open('.\输入错误.txt', mode='r+', encoding='utf-8') as f:
for i in f:
fla_user_name.append(i.strip())
while user_name in fla_user_name:
fla_user_name.remove(user_name)
f.seek(0)
f.truncate()
for i in fla_user_name:
f.write(i+'\n')
with open('.\锁定时间.txt', mode='r+', encoding='utf-8') as f:
for i in f:
lis = i.strip().split('_')
lock_user[lis[0]] = lis[1]
if user_name in lock_user.keys():
del lock_user[user_name]
f.seek(0)
f.truncate()
for i in lock_user.keys():
f.write(i+'_'+lock_user[i]+'\n')
if user_name in user.keys() and user_password == user[user_name]:
print('登录成功')
break
else:
with open('.\输入错误.txt', mode='r+', encoding='utf-8') as f:
for i in f:
fla_user_name.append(i.strip())
numb = fla_user_name.count(user_name)
print('本用户还有%s次机会' % (2 - numb))
else:
print('还有%s秒用户%s解锁' % (300 - time_long, user_name))
elif user_name in user.keys() and user_password == user[user_name]:
print('登录成功')
break
else:
with open('.\输入错误.txt', mode='r+', encoding='utf-8') as f:
for i in f:
fla_user_name.append(i.strip())
numb = fla_user_name.count(user_name)
if numb < 3:
with open('.\输入错误.txt', mode='a+', encoding='utf-8') as f:
f.write(user_name + '\n')
# f.seek(0)
for i in f:
fla_user_name.append(i.strip())
numb = fla_user_name.count(user_name)
print('本用户还有%s次机会' % (2-numb))
""""这里写3-numb"""
elif numb == 3:
with open('.\输入错误.txt', mode='a', encoding='utf-8') as f:
f.write(user_name + '\n')
print('用户已经锁定')
star_time = int(time.time())
with open('.\锁定时间.txt', mode='a+', encoding='utf-8') as f1:
f1.write(user_name + '_' + str(star_time) + '\n')
print('本用户锁定五分钟后解锁')