python第二周知识回顾
- 文件操作
- 函数
- 模块
这三点集大成之作就是那个登录与注册功能
# 反正要用的模块肯定先导入
import os
import hashlib
import json
# 然后用os来判断是否需要创建一个文件
def is_dir_exists():
if os.path.exists(r'users'): # 查看文件是否存在
return True # 如果存在返回True方便执行
else:
return # 不存在就在注册里创建
# 将函数放到注册register里去
def append_userinfo(name, pwd):
userinfo = os.path.join('users', '%s.txt' % name) # 先创建文件夹和路径
with open(r'%s' % userinfo, 'w', encoding='utf8') as g: # 用合并后的路径打开文件
dict_list = {'name': name, 'pwd': pwd} # 以字典的形式存入
json.dump(dict_list, g) # 序列化成字符串
print('%s注册成功' % name) # 提示注册成功
# 这边注册就结束了
def sign():
md5 = hashlib.md5() # 导入加密模块
name = input('请输入用户名>>>:').strip()
password = input('请输入密码>>>:').strip()
md5.update(password.encode('utf8')) # 加密加上
pwd = md5.hexdigest() # 获取密文
return name, pwd # 一定切记把结果的名字密码返还出去
def check(name, pwd): # 现在要变成判断文件是否在文件夹里
almost_reg = '%s.txt' % name # 定义出文件名
if almost_reg in os.listdir('users\\'): # 如果文件名在文件夹里
print('用户名已存在')
return
else: # 不存在就直接走添加用户的函数
append_userinfo(name, pwd)
def register():
name, pwd = sign() # 首先肯定获取用户名密码
if is_dir_exists(): # True就是存在文件夹了
check(name, pwd) # 文件夹有了下一步就直接对比用户
return # 对比里面带着添加用户信息所以直接return
else:
os.mkdir(r'users') # 不存在就创建一个文件夹
check(name, pwd) # 创建完和前面同理
def login():
name, pwd = sign() # 登录那还是一样先获取用户名密码
with open(r'users\%s.txt' % name, 'r', encoding='utf8') as h: # 通过名字索引到文件里面打开读取
res = json.load(h) # 反序列化打开变成字典
if name == res['name'] and pwd == res['pwd']: # 通过K取到里面的V
print('登录成功')
return # 登录上了就结束函数
else:
print('用户名或密码错误')
'''先用循环构建出基本的框架'''
while True:
print(
'''
注册按1
登录按2
退出按Q
'''
)
start = input('请输入需要执行的指令')
if start == '1':
register()
elif start == '2':
login()
elif start == 'Q':
break
else:
print('您输入的指令有误')
这部分掌握了的话这周的课也就可以说没问题了不过还有一点点没用上的知识点扫盲
字符编码
'''
计算机基于电工作只有高低电频两种状态
也就是说计算机只认识两种状态 人为的把这两种状态定义为0和1
人类的字符与数字之间存在对应关系
相当于发电报彼此携带的密码本一样
'''
1.一家独大
计算机是美国人发明的 想让计算机认识英文
ASCII码
内部记录了英文与数字的对应关系
2.群雄割据
中国人
GBK码
内部记录了英文 中文与数字的对应关系
3.天下一统
unicode码(万国码)
内部记录了各个国家文字与数字的对应关系
utf8(万国码优化版本)
目前默认使用该编码
# 以后文本文件出现乱码就直接改字符编码
编码和解码
# 编码
按照指定的编码本将人类的字符编程成计算机能够识别的二进制数据
# 解码
按照指定的编码本将计算机的二进制数据解析成人类能够读懂的字符
res ='编码解码复习'
print(res.encode('gbk')) # 编码了 关键字.encode
r1 = res.encode('gbk')
print(r1.decode('gbk')) # 解码了 关键字.decode
光标移动
'''
.seek方法可以控制光标移动
seek(offset,whence)
offset用来控制移动的位数
whence是操作模式,只有三个参数
0: 文件开头 t,b模式通用
1: 当前位置 b模式才行
2: 文件末尾 b模式才行
'''
with open(r'users.txt', 'r', encoding='utf8') as f:
data = f.read()
print(data) # 这时候光标在末尾
f.seek(1,0) # 到开头 再往后移动一个字符
print(f.read())
# 下面是在二进制模式下操作
with open(r'users.txt', 'rb') as f:
data = f.read(10) # 这边数字代表光标读几个bytes
print(data.decode('utf8'))
f.seek(-5,2) # 从末尾向前移动3个bytes
print(f.read().decode('utf8'))
# 二进制模式下要当心字符从中间无法分割
常见内置函数
abs 绝对值
bin oct hex 二进制 八进制 十六进制
callable 是否可调用
chr 对应ascii码里的数字
format 字符串格式化输出
max min sum 最大 最小 合计
名称空间与作用域
名称空间就是存放变量与值的绑定关系的地方
内置名称空间 全局名称空间 局部名称空间
作用域就是做在程序能起作用的领域
比如全局作用域 就作用于全局名称空间
# 名称空间的生成是从内置开始由大到小
作用域的查找顺序与之相反
匿名函数
lanbda 形参:返回值
l = [1, 2, 3, 4, 5, 6, 7]
def index(x): # 与下面的那一句
return x + 10 # 是等价的
res = map(index,l) # res = map(lambda x: x + 10, l)
print(list(res)
列表生成式
l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
# 要筛选出加1后大于50的
new_list = [i for i in l1 if i+1 > 50]
print(new_list)
三元表达式
A if 条件 else B
当if后面的条件为True的时候使用A
为False使用else后面的B
random模块
# 能做验证码就肯定ok了
import random
def get_rdmcode(figure):
random_code = ''
for i in range(figure):
num = str(random.randint(0, 9))
ngh_upper = chr(random.randint(65, 90))
ngh_lower = chr(random.randint(97, 122))
co = random.choice([num, ngh_upper, ngh_lower])
random_code += co
return random_code
logging模块
有一说一真没咋搞懂,直接先复制过来吧
import time
import logging
from logging import handlers
sh = logging.StreamHandler()
rh = handlers.RotatingFileHandler('myapp.log', maxBytes=1024,backupCount=5)
fh = handlers.TimedRotatingFileHandler(filename='x2.log', when='s', interval=5, encoding='utf-8')
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[fh,sh,rh],
level=logging.ERROR
)
for i in range(1,100000):
time.sleep(1)
logging.error('KeyboardInterrupt error %s'%str(i))
# 这是将文件分开写入 了解一下就好