模块定义:一个.py结尾的文件就是一个模块 里面存放的是类、函数、数据
模块导入:import 模块名:导入一整个模块
from 模块名 import 模块里的函数:把指定的成员导入进入我当前的作用域里面
from 模块名 import *:将指定模块中所以的成员全部导入到当前的作业域中
如果导入进来的成员和自身的成员冲突,距离谁近,就执行谁。
通过as加别名可以解决后面还要使用导入模块中成员的问题。
如果说模块中存在以 _ (下划线)开头的成员,则通过from 模块名 import *就无法将该成员导入进来。
模块导入的时候,会执行模块中的顶层代码,而函数中的代码,只有在调用的时候会执行导入模块。
模块分为内置模块、标准库模块、第三方库模块。
__all__ =[“”]通过其指定的,只会限制from 模块名 import *的导入
__doc__ =获取文档注释
__file__ =获取当前文件的绝对路径
__name__ =显示模块的名字,如果是在主模块执行的就会输出_main_,不是在主模块执行的就会输出导入的模块的名字
Python中math数学库的一些运用:
math.ceil(3.001) : 4 ——向上取整
math.floor(3,999) : 3 ——向下取整
math.round(3.5) : 4 ——对于奇数,严格遵循四舍五入
math.round(4.5) : 4 ——对于偶数,以0.5为界限,0.5会被舍弃掉
math.pow(2,4) : 16.0 ——幂函数,返回的是浮点数
math.sqrt(4) : 2.0 ——开二次方根,返回的是浮点数
math.exp(2) : 7.38905609893065 ——这里返回的是自然数e的二次方,用来算自然数e的各种次幂的
math.e : 2.718281828459045 ——输出的是自然数e的值
math.pi : 3.141592653589793 ——输出的是Π (pai) 的值
Python中time时间模块的一些运用
3种表示时间的方式:①时间戳(1970-1-1 0:0:0)直到指定时间的秒数、②时间元组、③格式化时间字符串 2024-4-11 21:07
- 时间戳(1970-1-1 0:0:0)直到指定时间的秒数:
print(time.time())
- 时间元组
time.(localtime())
- 格式化时间字符串
print(time.strftime(%Y/%m/%d %H:%M:%S))
%Y--年、%m--月、%d--日、%H--小时、%M--分钟、%S--秒
asctime()—接受时间元组,返回格式化时间字符串
ctime()—接受时间戳,返回格式化时间字符串
sleep()—程序睡眠(默认单位是秒)
datetime()—经常使用datetime.now()显示现在目前的时间
Python中random随机模块的一些运用
random.randint(1,10) :获取某个范围( [left,right] )内的随机整数
int(random.random()*10) :获取0~1范围内的随机数 [0,1)。(1取不到,这里乘以了10)
创造一个元组is = (1,2,3,4,”zhangsan”)
random.choices(is) :返回的是随机抽取的元素组成的列表
os模块:与操作系统相关的功能
os.system(“ipconfig”) :帮助执行命令的,这里执行的是ipconfig命令
os.curdir :获取相对路径(” . ”是当前这一级,” .. ”是上一级,即一个点是当前这一级,两个点是上一级)
os.getcwd() :获取当前工作目录的绝对路径
os.chdir(“E:\\”) :切换工作路径(一个反斜杠\有转义的意思,所以用两个反斜杠\\)
os.cpu_count() :用于返回系统上的逻辑 CPU 核心数。逻辑 CPU 核心数通常指的是操作系统能够看到的 CPU 核心数,这可能包括物理核心和通过超线程技术创建的虚拟核心。
os.name :获取当前操作系统的名字,nt代表Windows操作系统
os.listdir(“E:\\笔记”) :列出指定目录下的文件
os.getlogin() :当前登录的用户名
os.getpid() :获取当前程序的进程编号
os.kill() :杀死进程的,Linux系统上面可以这样操作,Windows不知道
os.sep :获取分隔符的
os.path是专门针对路径和文件系统的os模块中的子模块
path.abspath(“ . ”) :获取当前文件路径
path.altsep :获取分割符
abc = "F:\\VScode\\模块导入和使用.py"(红色的反斜杠\是要自己添加的,其它的是复制文件路径再黏贴的,因为一个反斜杠\有转义的意思,所以要两个反斜杠\\)
path.basename(abc) :获取的是地址中文件名部分,('模块导入和使用.py')
path.dirname(abc) :返回路径('F:\\VScode')
path.basename(abc)加上path.dirname(abc)组成的就是一个完整的路径
path.exists(abc) :判断文件是否存在
path.isfile() :判断是否是文件
path.isdir() :判断是否是文件夹
path.split(abc) :分割
path.join(参数1,参数2) :用分割符将两个参数进行拼接
sys :主要用来操作python解释器的
sys模块 :提供的关于操作python自身解释器的方法,以及变量
sys.argv :返回的是脚本名称,返回的列表可以是多个值
sys.getdefaultencoding() :获取默认编码——'utf-8’
sys.getrecursionlimit() :获取递归限制
sys.setrecursionlimit() :设置递归限制
sys.getrefcount() :获取引用数量
垃圾回收机制:
问题:代码运行在内存中,函数,进行弹栈释放内存,但是存储在堆里边的,如何释放???
所以就引入下列几种方法释放堆里边的内存
- 引用计数
工作原理:有人用就保留,没人用就删除
缺点:无法解决循环引用的问题,而且对内存也有浪费
arr1 = [1,2,3,4,5]
a = arr1
a = None
arr1 = None
- 标记清除
要导入uuid模块
uuid:生成一个不会重复的标识
缺点:检索效率会相应的降低
因为uuid1会把计算机的地址拼进去,所以一般不用uuid1
uuid.uuid4()
hash相关的模块:
哈希表:1、结果唯一
2、无序
3、单项不可逆
加密算法:分为对称加密和非对称加密两种算法
(1)对称加密:加密和解密用的是一个密钥---Des
(2)非对称加密:加密和解密采用的不是一个密钥---rsa
hashlib:提供很多的哈希算法
hashlib的用处:1、数字校验 2、数据加密
盐值混淆:增加破译难度
hashlib.md5(“123456”.encode()) :计算字符串 "123456"
的 UTF-8 编码的 MD5 哈希值。
简单来说,encode()
的作用就是确保你可以将字符串作为输入传递给期望字节串作为输入的 hashlib.md5()
函数。
对前面知识的回顾:
encode()
方法的作用是将字符串按照指定的编码方式(默认为 UTF-8)转换为字节串。在给出的例子中,"123456".encode()
将字符串 "123456"
转换为 UTF-8 编码的字节串。
hmac :
hmac.new(“789”.encode(),”123456”.encode(),”md5”) :”789”是盐值,”123456”是密钥,”md5”是加密方法,这里会对盐值和密钥都进行一次md5加密
calendar模块:
calendar.weekday(2024,4,21) :返回的是0~6,代表的是周几
i/o流:input output stream
输入输出流:广义上:指代的是计算机中的数据的输入与输出,网络中的通信
狭义上:指代的是内存中的输入与输出
磁盘---内存---cpu
内存:是最重要的缓冲装备
i/o:
数据的流动反向:(站在内存的角度)
输入流:磁盘中的文件读取到内存中
输出流:把内存当中的数据存储到磁盘上
数据的类型:
字节流(01010这种二进制的):图片、音频、视频等媒体文件
字符流:字符串 读取的效率高
操作i/o流是通过函数:open(file,mode)
字符流:
一定要注意:编码和解码保持一致,是至关重要的
r:read(读取)
w:write(写入覆盖,会覆盖掉原来对象里面的数据)
a:append(追加)
b:byte(字节)
t:txt(文本、字符)
open函数的mode那块,t和b可以跟在r、w、a后面,但r、w、a只能有一个
open函数最终返回的是一个文件对象,也通常被称为文件句柄
假设f = open("F:\\VScode\\示例文件夹\\1.txt", mode="r", encoding="utf-8"),只可读取
ff = open("F:\\VScode\\示例文件夹\\1.txt",mode="w",encoding="utf-8"),只可写入
关闭i/o流:f.close()
print(f.closed)---返回True或False,表示的是文件关闭了还是没有关
print(f.name)--- 用于打印这个文件对象的名称,即文件的路径。因此,执行这行
代码后,你会在控制台看到输出 F:\\VScode\\1.txt
。
readable 返回是否可读
writable 返回是否可写入数据
txt = f.read(4) #下次读取的时候会为空,默认情况下会读取所有的数据,传参
表示一次读取多少个数据
print(txt)
print(f.readline()) #按行进行读取
print(f.readlines()) #将每一行作为一个元素,返回一个列表
# f.write()----将括号内的东西写入文件对象f中,会把里面原来的数据覆盖掉
# f.read()----读取文件对象f内的东西
# f.writable()----返回True或False,True是可写入,False是不可写入
# f.readable()----返回True或False,True是可读取,False是不可读取
# f.flush()----刷新状态,就比如写入一些数据后,要刷新才能看见
序列化:将逻辑上存在的对象,转化为字节或字符(字符的本质也是字节),进行
传输或者保存。
例:arr1 = [1,2,3,4]是一个列表,arr1不能直接写入文件对象f中,要转化为字节或字符才行。
反序列化:将字符或者字节,恢复为原来的数据结构形式
持久化:保存在磁盘中
反持久化:
pickle模块
load(反持久化——伴随着反序列化的) loads(反序列化)
dump(持久化——伴随着序列化的) dumps(序列化)
opp:面向对象编程
面向过程:例如c语言有很多函数;将一个大工程分成很多的功能模块
面向对象:
对象是由属性加方法构成的
例如:对象是张三,年龄、爱好是张三的属性,唱歌、跳舞、敲代码是张三的方法
类、对象:一个类可以创建无数个对象,类就相当于一个模板
面向对象编程:
你 userid passwd def: 走 输入
atm def : 校验 取钱 存钱 id
类、对象
统计全校所有学生的信息:姓名、年龄、专业、id
person1 = {
username:"zhangsan",
age:21,
zhuanye:"jike",
id:110
}
person2 = {
username:"lisi",
age:22,
zhuanye:"jike",
id:120
}
类成员:属性
方法:在类里面的函数
姓名、年龄、专业、id
python中创建类的方式:
类名称:采用大驼峰命名法进行区分 UserName
class 类名称(object[father1,,father2]):
def __init__(self,uname,age):
self.uname = uname
self.age = age
def __str__(self):
return "xxx"
#实例化对象
对象名 = 类名(传参)
面向对象的特征: 封装、继承、多态
1、封装
a、类的成员全部封装在类中
b、为了安全考虑,有些属性和方法,不希望被随意访问。因此,大多数情况下,
往往要对对象的属性进行私有化,然后,提供公开的方法进行访问 get_ set_
python进行成员的私有化: _ _属性名 _ _方法名
私有化的成员在class中可以被访问
_方法名、 _变量名 :表示不能被其他模块所引用的 from 模块名 import *
property():
@property
@name.setter
函数重载:存在多个函数名相同的函数,但是参数个数或者参数类型不同,会使得在调用的时候,自动调用对应函数的现象
继承:
父类:被继承的一方 超类、基类
子类: 继承的那一方
子类不能继承父类的私有成员
方法重写:父类中的方法已经不能满足子类的需求,因此,在子类中,
重新定义一个与父类方法名相同的方法,我们把这种情况,叫做方法重写(方法覆盖)
python中的类的继承,是支持继承多个类的
class Son(Father,Mother):
pass
如果Son类中,也存在__init__,那么一定要在代码的第一行手动的调用父类
# super() 是一个指针,指向自己的父类 ,只用在类中