首页 > 技术文章 > python模块与面向对象(补)

kailun-aixuexi 2021-01-15 11:50 原文

昨日内容回顾

  • 文件的读写模式

    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.今日作业讲解自己尝试着写写

推荐阅读