当前位置: 首页 > news >正文

Python——常见内置模块

Python

  • 模块(Modules)
    • 1、概念
    • 模块=函数+类+变量
    • 2、分类
    • 3、模块导入的方法:五种
    • 4、使用import 导入模块
    • 5、使用from……import部分导入
    • 6、使用as关键字为导入模块或功能命名别名
    • 7、模块的搜索目录
    • 8、自定义模块
  • 常见内置模块
  • 一、math模块
  • 二、random模块
  • 三、OS模块
  • 四、os.path模块
  • 五、sys模块
  • 六、UUID模块
  • 七、时间日期模块
    • 1、time模块
    • 2、datetime模块
    • 3、calendar模块
  • 八、加密模块
    • 1、hashlib
    • 2、hmac模块

模块(Modules)

1、概念

  • 将实现某一特定功能的代码放置在文件中,以便与其它程序进行导入,可以避免函数名或变量名的冲突,该文件称为模块,扩展名.py
  • 打开python的安装包,lib文件下全是模块

模块=函数+类+变量

2、分类

  • 内置模块:目前python内置模块大概在200多个,如:
    image-20230330135922905
  • 自定义模块:第三方模块

3、模块导入的方法:五种

  • import 模块名
  • from 模块名 import 功能名
  • from 模块名 import
  • import 模块名 as 别名
  • from 模块名 import 功能名 as 别名

4、使用import 导入模块

  • 格式1:import 模块名
  • 格式2:import 模块名1 , 模块名2 ,…… 模块名n
  • 使用方法:模块名.功能名()
import  math
print(math.sqrt(9))

5、使用from……import部分导入

  • 意义:使用import导入后会把所有内部功能全部导入到当前的文件中,比较臃肿一些,若需要导入部分功能可以使用from语句
  • 例:
from math import sqrt, floor
print(sqrt(9), floor(10.88))
  • 注意:使用时不需要书写模块名

6、使用as关键字为导入模块或功能命名别名

  • 原因:某些情况下导入的模块或功能名称过长,可以使用较短的别名对齐命名,使用时较为方便
  • 例:
import time as ttprint('hello')
tt.sleep(3)
print('world')
  • 注意:别名命名后不能在使用原有的模块名

7、模块的搜索目录

  • 当使用import语句导入模块时,默认情况下会按照如下顺序进行模块查找:

    • 执行python文件的当前项目目录
    • 环境变量:PYTHONPATH
    • python解释器安装目录中
  • 可以通过sys.path查找目录的路径:

import sys
print(sys.path)

8、自定义模块

  • 作用:将相关的代码编写在一个单独的文件中,并命名为模块名.py,可以导入到程序中使用,注意自行创建的模块名不能与python自带的标准库中模块名重名
  • 例:新建一个模块文件prime.py,实现素数判断:
def fun_prime(num):if num<2:print('请输入大于2的正整数')else:for i in range(2,num):if num%i==0:return 0else:return 1

新建一个python文件加载导入上述模块,实现100以内的素数判断输出

import primefor i in range(2, 100):if prime.fun_prime(i) == 1:print(i, end=' ')

在这里插入图片描述

  • 自定义模块中的功能测试
    • 作用:编写完自定义模块后,最好在模块内部对代码进行测试,以防止出现问题
    • 魔方方法:_ _ name _ _ ,每个模块中都会有一个字符串变量,记录模块名称,随着运行页面的不同,返回值结果也不相同
    • 当前页面执行:返回值为_ _ main_ _
def fun_prime(num):if num < 2:print('请输入大于2的正整数')else:for i in range(2, num):if num % i == 0:return 0else:return 1print(__name__)  #结果:_ _ main_ _

在第三方页面导入执行时,返回值:模块名称

import primefor i in range(2, 100):if prime.fun_prime(i) == 1:print(i, end=' ')
# 输出 prime 模块名

在这里插入图片描述
基于以上特性,可以把_ _name _ _编写在自定义模块汇总,格式如下:
if _ name _ _ ==’ _ _ name_ _ _’
处理

def fun_prime(num):if num < 2:print('请输入大于2的正整数')else:for i in range(2, num):if num % i == 0:return 0else:return 1if __name__ == '__main__':if fun_prime(5) == 1:print('素数')else:print('平数')

在这里插入图片描述

