昨日内容回顾
-
文件的读写模式
r with open(r'a.txt','r'encoding='utf8') as f: f.read() #只能读,不能写,文件不存在会报错 w with open(r'b.txt','w',enconding='utf8') as f: f.write() # 只能写,不能读,文件不存在会直接创建,文件存在直接清空内容输入数据(常用) a with open(r'c.txt','a',encoding='utf8') as f: f.write() # 只能写,不能读,文件不存在直接创建,文件存在时在模未追加数据(\n换行)
-
文件的操作模式
t 文本模式:只能对文本文件进行操作 b 二进制模式:可以对任意文件进行操作
-
常用操作
read write flush # 防止文件过大造成内存溢出,我们经常采用循环读取文件内容的方式 with open(r'a.txt',mode,encoding) as f: for line in f: pass
-
文件的修改(本质就是操作字符串)
-
函数的概念
讲一段代码封装起来后期可以无限制使用,可以防止代码冗余,后期可以无限制使用 减少代码冗余 就是准备好可以一直使用的工具
-
函数的语法结构
def 函数户名(参数1,参数2,。。。) '''函数注释类似于说明书''' 函数体代码 return 返回值 # 定义函数阶段不执行函数体代码只检测语法 # 函数必须先定义后使用 定义使用关键字def 调用直接使用函数名加括号(括号内为参数)
-
函数的返回值
1.函数没有return,运行完毕后默认返回none 2.return后面写什么就返回什么,如果有多个数据自动阻止成元组 3.函数体代码遇到return会立刻结束函数的运行(类似于break功能)
-
函数的参数
形参 在函数定义阶段书写的变量名 实参 在函数调用阶段传入的变量的值 # 形参与实参其实就是变量名与变量的值得相互关系 1。未知参数 按照位置一一传值,多一个不行少一个也不行 2.关键字参数 指名道姓的给函数的性参数值 3.默认参数 函数再定义阶段就已经给形参赋值,后续不指定就用默认的 4.可变长参数 接受多余的位置参数和关键字参数 默认使用的是 *args **kwargs
今日内容概要
-
作业讲解
-
python模块
用别人写好的代码帮助你完成需求(白嫖) os time detetime random hashlib
-
python面向对象
今日内容详细
作业
# 1.循环获取用户输入存入文件并且每一次都换行
with open(r'a.txt', 'w', encoding='utf-8') as f:
while True:
msg = input('请输入你想写入的内容>>>:').strip()
# 加上结束条件
if msg == 'q':
break
# 给用户内容加上换行符
msg = '%s\n' % msg
# 写入文件
f.write(msg)
2.将拷贝数据的功能封装成函数,文件路径由用户自己编写
def my_copy():
path1 = input('请输入你需要拷贝的文件路径')
with open(r'%s' % path1, 'rb') as f:
data = f.read()
# 在利用wb写入到新文件
path2 = input('请输入你需要拷贝到哪儿')
with open(r'%s' % path2, 'wb') as f:
f.write(data)
my_copy()
利用文件操作和函数完成用户的注册和登录功能(思考题)
1.注册功能封装成函数
用户输入用户名和密码之后直接存入文件中
2.登录功能封装成函数
获取用户数据然后利用文件操作读取文件数据比对
def register():
# 注册功能
username = input('username>>>:')
password = input('password>>>:')
# 构造用户数据
data = '%s:%s\n' % (username, password)
# 文件操作写入
with open(r'userinfo.txt', 'a', encoding='utf-8') as f:
f.write(data)
def login():
username = input('username>>>:')
password = input('password>>>:')
# 打开文件内容 比对是否有该用户
with open(r'userinfo.txt', 'r', encoding='utf-8') as f:
for line in f:
# 移除字符串首尾的\n
line = line.strip('\n')
# 对字符串进行切割操作
real_name, real_pwd = line.split(':') # 解压赋值
# 跟用户输入的用户名和密码比对
if username == real_name and password == real_pwd:
print('登录成功')
break # 也可以直接结束for循环
else:
# for循环全部结束之后运行else
print('用户名或密码错误')
f_dict = {'1': register, '2': login}
while True:
print("""
1.注册
2.登录
""")
ch = input('请选择你需要执行的功能>>>:').strip()
f_dict.get(ch)()
python模块
可以使别人写好的代码,也可以是自己写的代码
导入模块其实就是
本地导入
1.导入自己写的代码
improt mymd
2.导入本地自带的模块
import time
3.还可以导入网络上存在的模块
pip3 # 下载模块的工具
1.将pip所在的文件路劲添加到环境变量中
python3\scrtpts
2.输入pip3校验是否邮箱(一定要重新打开一个cmd窗口
3.下载网络上的模块
pip3 install 模块名
利用pip3下载模块的地址默认是国外的
我们可以修改至国内的下载模块地址
pip3 install 模块名 -i 网址
我们可以修改下载模块的地址,修改为国内的地址
(1)阿里云 http://mirrors.aliyun.com/pypi/simple/
(2)豆瓣http://pypi.douban.com/simple/
(3)清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
(4)中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
(5)华中科技大学http://pypi.hustunique.com/
# pycharm也提供了快捷下载的通道
# 导入模块的语句
# 方式1 所有资源
import 模块名
# 方式2 指定资源
from 模块名 import
# 如果模块名较长,我们可以给模块七别名
import 模块名 as 别名
常见模块的使用
"""
作为一名python工程师,当需要使用一些较为复杂的功能的时候,不要想着直接自己动手完成,而应该想着有没有相应的模块直接帮我实现
"""
使用模块基本上都是通过模块名点点点来完成操作的
# 时间模块
import time
# 时间戳:1970年1月1号距离刚刚代码执行距离的秒数
# print(time.time()) # 1609229465.276814
# time.sleep(3) # 将程序睡眠3秒之后再运行
# print(time.strftime('%Y-%m-%d %H:%M:%S'))
# print(time.strftime('%Y-%m-%d'))
# print(time.strftime('%m-%d'))
"""
%Y 年
%m 月
%d 日
%H 时
%M 分
%S 秒
"""
# import datetime
# print(datetime.datetime.today()) # 年月日时分秒
# print(datetime.date.today()) # 年月日
# import os
# os.mkdir(r'D:\s4_day07\haha')
# 随机数模块
import random
# print(random.random()) # 随机产生一个0-1之间的小数
# print(random.randint(1, 6)) # 随机产生一个1-6之间的整数(掷骰子)
# res = ['特等奖', '一等奖', '二等奖', '谢谢惠顾']
# print(random.choice(res)) # 随机选择一个元素(抽奖、随机抽查)
# l = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
# random.shuffle(l) # 随机打乱顺序(洗牌)
# print(l)
# 验证码:大写字母 小写字母 数字 三者随机组合生成的
# print(chr(65)) # A
# print(chr(90)) # Z
# chr将数字按照ASCII码表转换成对应的字符
"""
A-Z 65-90
a-z 97-122
"""
# code = ''
# # 五位数的验证码
# for i in range(5):
# # 随机生成一个大写字母
# upper_str = chr(random.randint(65, 90))
# # 随机生成一个小写字母
# lower_str = chr(random.randint(97, 122))
# # 随机生成一个数字
# random_int = str(random.randint(0, 9))
# # 随机从上面三个中取一个
# tmp = random.choice([upper_str, lower_str, random_int])
# # 字符串的拼接
# code += tmp
# print(code)
# 加密模块:将一串明文的数据加密成无法直接识别的内容
# 加密的目的其实就是为了保证明文数据的安全
# import hashlib
# # 加密的算法有很多 常见的有md5加密 sha加密
# md5 = hashlib.md5() # 生成一个md5加密的工具
# # 将明文数据录入
# md5.update(b'jason123')
# # 获取md5加密之后的密文结果
# res = md5.hexdigest()
# print(res)
# 我们无法用过加密之后的密文解密出明文
"""
你在网站上看到的所谓的解密其实内部逻辑是
123 自己通过md5加密 密文1
222 自己通过md5加密 密文2
888 自己通过md5加密 密文3
{'密文1':111,','密文2':222,'密文3':333}
"""
# 加盐处理:在需要加密的数据前面人为的添加一些干扰项
# import hashlib
# # 加密的算法有很多 常见的有md5加密 sha加密
# md5 = hashlib.md5() # 生成一个md5加密的工具
# # 将明文数据录入
# md5.update('公司内部自己定的一个干扰项'.encode('utf8'))
# md5.update(b'jason123')
# # 获取md5加密之后的密文结果
# res = md5.hexdigest()
# print(res)
# 动态加盐
import hashlib
# 加密的算法有很多 常见的有md5加密 sha加密
md5 = hashlib.md5() # 生成一个md5加密的工具
# 将明文数据录入
md5.update('每一次的干扰项都不一样'.encode('utf8'))
md5.update(b'jason123')
# 获取md5加密之后的密文结果
res = md5.hexdigest()
print(res)
面向对象(了解)
对象:其实就是一个内部包含了数据和功能的容器
类:多个对象之间相同的数据和功能的结合体(减少代码冗余)
# 学生对象1:
数据:
学校=清华大学
姓名=李建刚
性别=男
年龄=28
功能:
选课
# 学生对象2:
数据:
学校=清华大学
姓名=王大力
性别=女
年龄=18
功能:
选课
# 学生对象3:
数据:
学校=清华大学
姓名=牛嗷嗷
性别=男
年龄=38
功能:
选课
# 学生类
相同的特征:
学校=清华大学
相同的功能:
选课
# 在编程世界里必须要先有类才能产生对象
class Student: # 类的命名应该使用“驼峰体”
school='清华大学' # 数据
def choose(self): # 功能
print('choosing a course')
"""
类的语法结构
class 类名:
相同的数据
相同的功能
1.class
定义类的关键字
2.类名
命名规范与变量名一致,并且类名推荐首字母大写
3.相同的数据
变量名 = 变量值
4.相同的功能
def 函数名():
pass
"""
"""对象如果需要拥有自己独有的数据 必须在类里面定义一个__init__方法"""
class Student: # 类的命名应该使用“驼峰体”
school = '清华大学' # 数据
# 对象独有的数据
def __init__(self, name, age, gender):
self.name = name # 固定写法
self.age = age
self.gender = gender
def choose(self): # 功能
print('%s正在选课'%self.name)
obj1 = Student('jason', 18, 'male')
obj2 = Student('tony', 32, 'male')
obj3 = Student('tom', 33, 'female')
print(obj1.school)
print(obj2.school)
print(obj3.school)
print(obj1.name)
print(obj2.name)
print(obj3.name) # 对象点数据
obj1.choose() # 对象点方法
obj2.choose()
obj3.choose()
作业
1.循环获取用户输入存入文件并存储
2.随机验证码封装成函数版本,可以做到用户想生成几位就生成几位
3.今日作业讲解自己尝试着写写