一周内容回顾
一周内容回顾
day01
-
字符编码
-
编码与解码
-
文件操作
-
读写模式
-
操作模式
-
作业

day01内容详细
字符编码
#前提: 计算机是基于电工作的 而电信号只有高低电频两种状态 所以计算机只认识0和1 人类的字符与数字之间存在对应关系 #发展史 1.一家独大 ASCII码 2.群雄割据 中国GBK码 韩国Euc_kr码 日本shift_JIS码 3.天下一统 unicode码(万国码) utf8(万国码优化版本)
#编码 按照指定的编码本将人类的字符编程成计算机能够识别的二进制数据 #解码 按照指定的编码本将计算机的二进制数据解析成人类能够读懂的字符
#第一种 with open(文件路径,读写模式,字符编码) as 变量名: with子代码 #第二种 变量名 = open(文件路径,读写模式,字符编码) 一系列操作 变量名.colse()
读写模式
r (只读模式)
1.文件路径不存在会直接报错
2.文件存在则打开并可读取文件内容
1.文件路径不存在会自动创建
2.文件路径存在会先清空该文件内容然后再写入
1.文件路径不存在会自动创建
2.文件路径存在光标会移动到文件末尾
读取优化 eg: with open(r'aaa.txt', 'r', encoding='utf8') as f: for line in f: # 一行行读取文件内容 能够避免内存溢出 print(line)
#t模式 文本模式 rt/wt/at 1.该模式只能操作文本文件 2.该模式下必须指定encoding参数 3.读写都是以字符串为单位 #b模式 二进制模型 rb/wb/ab 1.该模式可以操作任意类型的文件 2.该模式下不需要指定encoding参数 3.读写都是以bytes(二进制)为单位
练习一 1.利用文件操作编写一个简易的文件拷贝系统 让用户输入需要拷贝的文件路径 然后再获取即将拷贝到哪儿的路径
# 1.获取文件路径 source_file_path = input('source_path>>>:').strip() # 2.在获取目标地址路径 target_file_path = input('target_path>>>:').strip() # 3.打开源文件读取内容 # 4.创建新文件并写入内容 with open(r'%s' % source_file_path, 'rb') as read_f, open(r'%s' % target_file_path, 'wb') as write_f: # 循环读取文件内容避免出现内存溢出的情况 for line in read_f: write_f.write(line)
练习二 2.利用文件操作完成用户的注册、登录 userinfo.txt #基本要求 用户注册获取用户名和密码然后写入文件 登录获取用户名和密码之后去文件中比对 上述操作完成一次就算成功
while True: print(""" 1.注册 2.登录 """) choice = input('请选择想要执行的功能>>>:').strip() if choice == '1': # 注册功能 # 1.获取用户用户名和密码 username = input('username>>>:').strip() password = input('password>>>:').strip() # 2.打开文件直接写入 with open(r'aaa.txt', 'w', encoding='utf8') as f: f.write('%s|%s' % (username, password)) print('%s注册成功' % username) elif choice == '2': # 登录功能 # 1.获取用户用户名和密码 username = input('username>>>:').strip() password = input('password>>>:').strip() # 2.读取文件内容比对用户名和密码是否正确 with open(r'aaa.txt', 'r', encoding='utf8') as f: # 由于目前文件内容就一行 可以直接使用read方法 data = f.read() # ben|123 # 切割字符串 获取正确的用户名和密码 real_name, real_pwd = data.split('|') # 先切割字符串得到一个列表['ben','123'] 在解压赋值给两个变量real_name real_pwd # 比对信息是否正确 if real_name == username and real_pwd == password: print('登录成功') else: print('用户名或密码错误') else:
练习三 #拔高练习 用户注册可以多次注册并且校验用户名是否重复 登录需要逐行比对
# 1.获取用户名和密码 flag = True while flag: username = input('username>>>:').strip() password = input('password>>>:').strip() # 2.先读取文件内容 校验用户名是否重复 with open(r'aaa.txt', 'r', encoding='utf8') as f: # 循环读取每一行用户数据 for line in f: # 'jason|123' 'kevin|123' # 解析出用户名 real_name = line.split("|")[0] # 判断用户名是否重复 if real_name == username: print('用户名已存在') # for也可以结合break和continue作用与while一致 # 结束整个注册功能 flag = False if flag: # 如果for循环正常执行完毕没有被break 说明用户名没有冲突 with open(r'aaa.txt', 'a', encoding='utf8') as f: f.write('%s|%s\n' % (username, password)) print('%s注册成功' % username) # 登录 # 1.获取用户名和密码 username = input('username>>>:').strip() password = input('password>>>:').strip() # 2.读取文件内容 循环获取一行行用户数据 with open(r'aaa.txt', 'r', encoding='utf8') as f: for line in f: real_name, real_pwd = line.split("|") if username == real_name and password == real_pwd.strip('\n'): print('登录成功') break else: # for循环没有被break打断的情况下正常执行完毕之后就会执行else print('用户名或密码错误')
day02
-
文件操作补充
-
光标移动
-
文件修改
-
函数
文件操作补充
1.flush() 将内存中的数据立刻刷到硬盘 相当于ctrl+s 2.readable() writeable() 判断文件是否可读可写 3.writelines() 括号内放列表 多个元素都会被依次写入
文件光标移动 及 文件修改 #seek方法可以控制光标的移动 seek(offset,whence) offset用来控制移动的位数 whence是操作模式 0:既可以用在文本模式也可以用在二进制模式 #文件开头 1:只可以在二进制模式下使用 #当前位置 2:只可以在二进制模式下使用 #文件末尾
with open(r'a.txt','r',encoding='utf8') as f: data = f.read() with open(r'a.txt','w',encoding='utf8') as f: f.write(data.replace('jason','tony'))
# 创建一个新文件 将老文件内容写入新文件 过程中完成修改 之后将老文件删除 将新文件命名成老文件 从而达到修改的效果 import os with open(r'a.txt','r',encoding='utf8') as f,open(r'a.txt.backend','w',encoding='utf8') as f1: for line in f: f1.write(line.replace('tony','jason')) os.remove(r'a.txt') os.rename(r'a.txt.backend',r'a.txt')
#函数 就相当于是工具 提前定义好后续可以反复使用 #函数的语法结构 def 函数名(参数1,参数2): '''函数的注释''' 函数体代码 return 函数的返回值 #函数的基本使用 函数的使用一定要先定义后使用
day03
-
函数的返回值
-
函数的类型
-
函数的参数
-
利用函数对注册登录代码进行封装
-
常见的内置函数
day03内容详细
函数的返回值
# 什么是返回值? 返回值即执行完某个方法该方法反馈出来的结果 # 如何获取返回值? """ 通过变量名与赋值符号即可 变量名 = 方法/函数() """ 1.当函数体没有return关键字的时候 默认返回None 2.return关键字后面写什么函数就返回什么 3.return后面跟多个值默认会组织成元组的形式返回 4.函数体代码遇到return立刻结束整个函数的运行
1.无参函数: 函数在定义阶段没有参数调用阶段也不需要参数 2.有参函数: 函数在定义阶段括号内填写了变量名即需要参数 3.空函数 没有具体的函数体代码 一般用于前期的架构搭建
函数在定义阶段括号内书写的变量名称之为函数的形式参数 简称为形参(变量名) 函数在调用阶段括号内书写的值称之为函数的实际参数 简称为实参(变量值) #两者在调用函数的时候临时绑定 函数运行结束分开 eg: def index(name): 形参 print(name) index('jason') 实参 name = 'tom'
参数分类
1.位置参数:按照位置一一对应传值 多一个不行少一个也不行 2.关键字参数:指名道姓的给形参传值 可以打破位置限制 3.默认参数:函数在定义阶段就给形参赋值了 4.可变长参数:函数如何做到无论接收多少个位置参数都可以正常运行 *在形参中使用 组织成元组的形式赋值给*后面的变量名 **在形参中使用 组织成字典的形式赋值给**后面的变量名 #约定 针对形参中的可变长参数 变量名推荐使用 *args **kwargs *在实参中使用 会将列表/元组内的元素打散成一个个位置参数传递给函数 **在实参中使用 会将字典内的元素分解成一个个关键字参数传递给函数
def register(): username = input('username>>>:').strip() password = input('password>>>:').strip() # 校验用户名是否存在 with open(r'userinfo.txt', 'r', encoding='utf8') as f: for line in f: real_name = line.split('|')[0] if real_name == username: print('用户名已存在') return # 将用户名和密码写入文件 with open(r'userinfo.txt', 'a', encoding='utf8') as f: f.write('%s|%s\n' % (username, password)) print('%s注册成功' % username) def login(): username = input('username>>>:').strip() password = input('password>>>:').strip() with open(r'userinfo.txt', 'r', encoding='utf8') as f: for line in f: real_name, real_pwd = line.split('|') if real_name == username and password == real_pwd.strip('\n'): print('登录成功') return print('用户名或密码错误') func_dict = {'1': register, '2': login } while True: print(""" 1 注册 2 登录 """) choice = input('请输入执行功能编号>>>:').strip() if choice in func_dict: func_name = func_dict.get(choice) func_name() else: print('请输入正确的编号')
# 判断变量是否可以调用 print(callable(name)) # False print(callable(index)) # True # 返回ASCII码中数字对应的字符 print(chr(65)) # A 65-90 print(chr(122)) # z 97-122 # format字符串格式化输出 print('my name is {} and my age is {}'.format('jason',18)) print('my name is {0} {1} {1} and my age is {1} {0}'.format('jason',18)) print('my name is {name} {name} {age} and my age is {age}'.format(name='jason',age=18))
-
-
匿名函数与列表生成式等知识补充
- 三元表达式
-
函数名称空间
名称空间: 存放变量与值绑定关系的地方 三大分类 1.内置名称空间 python解释器启动立刻创建结束立刻销毁 2.全局名称空间 伴随python文件的开始执行/执行完毕而产生/回收 3.局部名称空间 函数体代码运行产生结束销毁 # 加载顺序:内置名称空间 > 全局名称空间 > 局部名称空间
作用域
作用域: 域指的是范围,作用域指的是作用的范围 二大类 1.全局作用域 内置名称空间 全局名称空间 2.局部作用域 局部名称空间 #取值顺序:局部空间 > 全局空间 > 内置空间
关键字global
# 如果想在局部修改全局名称空间中的名字对应的值 可以使用global关键字
匿名函数 即没有函数名的函数 语法结构 lambda 形参:返回值
l1 = [11, 22, 33, 44, 55, 66, 77, 88] # 将列表中每个元素加一 new_list = [] for i in l1: new_list.append(i+1) print(new_list) # 列表生成式 new_list = [i + 1 for i in l1] print(new_list) name_list = ['jason', 'kevin', 'tony', 'oscar'] # 将列表每个元素后面加上_NB的后缀 new_list = [] for name in name_list: new_list.append(name + '_NB') print(new_list) # 列表生成式 new_list1 = [name+'_NB' for name in name_list] print(new_list1) l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99] # 筛选出加一之后大于60的元素 new_list = [] for i in l1: if i+1 > 60: new_list.append(i) print(new_list) # 列表生成式 new_list1 = [i for i in l1 if i+1 > 60] print(new_list1)
# 语法结构 A if 条件 else B 当if后面的条件为True的时候使用A 为False使用else后面的B
# 什么是模块与包 具有一定功能的代码集合 可以是文件 也可以文件夹 # 导入模块的本质 会执行模块内代码并产生一个该模块的名称空间 将代码执行过程中的名字存放该名称空间中 然后给导入模块的语句一个模块名 该模块指向模块的名称空间 '''重复导入相同的模块 只会执行一次'''
导入模块的两种句式
1.import 模块名 2.from 模块名 import 子名1,子名2 # 如果模块名较长或者不符合你的看法 可以起别名 import A as B from 文件夹多层路径 import C as D
import time 1.time.time() # 获取当前时间的时间戳 2.time.strftime('%Y-%m-%d')) # 年月日 time.strftime('%Y-%m-%d %H:%M:%S')) # 年月日加时分秒 3. .sleep(3) # 休眠状态 4. def index(): print('123') time.sleep(3) print('哈哈哈') # 统计index函数执行的时间 5. start_time = time.time() index() end_time = time.time() print(end_time - start_time) # 增加或返回时间
-
os模块
-
hashlib模块
-
random模块
-
logging模块
-
创建文件夹 os.mkdir(r'文件夹01') # 只能创建单级目录 os.makedirs(r'文件夹02\文件夹03') # 可以创建多级目 删除文件夹 os.rmdir(r'文件夹01') os.rmdir(r'文件夹02\文件夹03') # 默认只能删一级空目录 os.removedirs(r'文件夹02\文件夹03\文件夹04') # 可以删除多级空目录 查看 print(os.listdir()) # 查看指定路径下所有的文件及文件夹 print(os.listdir('D:\\')) # 查看指定路径下所有的文件及文件夹 print(os.getcwd()) # 查看当前所在的路径 os.chdir(r'文件夹03') # 切换当前操作路径 print(os.getcwd()) # 查看当前所在的路径 判别 print(os.path.isdir(r'a.txt')) # 判断是否是文件夹 print(os.path.isdir(r'文件夹03')) print(os.path.isfile(r'a.txt')) # 判断是否是文件 print(os.path.isfile(r'文件夹03')) print(os.path.exists(r'a.txt')) # 判断当前路径是否存在 print(os.path.exists(r'文件夹03')) 路径拼接 res = os.path.join('','') # 该方法可以针对不同的操作系统自动切换分隔符 文件大小 print(os.path.getsize(r'a.txt')
import hashlib #选择加密算法:一般情况下采用md5即可md5 = hashlib.md5() #将待加密的数据传入算法中md5.update(b'hello') #获取加密之后的密文res = md5.hexdigest()print(res) 加盐处理 #加盐处理:在对用户真实数据加密之前再往里添加额外的干扰数据 #选择加密算法:一般情况下采用md5即可 md5 = hashlib.md5() #将待加密的数据传入算法中 #加盐md5.update('自己定制的盐'.encode('utf8')) md5.update(b'hello') #获取加密之后的密文res = md5.hexdigest()print(res) 动态加盐 #动态加盐 #选择加密算法:一般情况下采用md5即可 md5 = hashlib.md5() #将待加密的数据传入算法中 #加盐 md5.update('不固定 随机改变'.encode('utf8')) md5.update(b'hello') #获取加密之后的密文 res = md5.hexdigest() print(res)
随机数模块 import random # 随机返回0-1之间的小数 print(random.random()) # 随机返回指定区间的整数 包含首尾 print(random.randint(1,6)) # 掷色子 # 随机抽取一个 print(random.choices(['一等奖','二等奖','谢谢回顾'])) # 抽奖 print(random.choice(['一等奖','二等奖','谢谢回顾'])) # 随机抽取指定样本个数 print(random.sample([111, 222, 333, 444, 555, 666, 777], 2)) # 随机打乱元素 l = [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A", "小王", "大王"] random.shuffle(l) # 洗牌 print(l)
搜狗笔试题
产生一个五位数随机验证码
每一位都可以是数字\小写字母\大写字母
def get_code(n): code = '' for i in range(n): # 循环五次决定是几位验证码 # 每一次循环都应该是三选一 # 随机的数字 random_int = str(random.randint(0, 9)) # 随机的小写字母 random_lower = chr(random.randint(97, 122)) # 随机的大写字母 random_upper = chr(random.randint(65, 90)) # 随机选择一个作为一位验证码 temp = random.choice([random_int, random_lower, random_upper]) code += temp return code print(get_code(4))
import logging # 日志级别 logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message')
#可以将其他数据类型转换成字符串也可以将字符串转换成其他数据类型 d = {'username': 'tom', 'pwd': 123} import json
序列化
将其他数据类型转换成json格式的字符串 # 只有json格式字符串才会是双引号 双引号就是判断json格式字符串的重要依据
反序列化
将json格式字符串转换成对应的数据类型
文件序列化和反序列化
# with open(r'a.txt','w',encoding='utf8') as f: # 文件序列化 # json.dump(d,f) # with open(r'a.txt','r',encoding='utf8') as f: # 文件反序列化 # res = json.load(f) # print(res,type(res))
json模块的其他作用
在导入json模块后
输入json.encoder
按住CTRL,点击encoder就可以查看相关设定


浙公网安备 33010602011771号