常见内置模块

  1. 什么是模块?
    import XXX ------其中 XXX就是模块 ,自己定义的XX.py文件本质就是模块
    打开python的安装包,lib文件下全是模块
  2. 模块的分类
  • 通过模块的创建者
    • 系统内置模块
      uuid、os、math、random均是python官方提供的cpython解释器提供的模块
    • 第三方模块
      程序员、组织、公司 创建的第三方模块,第三方模块需要使用,首先需要安装模块
      在线安装(简单方便,这种情况必须有网)
      cmd-----pip install modle_name(如果有问题 python -m pip install modle-name))
      pip install requestsrequests是使用爬虫的,不用安装,只是给大家演示一下)
      ------安装requests模块,一般会出现进度条,因为我以及安装了,所以会出现“already”,如下图:
      离线安装(1,先下载离线安装包xxx.zip 2.解压安装包 3.安装中setup.py 4.cmd:python install setup.py
    • 自定义模块
      xxx.py
  1. 模块的导入问题
  • import 关键字导入 --------- import math
  • import 模块名称 as alias(别名)
  • import hashlib as h (给hashlib起别名)
  • from 包 import 模块名称 python3强烈推荐这种方法

一、math模块

math主要的作用是数学运算

方法说明
ceil(天花板的意思) 向上取整
floor向下取整 注意:四舍五入(全局函数中的round)
e属性 自然常数
fabs求绝对值 等价于全局函数abs()
fmod求模
isnan判断是不是一个数字(是数字返回flase nan—not a number)
isfinite判断是不是无限
pi圆周率
pow()幂次方
sqrt根号 开平方根
  • math 模块常量
常量描述
math.e返回欧拉数 (2.7182…)
math.inf返回正无穷大浮点数
math.nan返回一个浮点值 NaN (not a number)
math.piπ 一般指圆周率。 圆周率 PI (3.1415…)
math.tau数学常数 τ = 6.283185…,精确到可用精度。Tau 是一个圆周常数,等于 2π,圆的周长与半径之比。
  • 常见方法:

二、random模块

该模块主要用来产生随机数(伪随机数,计算机产生不了真正的随机数,是依靠算法来计算的)

方法说明
randint()产生随机整数[m,n]
random()产生一个0~1内的随机数[0,1) random.random() 可以乘10取整得到0·9的整数
uniform()产生基于正态分布的随机数(一般用不到)
range()产生一个范围的随机数
choice()在序列(有序的,set是无序的)中随机筛选一个元素 ls=[1,2,3,4,5,6,7,8,9] random.choice(ls) s = {1,2,3,4,5,6,7} random.choice(s)-----报错

其他的方法,自己调取帮助文档help()自己学习,并且总结

  • 查看:
import randomprint(dir(random))
  • 例:random() 方法返回一个随机数,它在[半开放区间 [0,1) 范围内,包含 0 但不包含 1
import randomprint(random.random())
  • 例:seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数
import randomrandom.seed()  # 默认时,数字相同
print ("使用默认种子生成随机数:", random.random())
print ("使用默认种子生成随机数:", random.random())random.seed(10)
print ("使用整数 10 种子生成随机数:", random.random())   # 相同
random.seed(10)
print ("使用整数 10 种子生成随机数:", random.random())  #  与上例相同random.seed("hello",2)
print ("使用字符串种子生成随机数:", random.random())

在这里插入图片描述

  • 常用
    • randint(a, b) #返回随机一个整数 N 满足 a <= N <= b
    • random.sample(range(0, 20), 20) 返回随机序列

三、OS模块

操作的是系统的文件系统
os.system(“cls”)-----清屏

方法说明
chdir(path)修改当前工作目录 os.chdir(“c:\”)------os.chdir(“…”) ,一般不会更改
curdir获取当前目录 属性 注意返回的是相对路径 (绝对路径os.path.abspath(os.curdir))
chmod()修改权限 主要用在linux,help(os.chmod)(不做演示)
close关闭文件路径(不做演示)
cpu_count()返回cpu的核对应线程数(2核4线程)
getcwd()获取当前路径,返回的是绝对路径 ,相当于linux的pwd
getpid()获取当前进程的进程编号(任务管理器—详细信息)
getppid()获取当前进程的父进程的进程编号
kill()通过进程编号杀死进程(明白就行)
linesep对应系统下的换行符
listdir()返回对应目录下的所有文件及文件夹(隐藏文件也可以调取出来),返回的是列表
makedirs()创建目录,支持创建多层目录(文件夹)os.makedirs(“a/b/c/d”)
mkdir创建目录,只支持一层创建,不能创建多层
open创建文件,等价于全局函数open (IO流详细讲)
pathsep获取环境变量的分隔符 windows ; linux :
sep路径的分割符 windows \ linux /
remove(文件名或者路径)删除文件 os.remove(b.text)
removedirs()移除目录,支持多级删除,递归删除
system执行终端命令
windows 换行: \r\n
类unix中 换行:\n
  • 目录也称为文件夹,用于分层保存文件

  • os模块与操作系统相关,不同的操作系统运行os模块,返回结果不同

import os
print(os.name)
# nt 为windows操作系统,若为posix表示Linux或Mac OSos.system("cls")   #清屏
  • 路径:定位一个文件或目录的字符串称为路径
    • 相对路径:当前目录开始访问
    • 绝对路径:文件的实际路径,从盘符号或根(\)开始访问
import os
print(os.getcwd()) # 显示当前工作目录
import os
print(os.path.abspath('test1.py')) # 获取绝对路径

四、os.path模块

先引入Import os 模块,在os模块里面有个很重要的模块path,要注意path是一个子模块,可以通过help(os.path)查看帮助文档
那么此模块的导入方式:先导入os模块,使用dir(os.path);其次可以直接import os.path导入模块;import os.path as p ----------dir§;from os import path

方法说明
abspath(相对路径)返回路径对应的绝对路径(完整的路径) path.abspath(“.”)
altsep查看python中的各种符号
basename文件名称,shell编程里面也有 path.basename(“路径”)
dirname文件所在的目录,shell编程里面也有
exists判断文件或者目录是否存在(特别有用,使用爬虫爬取数据的时候需要判断是否有这个文件或者文件夹)
getctime创建时间(不做演示)
getmtime修改时间(不做演示)
getsize获取文件的大小,单位是字节
isdir判断path是不是目录(文件夹)
isfile判断path是不是文件
isabs判断是不是绝对路径(不演示)
islink判断是不是连接(不演示)
ismount判断是不是挂载文件(Linux下要用的)(不演示)
join (p1,p2)拼接路径 name=“123.txt” url=“C:/a/b/c” url +“/”+name path.jion(url,name)
sep路径分隔符 url + path.sep +name
split分割路径 path.split(“C://desktop”)
realpath返回真实路径 和abspath一样
  • 判断目录是否存在
    • 格式:os.path.exists(path)
    • path:要判断的路径,推荐绝对路径
    • 存在返回True,否则返回False
import os
print(os.path.exists('c:\demo')) # 判断目录
print(os.path.exists('test1.py')) # 判断文件
  • 创建目录
    • 创建一级目录:os.mkdir(path)
    • 一般用于创建指定路径中最后一级目录,若上级目录不存在则会抛出异常,若已存在目录会抛出异常
    • 例:在创建一个c:\demo目录
import os
os.mkdir('c:\\demo') # 注意转义,可在win系统查看

注意:上例再次执行,由于目录已存在会抛出异常,所以一般会和判断目录是否存在的函数一同使用

import ospath = 'c:\\demo'
if not os.path.exists(path):os.mkdir(path)print('目录创建成功')
else:print('目录已存在')
  • 创建多级目录:os.makedirs(path)
# 递归方式创建目录
import os
os.makedirs(r'c:\t1\t2\t3') # 可以使用r起到转义符失效的作用
  • 例:批量创建20个目录
import os
# 创建20个文件夹
os.mkdir('c:\\python')
for i in range(1, 21):# 如果不存在对应的文件夹,就创建if not os.path.exists('c:\\python\\第{}次课'.format(i)):os.mkdir('c:\\python\\第{}次课'.format(i))
  • 删除目录
    • 格式:os.rmdir(path)

    • 注意:只有当要删除的目录为空时才能删除

    • 若删除的目录不存在则会抛出异常,所以一般会和判断目录是否存在的函数一同使用

    • 可以使用shutil.rmtree()函数删除不为空的目录

    • 删除文件:os.remove(path)

import os
os.rmdir(r'c:\demo')
  • 文件或目录重命名
    • 格式:os.rename(src , dst)
    • src:指定需要重命名的文件或目录
    • dst:新名称的文件或目录
    • 若重命名的目录或文件不存在则会抛出异常,所以一般会和判断目录是否存在的函数一同使用
import os
os.mkdir('c:\\demo')
os.rename('c:\\demo',r'c:\test')
  • 获取文件信息

    • 获取文件的访问事件、修改时间、大小等信息
    • os.stat(path)
  • 常见方法汇总:

import osprint(os.name)  # nt 表示Windows 系统;'posix’表示Linux系统
print(os.getcwd())  # 显示当前工作路径
print(os.listdir('C:\Windows'))  # 显示指定目录下所有的文件和目录
print(os.mkdir('a'))  # 生成 单层目录
print(os.path.basename('D:\python\\test1'))  # 返回文件名

作业:使用os和os.path以及函数的递归完成:

给出一个路径,遍历当前路径所有的文件及文件夹

打印输出所有的文件(遇到文件输出路径,遇到文件夹继续进文件夹)

 import osfrom os import path#定义一个函数(方法)def scanner_file(url):#os.listdir 输入当前路径下所有的文件和文件夹files = os.listdir(url)# print(files) 验证#进行路径拼接  三种方式for f in files:#real_path = url +”\\” +f#real_path = url +os.sep +freal_path = path.jion(url,f)#print(real_path) 得到路径#判断该路径是不是文件或者目录if path.isfile(real_path):print(path.abspath(real_path))#是一个目录elif path.isdir(real_path):#此时是一个文件夹Scanner_file(real_path)else:print(“其他情况”)passScanner _file(“D:\\”) #不建议遍历C盘,会涉及权限的问题

五、sys模块

方法说明
api_version获取当前python的内部版本号
argv()接收脚本参数的,注意第一个参数是脚本名称(javaz中mian函数中有个args) import sys print(sys.argv) ----- python xxx.py 返回的是[“xxx.py”] python xxx.py 1 2 3 hahaha
copyright输出cpython的版权信息
sys.exit()退出系统
getdefaultencoding()获取默认编码, 默认是utf-8(python3),python2的编码是根据系统一致
getfilesystemencoding获取文件系统的默认编码,默认是utf-8
getrecursionlimit获取python对于递归的限制层数
setrecursionlimit(num)重新设置递归的限制层数,注意能不用不要用,以免造成其他的问题
getrefcouont(对象)获取对象的引用计数,是垃圾回收机制中的引用计数 例如:ls=[1,2,3,4] sys.getrefcouont(ls) ----结果是2 (默认有一个引用计数 加上ls) a = ls sys.getrefcouont(ls) ----结果是3 b=ls 结果是4
getwindowsversion()返回窗口的版本信息
verson获取版本信息
  • 例:
import sys
a=2
if a<=2:sys.exit(8)
print(a)  # 未执行
#注释:退出python执行程序,下面的代码将不会执行,如同shell中的exit一样。
import sys
print(sys.version)  # 获取版本信息
import sys# sys.stdin.readline() 相当于input,区别在于input不会读入'\n'
aa = sys.stdin.readline()  # 输入数据多一个'\n'
bb = input('请输入:')print(len(aa))   
print(len(bb))
 import osfrom os import pathimport sys#定义一个函数(方法)def scanner_file(url):#os.listdir 输入当前路径下所有的文件和文件夹files = os.listdir(url)# print(files) 验证#进行路径拼接  三种方式for f in files:#real_path = url +”\\” +f#real_path = url +os.sep +freal_path = path.jion(url,f)#print(real_path) 得到路径#判断该路径是不是文件或者目录if path.isfile(real_path):print(path.abspath(real_path))#是一个目录elif path.isdir(real_path):#此时是一个文件夹Scanner_file(real_path)else:print(“其他情况”)passls = sys.argvif len(ls)<2:print("对不起,这个脚本需要输入参数,参数是需要遍历的磁盘路径")else:Scanner _file(sys.argv[1])运行:python  xxx.py D://

python的垃圾回收原理:
​ 引用计数为主,以标记清除和分代收集为辅
java:以标记清除为主,以引用计数和分代收集为辅

六、UUID模块

Uuid模块 -----是一种特殊的技术,在文件上传、文件备份会经常使用
------------- 获取的是永不重负的字符串uuid4().hex

  • 概念:UUID: 通用唯一标识符 ( Universally Unique Identifier ),对于所有的UUID它可以保证在空间和时间上的唯一性,它是通过MAC地址、 时间戳、 命名空间、 随机数、 伪随机数来保证生成ID的唯一性,有着固定的大小( 128 bit位 ),通常由 32 字节的字符串(十六进制)表示。

  • python的uuid模块提供的UUID类和函数uuid1(),uuid3(),uuid4(),uuid5() 来生成1, 3, 4, 5各个版本的UUID ( 需要注意的是:python中没有uuid2()这个函数)。

import uuidname = 'test_name'
namespace = uuid.NAMESPACE_DNSa = uuid.uuid1()  # 基于时间戳
print(a, type(a))b = uuid.uuid3(namespace, name)  # 基于名字的MD5散列值
print(b, type(b))c = uuid.uuid4()  # 基于随机数
print(c, type(c))d = uuid.uuid5(namespace, name)  # 基于名字的SHA-1散列值
print(d, type(d))

七、时间日期模块

1、time模块

Python提供的一个 time模块来格式化时间,在python爬虫等应用中相当有用

Dir(time)
  • Python 提供了一个 time模块来格式化时间,在python爬虫等应用中相当有用
import timet = time.time()
print("当前时间戳为:", t)
localtime = time.localtime()
print("本地时间为 :", localtime)  # 时间元组,附表查看
localtime = time.asctime(time.localtime())
print("本地时间为 :", localtime)
# 格式化时间
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))print(time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))

