阶段学习总结之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('此功能不存在,请重新输入!')
posted @ 2021-08-23 00:06  Leguan001  阅读(54)  评论(0)    收藏  举报