阶段学习总结之02
阶段总结之02
概要
day06
- 字符编码
- 文件操作
day07
- 文件操作补充
- 函数
day08
- 函数的返回值
- 函数的类型
- 函数的参数
- 注册登录功能用函数封装
- 常见的内置函数
day09
- 函数的名称空间和作用域
- 匿名函数与列表生成式等补充知识
- 模块
- 常见的内置模块
day10
- os模块
- hashlib模块
- random模块
- logging模块
- json模块
详情
day06
-
字符编码
计算机是基于电工作的,而电信号只有高低电平两种状态。
故为了方便起见,计算机使用0和1表示数据。
字符编码的发展分为三个阶段:
1、发明者美国人的ASCII码
2其他国家各自的编码——GBK(中文)、Euc_kr(韩文)、Shift_JIS(日文)
3.通用编码——unicode码(万国码),后优化成utf-8。
编码与解码
#编码
人类能够读懂的的字符--->>>计算机二进制数据
#解码
计算机二进制数据--->>>人类能够读懂的字符
- 文件操作
打开文件的方法有两种:
1、with open(文件路径,读写模式,字符编码) as 变量名: with子代码
2、变量名 = open(文件路径,读写模式,字符编码)
对变量的操作
变量名.close() #不推荐使用
读写模式
'''r 只读模式'''
1.文件路径不存在则会报错;2.文件路径存在则会打开该文件并读取内容。
'''w 只写模式'''
1.文件路径不存在会自动创建该文件;2.文件路径存在则会先清空文件再写入内容(慎用)。
'''a 只追加模式'''
1.文件路径不存在会自动创建该文件;2.文件路径存在则会在文件末尾追加内容。
#日常使用为了避免打开文件过大导致内存崩溃,通常会逐行读取。
操作模式
'''t 文本模式(默认,上述均为)'''
#rt,wt,at(t可省略)
1.只能用于操作文本文件。
2.必须指定encoding即字符编码的参数。
3.以字符串为单位进行读写。
'''b 二进制模式'''
#rb,wb,ab
1.可用于操作所有文件。
2.操作文本文件用t模式更为方便,操作非文本文件只能使用此模式。
3.以二进制数为单位进行读写。#该模式读文本文件需解码
day07
- 文件操作补充
#文件操作的方法补充
.flush() 将内存中的数据保存至硬盘,与ctrl+s相同
.readable(),.writeable() 判断文件是否可读、是否可写
.writelines(参数) 按照参数将其中多个元素依次写入
.read(x): x表示读取的字节数
#光标移动
.seek(offset,whence)
1.offset参数表示光标移动次数,以字节为单位
2.whence参数表示操作模式
whence=0:文本文件或二进制文件中均可使用,光标移动至文件开头
whence=1:只能在二进制文件中使用,光标在当前位置
whence=2:只能在二进制文件中使用,光标移动至文件末尾
#文件修改
方法一:将源文件内容抹除,写入新内容.(文件内容过大时不推荐使用)
方法二:创建新文件,将源文件修改后的内容写入新文件,随后删除源文件,将新文件命名为旧文件.
#相关冷知识:
硬盘中的数据被删除时,数据被标记为可占用状态,可恢复,为了解决这种问题,可以在删除后,再下载垃圾文件覆盖。
-
函数
函数必须先定义才能使用。
def 函数名(参数1,参数2)
'''函数的注释'''
函数体
return 函数返回值
注意事项
1.使用def 关键字定义函数
2.函数名尽量与变量名一致,容易读懂
3.函数可以从外界接受多个参数用于取值
4.函数体是函数的主要内容
5.函数返回值,执行完得到的结果
day08
- 函数的返回值
返回值是函数执行完后得到的结果。
变量名加赋值号可获取返回值。
#变量名=函数()
1.没有return关键字--->返回None
2.返回值在return后面
3.return后有多个参数--->>>组合成元组的形式返回
4.函数体执行到return--->>>结束整个函数的运行
#补充:
1.函数在定义阶段(def)只检测函数体的语法不执行代码。
2.函数在调用阶段(函数名())若定义参数则调用时必须传递参数给函数。
- 函数的类型
1.无参函数:未定义参数,调用时不传递参数
2.有参函数:定义了参数,调用需要传递正确的参数
3.空函数:没有详细的函数体,用于补全语法格式
-
函数的参数
1.形参与实参的关系
形参:函数的形式参数为定义阶段括号内书写的变量名。
实参:函数的实际参数为调用阶段传递给括号内变量的值。
#调用函数时两者绑定,函数运行结束以后两者分开
2.参数类型
1.位置参数:按照位置一一对应传递参数,数量必须相同,不多不少。
2.关键字参数:根据关键字给形参传递参数,位置可变。
3.默认参数:函数定义阶段给形参赋值
4.可变长参数:打破函数对参数个数的限制,使用更为灵活多变。
#接收多余的位置参数组合成元组的形式赋值给*后面的变量名
#接收多余的关键字参数组合成字典的形式赋值给**后面的变量名
3.*与**在实参中的作用
* 会将列表/元组内的从元素散装成多个位置参数分别传递给函数。
** 会将字典内的元素散装成多个位置参数分别传递给函数。
- 注册登录功能用函数封装
'''注册'''
def register():
#1.获取输入的用户信息,并提取用户名
userInfo = getUserInfo()
userName = userInfo[0]
passwd = userInfo[1]
#2.校验用户名是否重复,重复需重新输入
if isUserNameRepeated(userName):
return False
#3.未发现重复的用户名,写入用户信息
with open(r'userInfo.txt', 'a', encoding='UTF-8') as f:
f.write('{}|{}\n'.format(userName, passwd))
print('用户{}注册成功!'.format(userName))
return True
'''登录'''
def login():
#1.获取输入的用户信息,并提取用户名
userInfo = getUserInfo()
userName = userInfo[0]
passwd = userInfo[1]
#2.只读模式打开用户信息文件
with open(r'userInfo.txt', 'r', encoding='UTF-8') as f:
#3.逐行比对,切割数据
for line in f:
realName, realPasswd = line.split('|')
#4.校验有无用户的用户名与密码均和输入的相同
if userName == realName and passwd == realPasswd.strip('\n'):
print('用户{}登录成功!'.format(userName))
return True
print('用户名或密码错误!')
return False
- 常见的内置函数
abs(-111) #返回参数的绝对值
all({1,2,3}) #元素中有布尔值为False返回False,否则返回True
any({1,2,0}) #元素中有布尔值为True返回True,否则返回False
chr(65) #返回Ascii码中数字对应的字符,此处为'A'
callable() #判断变量是否可被调用即是否为函数
# .format()与%s类似,定义字符串的格式
print('name : {} || age : {}'.format('HuaHua',18))
# 按位置给参数赋值,顺序可打乱
print('is {0} {1} {1} and is {1} {0}'.format('HuaHua',18))
# 按关键字给参数赋值,顺序可打乱
print('{name} {age}{name} and {age}'.format(name='HuaHua',age=18))
day09
- 函数名称空间与作用域
名称空间:存放变量与值绑定关系的地方
1.内置名称空间:python解释器启动时立即创建,结束时立即销毁。
2.全局名称空间:python文件开始执行时创建,执行完毕时回收。
3.局部名称空间:函数体代码运行时产生,运行结束回收。
加载顺序:内置名称空间 -> 全局名称空间 -> 局部名称空间
作用域:函数发挥作用的地方
查找变量顺序:局部名称空间 -> 全局名称空间 -> 内置名称空间
#查找变量只能从当前名称空间开始查,不能折返
在局部(例如函数内部)修改全局名称空间中变量的值可使用global关键字
- 匿名函数与列表生成式等补充知识
匿名函数:没有函数名的函数
lambda 形参:返回值
列表生成式:主要用于简写生成新列表的代码量
eg:
#用循环结构实现将列表内每个元素加一,赋给新列表
list1 = [1,3,5,7,9,11]
new_list = []
for i in list1:
new_list.append(i+1)
#用列表生产式实现上述功能可减少代码量
new_list = [i + 1 for i in list1]
三元表达式: A if 条件 else B
适用于当if子代码只有一行,if的判断逻辑仅仅为二选一时可使用
- 模块
#定义
模块是具有一定功能的代码集合,一般为.py文件或多个.py文件等组合的文件夹即包。
#本质
1.执行模块代码,产生一个该模块的名称空间
2.将代码执行过程产生的名字存放于该名称空间中
3.给导入语句一个指向该名称空间的模块名
#句式
import 模块名 as 别名
from 模块名 import 子名1,子名2
eg: 如果模块名过长可起别名
import asedjhfvcbgasewkhjfbgckjas as ased
from d1.d2 import f1 as fff1
- 常见的内置模块
#时间模块
1. time
time.time() #返回当前时间戳
time.strfttime('%Y-%m-%d') #按年月日返回当前日期
time.strfttime('%Y-%m-%d %H:%M:%S') #按年月日时分秒返回当前日期
time.sleep(n) #阻塞n秒
2. datetime
datetime.date.today() #按年月日返回当前日期
datetime.datetime.today() #按年月日时分秒返回当前日期
datetime.timedelta(days=n) #日期变化n天,为正前进为负倒退
day10
- os模块
#文件夹的创建操作
os.mkdir(r'文件夹1') #只能在给定路径下创建单级目录
os.makedirs(r'文件夹2\文件夹3') #可创建多级或单级目录
#文件夹的删除操作
os.rmdir(r'文件夹1') #删除一级空目录
os.rmdir(r'文件夹2\文件夹3') #默认只能删除路径下一级空目录
os.removedirs(r'文件2\文件夹3\文件夹4') #可以删除多级目录,必须确保为空
#查看文件、文件夹
os.listdir() #查看当前目录下所有的文件与文件夹(包括隐藏的)
os.listdir('D:\\') #查看制定目录下所有的文件与文件夹(包括隐藏的)
os.getcwd() #查看当前所在的路径
os.chdir('C:\\Users') #切换当前所在的路径
#文件、文件夹的判别
返回布尔值
os.path.isdir(r'文件夹1') #判断是否为文件夹
os.path.isfile(r'a.txt') #判断是否为文件
os.path.exists(r'文件夹2\文件夹3') #判断当前路径是否存在
#路径拼接
由于不同操作系统的路径分隔符是不一样的(如Windows系统是\,macOS是/),用简单的字符串拼接文件路径不能很好地兼容不同操作系统。
#拼接路径的函数可有效针对不同操作系统切换路径分隔符
os.path.join('','')
#查看文件大小,以字节数为单位
os.path.getsize(r'a.txt')
- hashlib模块
将明文数据按照一定的逻辑编写成密文数据,一般由数字与字母随机组合。
常见的加密算法有md5、base64、hmac、sha系列等。
import hashlib
'''
一般采用md5加密即可,步骤如下
1.将待加密的数据传入算法
2.注意待加密数据必须是二进制即bytes类型(重要)
3.获取加密之后的密文
'''
# 选择加密算法:md5
md5 = hashlib.md5()
# 将待加密的数据传入算法
md5.update(b'Ultraman Leo')
#获取加密后的密文
res = md5.hexdigest()
#有时需加密的数据过于简单,可能会被对简单常见数据的穷举“破解”
#这时需进行加盐处理,即在数据前后拼接额外的干扰数据
md5.update('这是一勺盐'.encode('utf8'))
md5.update(b'Ultraman Leo') # 数据必须是bytes类型(二进制)
#加盐还能使用动态数据
- random模块
import random
#随机返回一个0-1之间的小数
random.random() #比如0.20553977729943185
#掷骰子
random.randint(1,6) #随机返回指定范围的整数,包括首尾
#随机抽取一个选项,可用于抽奖
random.choice(['一等奖','二等奖','谢谢回顾']) #返回单个字符串
random.choices(['一等奖','二等奖','谢谢回顾']) #返回包含选项的列表
#随机抽取多个选项,可指定个数
random.sample(['选项一','选项二','选项3',],个数)
#随机打乱元素,可用于洗牌
poker = [3,4,5,6,7,8,9,10,'J','Q','K','smallJoker','largeJoker']
random.shuffle(poker)
print(poker)
某搜狗考试题
def getCode(n):
code = ''
for i in range(n):
'''抽取结果需转换成字符串'''
#随机抽一个数字
r1 = str(random.randint(0, 9))
#随机抽一个大写字母
r2 = chr(random.randint(65, 90))
#随机抽一个小写字母
r3 = chr(random.randint(97, 122))
#决定是数字还是大写字母还是小写字母
code += random.choice([r1, r2, r3])
return code
print(getCode(5))
- logging模块
import logging
#日志分为五级
logging.debug('调试信息')
logging.info('信息')
logging.warning('警告')
logging.error('错误')
logging.critical('重大错误') #级别最高
默认打印warning级别以上的日志
eg:
#初始化日志
logging.getLogger()
#创建用于将日志信息写入日志文件的处理器
logging.FileHandler('test.log',encoding = 'UTF-8')
#创建用于将日志信息打印到控制台的处理器
logging.StreamHandler()
#定义一种日志格式
logging.Formatter('%(asctime)s - %(name)s - %(levelnames) - %message)s')
#设置日志格式
saveLog.setFormatter(formatter)
printLog.setForrmatter(formatter)
#logger对象可以添加多个处理器对象
logger.addHandler(saveLog)
logger.addHandler(printLog)
- json模块
#序列化将常用数据类型转化成json格式字符串
json.dumps(变量名)
#反序列化将json格式字符串转化成对应的数据类型
json.loads(变量名)
#语法结构
userInfo = {'userName': 'Leo', 'passwd': 'UltramanL77'}
'''序列化和反序列化能对文件进行'''
with open(r'json1.txt','w',encoding='utf8') as f:
#将userInfo字典转化成json字符串存放于文件json1.txt中
json.dump(userInfo,f)
with open(r'json1.txt','r',encoding='utf8') as f:
#将文件json1.txt中的json字符串转化成字典
res = json.load(f)
print(res,type(res))
周末作业
优化之前书写的登录注册功能
1.存储用户数据的文件自动创建
2.将用户注册的数据采用json格式存储
每个用户一个json文件
import os
import hashlib
import json
'''加密或者解密'''
def encryptOrDecipher(passwd, mode = 1):
if mode == 1:
#加密
# 1.选择加密算法:md5
md5 = hashlib.md5()
# 2.将待加密的数据传入算法
md5.update(passwd.encode('UTF-8'))
# 3.获取加密后的密文
msg = md5.hexdigest()
elif mode == 2:
#解密
pass
return msg
'''获取用户信息'''
def getUserInfo():
userName = input('请输入用户名>>>').strip()
passwd = input('请输入密码>>>').strip()
#将用户信息存放于字典
userInfo = {'userName': userName, 'passwd': passwd}
return userInfo
'''校验用户名是否重复'''
def isUserNameRepeated(userName):
realUserFile = r'{}.json'.format(userName)
# 2.存在用户信息文件与输入用户名相同,打印提示并结束校验
if os.path.exists(realUserFile):
print('用户名已存在,请重新输入!')
return True
return False
'''注册'''
def register():
# 0.判断用户信息目录是否存在,不存在则创建该目录
if not os.path.exists(r'UserInfo'):
os.mkdir(r'UserInfo')
# 1.获取输入的用户信息,并提取用户名
userInfo = getUserInfo()
userName = userInfo.get('userName')
passwd = userInfo.get('passwd')
# 2.校验用户名是否重复,重复需重新输入
if isUserNameRepeated(userName):
return False
# 3.未发现重复的用户信息文件,创建该用户对应的信息文件
# 对密码进行加密
userInfo['passwd'] = encryptOrDecipher(passwd)
with open(r'{}.json'.format(userName), 'w', encoding='UTF-8') as f:
json.dump(userInfo, f)
print('用户{}注册成功!'.format(userName))
return True
'''登录'''
def login():
# 1.获取输入的用户信息,并提取用户名
userInfo = getUserInfo()
userName = userInfo.get('userName')
# 2.判断用户信息对应的文件是否存在
if os.path.exists(r'{}.json'.format(userName)):
with open(r'{}.json'.format(userName), 'r', encoding='UTF-8') as f:
realUserInfo = json.load(f)
# 3.对输入密码进行加密
passwd = encryptOrDecipher(userInfo.get('passwd'))
# 4.校验有无用户的用户名与密码均和输入的相同
if userName == realUserInfo.get('userName') and passwd == realUserInfo.get('passwd').strip('\n'):
print('用户{}登录成功!'.format(userName))
return True
print('用户名或密码错误!')
return False
'''用户信息系统 Ver.4.0'''
dict = {'1':register, '2':login}
# 0.判断用户信息总目录是否存在,不存在则创建
if not os.path.exists(r'UserInfo'):
os.mkdir(r'UserInfo')
# 1.进入用户信息总目录
os.chdir('UserInfo')
# 2.用户选择功能
while True:
print(' 用户信息系统 Ver.3.0\n'
' --->>>1.注册请按1<<<---\n'
' --->>>2.登录请按2<<<---.'
)
choice = input('请输入想要执行的功能>>>').strip()
if choice in dict:
funcName = dict.get(choice)
funcName()
else:
print('此功能不存在,请重新输入!')

浙公网安备 33010602011771号