方法说明
asctime()获取当前时间
ctime()获取当前时间
localtime()获取本地时间 返回的是对象,方便自己完成格式化 ltiem = time.localtime() ltime.tm_year print(“%s-%s-%s &s:%s:%s”%(ltime.tm_year,ltime.tm_mon,ltime.tm_mday,ltime.tm_hour,ltime.tm_min,ltime.tm_sec))
sleep(1)表示休眠时间,单位是秒
time()获取当前系统的时间戳,单位是秒(计算机从1970年0时0分0秒到现在秒数)
strftime()将时间对象格式化为字符串 f—format help(time.strftime) time.strftime(“%Y-%m-%d”)
strptime()将一个特定格式的时间字符串转换成时间对象 help(time.strptime) s=“2019-08-03 07:35:35” type(s) time.strptime(s,“%Y-%m-%d %H:%M:%S”)
import timet = time.time()
print("当前时间戳为:", t)
localtime = time.localtime()
print("本地时间为 :", localtime)  # 时间元组,附表查看
localtime = time.asctime(time.localtime())
print("本地时间为 :", localtime)
# 格式化时间
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))print(time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))

2、datetime模块

对Time模块的补充,用于时间的处理

dir(time)

Datetime子模块:

  • 常用类:date 类、time 类、datetime 类、timedelta 类
import datetime as dtx = dt.date(2021, 10, 1)  # 年、月、日
y = dt.time(7, 15, 30, 10)  # 时、分、秒、微秒
z = dt.datetime(2021, 10, 1, 7, 15, 30)  # date类和time类的结合,参数:年、月、日、时、分、秒
d = dt.timedelta(3, 2, 1, 6)  # 日、秒、微秒、毫秒,分钟,小时,周星期
print(x, y, z, d)
From datetime import datetime
Dir(datetime)
now()--------------获取当前时间

3、calendar模块

  • 常用方法:
import calendarprint("calendar.calendar()返回某年的日历:")
print(calendar.calendar(2022))print("calendar.month()返回某年某月的日历:")
print(calendar.month(2022, 11))print("calendar.isleap()返回是否是闰年:")
print(calendar.isleap(2020), calendar.isleap(2021))
print("calendar.leapdays()返回两年之间的闰年总数:")
print(calendar.leapdays(2000, 2021))print("calendar.weekday()返回某年某月某日是周几:")
print(calendar.weekday(2022, 11, 23))

在这里插入图片描述

八、加密模块

有了解过加密吗?什么地方用到过加密?加密是计算机最重要的计数之一,无论是学习哪一方面,都需要学习加密。
加密算法的分类(须牢记):

  • 以算法是否可逆:
    • 可逆算法
      是不是使用用一个密钥:
      • 对称加密
        解密和加密用的是同一密钥(压缩文件—输入密码(可以暴力破解,百度) 并不是说是右击文件夹对文件夹进行隐藏)
        例如:DES算法
      • 不对称加密
        加密和解密使用的是一对密钥(公钥、私钥),网络中大部分使用的就是不对称加密,https协议(使用的证书认证,也就是CA认证)(HTTP协议不安全,各种钓鱼网站等信息不安全)
        例如: RSA
    • 不可逆算法 (hash算法)
      特点:不可逆、结果是唯一的
      Md5

1、hashlib

import hashlib
dir(hashlib)   

哈希算法

  • 1、 注意:hashlib所有的hash操作起来是一样的,就是你学会一个其它的用法都市一样的,只改变名称就可以,但是在Java里就不一样了,每个算法不一样
    cmd窗口:md5 = hashlib.md5()
    ​ md5
  • 2、 使用步骤:
    创建算法对象(md5 sha256),返回一个算法对象
    注意: 调用MD5的时候一定要给参数,例如:md5 = hashlib.md5("12345"),这个错误不是其他错误,需要接收字节数据不能是字符串md5 = hashlib.md5("12345".encode("utf-8"))
    如果不做盐值混淆,直接调用hexdigest() md5.hexdigest()
    哈希算法的特点:结果唯一、不可逆,哈希算法是无法反向解密的,安全性特别强,因为结果唯一,可以使用碰撞破解,先把MD5的值存下来,下一次遇到的话就可以破解了
    https://cmd5.com/ 这个网站可以对MD5密码解密
    在数据校验、安全检查的时候一定不要做盐值混淆(淘宝买东西,订单的10000元可以手动改成1元,所以淘宝会对订单的生成做一个数据校验,价格、数量、时间戳(类似一个随机数)等做一个md5)
    在注册账号的时候,需要输入密码和账号存储到数据库中,密码可以铭文存储到数据库吗?不可以,运维人员一定可以看的得到所有人的密码和账号,这样就很不安全,使用密码校验的时候使用的密文校验。
  • 3、 盐值混淆
    Hash容易碰撞破解,一般建议使用盐值混淆
Md5.update(salt)
md5 = hashlib.md5("12345".encode("utf-8"))
md5.uptate("!@@@@&%hhh".encode("utf-8"))
md5.hexdigest()

2、hmac模块

hmac也是一个哈希加密库,而且用到了对称加密
参数: 第一个参数是要加密的字符串,第二个参数是盐值 ,第三个参数是加密算法

hmac.new("123456".encode("utf-8"),“hahhah”.encode("utf-8),md5)

首先会使用对称加密(密钥就是盐值),之后将加密后的数据再做一次hash加密,盐值混淆,所以整个结果十分安全。
练习:完成用户的登录注册

#完成登录注册案例
import sys
import hashlib
#用来存储所有的用户信息
users = []
slat = "hahha!@@@@%$^"# def password_md5(slat,password):def password_md5(password):md5 = hashlib.md5(password.encode("utf-8"))#盐值混淆md5.update(slat.encode("utf-8"))return md5.hexdigest()
def main():print("~*"*20)print("\t\t 1.用户注册")print("\t\t 2.用户登录")print("\t\t 3.退出系统")print("~*"*20)choice = input("请输入您要操作的选项:")return choice
def register():username = input("请输入你的用户名称:")password = input("请输入你的用户密码:")#保存前要校验数据if username == None or username.strip() == " ":
print("用户名不能为空")
return if password == None or password.strip() == " " or len(password)<3:
print("密码长度不能小于3位")
return #判断用户是否存在?怎么判断?用户名?密码?用户名+密码#  for i in users:#  	if i.get("username") ==username:#  print("对不起,该用户已经存在,请请重新输入")# return if exits_user(username):
print("对不起,该用户已经存在,请请重新输入")
return	#组建成一个字典对象user = {}user["username"] = username#user["password"] = password#print(user)#密码加密留作业	user["password"] = password_md5(password)users.append(user)#验证print(users)
def exits_user(username):for i in users:
if i.get("username") ==username:#print("对不起,该用户已经存在,请请重新输入")return Truereturn False
def is_login(username,password):for i in users:
if i.get("username") == username and i.get("password")==password:print("登录成功")return Truereturn False
def login():username = input("输入用户名:")password = input("输入用户密码:")#加密密码password = password_md5(password)# for i in users:# 	if i.get("username") == username and i.get("password")==password:# print("登录成功")# returnif is_login(username,password):
print("恭喜你登录成功")else:
print("对不起,登录失败,请重新登录")
while True:#独立的界面# print("~*"*20)# print("\t\t 1.用户注册")# print("\t\t 2.用户登录")# print("\t\t 3.退出系统")# print("~*"*20)# choice = input("请输入您要操作的选项:")choice = main()if choice == "1":
print("用户注册")
#注册本质是什么?将数据存储下来,第一选择数据库(不学)通过IO技术将数据直接持久化磁盘   存储到内存中(容器 选择哪个容器最合适?list+字典)
register()elif choice == "2":
print("用户登录")
login()else:
print("程序正常退出")
sys.exit()

相关文章:

Python——常见内置模块

Python 模块&#xff08;Modules&#xff09;1、概念模块函数类变量2、分类3、模块导入的方法&#xff1a;五种4、使用import 导入模块5、使用from……import部分导入6、使用as关键字为导入模块或功能命名别名7、模块的搜索目录8、自定义模块 常见内置模块一、math模块二、rand…...

JAVA毕业设计112—基于Java+Springboot+Vue的宠物领养社区小程序(源码+数据库)

基于JavaSpringbootVue的宠物领养社区小程序(源码数据库)112 一、系统介绍 本系统前后端分离带小程序 小程序&#xff08;用户端&#xff09;&#xff0c;后台管理系统&#xff08;管理员&#xff09; 小程序&#xff1a; 登录、注册、宠物领养、发布寻宠、发布领养、宠物社…...

golang log模块使用

在Go中&#xff0c;log 包是用于输出日志信息的标准库。以下是一些基本的 log 包的使用示例&#xff1a; 基本用法&#xff1a; package mainimport ("log" )func main() {log.Println("This is a log message.") } 运行程序&#xff0c;你会在控制台看到日…...

软件开发中的抓大放小vs极致细节思维

最近在开发过程中&#xff0c;遇到了好多次 “这个需求点这次要不要做&#xff1f;” 的问题&#xff0c; 主要有两方阵营&#xff0c;比如以研发主导的 “这次先不做、等必要的时候再做” &#xff0c;另外一方是以PM主导的 “这个不做需求不完整&#xff0c;可能影响用户体验…...

java文件上传以及使用阿里云OSS

JavaWeb 文件上传本地存储阿里云OSS配置文件 yml配置文件 文件上传 前端页面三要素&#xff1a; 表单项type“file” 表单提交方式post 表单的enctype属性multipart/form-data 本地存储 保证上传的文件不重复 //获取原始文件名String originalFilename image.getOriginalFi…...

相关性分析和作图

相关的类型 1. Pearson、Spearman和Kendall相关 Pearson 积差相关系数衡量了两个定量变量之间的线性相关程度。&#xff08;连续&#xff09; Spearman等级相关系数则衡量分级定序变量之间的相关程度。&#xff08;分类&#xff09; Kendall’s Tau 相关系数也是一种非参数的…...

AlphaFold的原理及解读

1、背景 蛋白质是生物体内一类重要的生物大分子&#xff0c;其结构复杂多样&#xff0c;蛋白质的结构对于理解其功能和参与的生物学过程具有重要意义。从生物学角度上看&#xff0c;蛋白质的结构可以分为四个层次&#xff1a;初级结构、二级结构、三级结构和四级结构。 初级结…...

【ChatGLM3-6B】Docker下快速部署

【ChatGLM2-6B】小白入门及Docker下部署 前提下载安装包网盘地址 开始安装加载镜像启动镜像进入容器启动模型交互页面访问页面地址 前提 安装好了docker安装好了NVIDIA显卡16G 下载安装包 网盘地址 ​ 这里因为网盘上传文件有大小限制&#xff0c;所以使用了分卷压缩的方式…...

两部手机数据传输后备忘录不见了怎么回事

想必很多人都遇到过&#xff0c;当两部手机进行备忘录数据传输后&#xff0c;突然发现备忘录不见了&#xff0c;这让人不禁着急上火&#xff0c;我也曾经遇到过这种事情导致很多重要的内容都丢失了。 一般出现这种情况可能是因为&#xff0c;两部手机使用的是不同的云服务&…...

【Unity入门】LayerMask小结

LayerMask常用的几种方法 LayerMask.GetMask 根据 层名称 获取其层遮罩值 遮罩值 2^层索引 假设 UserLayerA 和 UserLayerB 是第十层和第十一层。 这两个层会具有 User Layer 值 10 和 11。若要获取其层遮罩值&#xff0c; 可以将其名称传入 GetMask。参数可以是 其名称的列…...

mysql按年、季度、月,统计

以下是按年、按季度和按月统计SQL查询语句&#xff1a; 按年统计&#xff1a; SELECTds.checker,YEAR(ds.create_time) AS settleYear,SUM(ds.quantity) AS quantity,SUM(ds.approval_price) AS approvalPrice FROMdata_settle ds WHEREds.delete_flag 0AND ds.approval_sta…...

Python的换行和转义:深入理解代码排版与字符串处理

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python的换行和转义&#xff1a;深入理解代码排版与字符串处理&#xff0c;全文2700字&#xff0c;阅读大约8分钟。 在Python编程中&#xff0c;正确使用换行和转义字符是保…...

dart多线程双向通信的案例----【小学4年级课程】

下面是运行后的打印顺序 I/flutter (20170): 上班 I/flutter (20170): 这里是校长室:main I/flutter (20170): 这里是饭堂:fantang1 I/flutter (20170): 这里是收发室--检查小孩发回去给他妈妈的信息是&#xff1a;我是秘书的儿子&#xff0c;我来到在校长室了。校长今晚想吃羊…...

每日一练:简易计算器

1. 题目 设计实现一个简易的计算器&#xff0c;可以进行加减乘除的计算。可以考虑通过GUI和命令行输入等方式实现。 2. 设计思路 创建一个简单的用户界面&#xff0c;可以使用 Python 的 Tkinter模块。在界面上放置按钮&#xff0c;每个按钮代表一个数字、运算符或其他功能。…...

Jmeter和Testlink自动化测试框架研究与实施

摘 要 目前基于Jmeter的接口自动化测试框架&#xff0c;大多只实现脚本维护和自动调度&#xff0c;无法与Testlink进行互通&#xff0c;实现测试方案与自动化实施流程连接&#xff0c;本文基于Testlink、Jmeter、Jenkins实现&#xff1a;通过Testlink统一维护接口自动化测试用…...

MethodArgumentNotValidException 与 ConstraintViolationException

MethodArgumentNotValidException 和ConstraintViolationException 都是用于处理参数校验异常的异常类&#xff0c;但它们在不同的上下文中使用。 1. MethodArgumentNotValidException&#xff1a; - MethodArgumentNotValidException 是在 Spring MVC 或 Spring Boot 中处…...

【数学】旋转矩阵

参考链接 OpenGL from OpenGL.GL import * from OpenGL.GLUT import * from math import * import numpy as np def draw_axes():glClear(GL_COLOR_BUFFER_BIT)# 绘制坐标轴glColor3f(1.0, 1.0, 1.0) # 设置坐标轴颜色为白色glBegin(GL_LINES)glVertex2f(-1.0, 0.0) # x 轴g…...

Python与设计模式--中介者模式

23种计模式之 前言 &#xff08;5&#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、&#xff08;11&#xff09;策略模式、责任链模式、命令模式、中介者模…...

后台管理系统开源项目

最近项目没有什么事做&#xff0c;就自己整理&#xff0c;修改了一些vue2&#xff0c;react的后台管理系统项目&#xff0c;方便以后有需要可以直接提取&#xff0c;当然也方便了大家 vue2技术栈 lyl-vueProjectAdmin: vue2后台管理系统 react技术栈 lyl-reactAdminProject:…...

电子印章管理系统:是什么、3个平台推荐

说到印章&#xff0c;相信看过近现代电视剧的人都见过&#xff0c;一般在订立合约时最常用到&#xff0c;双方在合约上加盖印鉴&#xff0c;即代表着合约的成立。 我小时候还见过我父亲的印章&#xff0c;只是随着时代的发展&#xff0c;印章因为不易携带&#xff0c;容易被盗…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...