python基础学习6和7
模块类与对象
模块
内置模块 time, random, os, json
第三方模块 requests, pandas, numpy,....
自定义模块 xxx.py
常见的内置模块
hashlib 模块
该模块主要是进行数据加密的作用。
常见的加密方式:sha256()【可逆】 md5()【不
可逆】
import hashlib
info = '123456'
# 创建hashlib中的加密对象
md5_obj = hashlib.md5()
# 设置编码
md5_obj.update(info.encode('UTF-8'))
# 调用函数,开始加密
mi_wen = md5_obj.hexdigest()
print(f"明文:{info},通过md5加密后得到密文:
{mi_wen}") #
e10adc3949ba59abbe56e057f20f883e
一般情况下,在企业中,若想要对一个明文进行MD5
加密的话,一般都不是直接进行加密,而是先对名进
行加盐操作,之后才会进行md5加密。
import hashlib
info = '123456'
# 创建hashlib中的加密对象
md5_obj = hashlib.md5('shujia'.encode('UTF-
8')) # 加盐操作
# 设置编码
md5_obj.update(info.encode('UTF-8'))
# 调用函数,开始加密
mi_wen = md5_obj.hexdigest()
print(f"明文:{info},通过md5加密后得到密文:
{mi_wen}") #
0ead149c250ec554aff85fa083312a83
json模块
本质上是一个特殊格式的字符串,但是相比较于字符
串而言,json是可以通过键获取值的。
判断一个字符串是否符合json的格式:
看字符串是否是由双引号括起来,若不是,那么该
字符串转不了json格式数据
若值是由小括号括起来的多个元素,也是不能够转
json格式数据的
序列化:将代码中的数据转化成网络中传输的数据流
【python中的字典数据 --> json格式的字符串】
import json
dict1 = {
'name': '黄沪生'
,
'age': 18,
'likes': ['踢足球'
,
'钓鱼'
,
'打游戏'],
'pets': [
{'name': '小花'
,
'age': 2},
{'name': '小黑'
,
'age': 3}]
}
s3 = json.dumps(dict1, ensure_ascii=False)
print(s3, type(s3))
反序列化:将网络中传输的数据流还原成代码中的数
据格式 【json格式的字符串 --> python中的字典数
据】
import json
# s2 ='''{"name":"黄沪生","age":18,"likes":["踢足球","钓鱼","打游戏"]}
# '''
# print(s2, type(s2))
# # print(s2['age'])
# res1 = json.loads(s2)
# print(res1, type(res1))
时间相关的模块
time
import time
res1 = time.time() # 得到的是一个时间戳格式的数
据
print(res1, type(time)) # 2024-11-29
10:45:58
时间戳存储时占用的字节相比较于格式化后的字符串
而言,是少很多的。
datetime

时间戳,datetime, 格式化日期字符串互相转换
import time
from datetime import datetime
#
# res1 = time.time() # 得到的是一个时间戳格式的数据
# print(res1, type(time)) # 2024-11-29
# '2024年11月29日 10时51分00秒'
# datetime -> str 日期格式化
s1=datetime.now()
print(s1)
res1 = datetime.strftime(s1,'%Y-%m-%d %H:%M:%S')
print(res1)
print("-------------------------------")
# time.time()
# 时间戳 -> datetime
tp = time.time() # 当前的时间戳
print(tp)
res2 = datetime.fromtimestamp(tp)
print(res2, type(res2))
# datetime -> str
res3 = datetime.strftime(res2,'%Y/%m/%d %H:%M:%S')
print(res3, type(res3))
print("-------------------------------")
# 字符串 -> datetime
s2 = '2024/11/29 11:02:28'
d2 = datetime.strptime(s2,'%Y/%m/%d %H:%M:%S')
print(d2, type(d2))
# datetime-> 时间戳
tp2 = d2.timestamp()
print(int(tp2))
date还有一种方式可以时间获取年月日时分秒, 使用
datetime对象中的属性
tp = 1732849348
dt1 = datetime.fromtimestamp(tp)
print(f"{dt1.year}年{dt1.month}月{dt1.day}
{dt1.hour}时{dt1.minute}分{dt1.second}秒")
OS模块
使用os模块中的功能操作文件或者文件夹
- 判断目标是否存在
import os
# data/user_info
b = os.path.exists('C:\projects\PycharmProjects\\bigdata33\day07\data\\user_info')
print(b) # True
- 路径拼接
import os
s1 = os.path.join('data','user_info')
print(s1,type(s1))
if os.path.exists(s1):
f = open(s1,'r',encoding='UTF-8')
text1 = f.read()
print(text1)
else:
print("目标路径不存在!")
- 获取当前文件所在的路径
ml1 = os.path.abspath(__file__) # __file__ 代表的是当前的文件
print(ml1, type(ml1))
- 获取某一个文件所处的父级目录路径
ml2 = os.path.dirname(ml1)
print(ml2,type(ml2))
- 判断一个路径是否是文件
ml1 = os.path.abspath(__file__) # __file__ 代表的是当前的文件
print(ml1, type(ml1))
ml2 = os.path.dirname(ml1)
print(ml2,type(ml2))
print(os.path.isfile(ml1)) # True
print(os.path.isfile(ml2)) # False
print(os.path.isdir(ml1)) # False
print(os.path.isdir(ml2)) # True
- 判断一个路径是否是文件夹
ml1 = os.path.abspath(__file__) # __file__
代表的是当前的文件
print(ml1, type(ml1))
ml2 = os.path.dirname(ml1)
print(ml2,type(ml2))
print(os.path.isdir(ml1)) # False
print(os.path.isdir(ml2)) # True
- 创建一个文件夹
lj1 = os.path.join('data','aaa')
os.mkdir(lj1)
注意:
若要创建一个文件夹,使用os模块中的mkdir函数
若要创建一个文件,使用open函数以写的方式打
开
ml1 = os.path.abspath(__file__) # __file__
代表的是当前的文件
ml2 = os.path.dirname(ml1)
res1 = os.walk(ml2)
'''
a1: 表示遍历到的文件夹的名称
b1: 表示遍历到的文件夹下所有的文件夹名称组成的列表
c1: 表示遍历到的文件夹下所有的文件名称组成的列表
'''
for a1,b1,c1 in res1:
print(f"a1:{a1}")
print(f"b1:{b1}")
print(f"c1:{c1}")
print("----------------------")
- 删除路径
- 若目标路径是一个文件
lj1 = os.path.join('data','bbb')
os.remove(lj1)
- 若目标文件是个文件夹
lj1 = os.path.join('data','aaa')
os.rmdir(lj1)
os模块练习
练习1:企业中有一个网站,每一天都有新的用户
注册,要求每一天需要使用一个新的文件存储当天
注册的用户信息。
自定义模块
第三方模块
类和对象
面向对象概述
面向过程的编程思想:每一步的实现过程都是我们一步一步
参与实现的,相当于参与者
【代表语言:C语言】
面向对象的编程思想:我们在自己程序中,创建别人写好类
的对象,调用别人写好的功能,相当于指挥者
【代表语言:java,python】
举例现实生活中面向对象的例子:
吃饭:
面向过程的角度:自己买鸡蛋,自己打鸡蛋,自
己煮饭,自己将蛋和饭一起炒,自己装盘
面向对象的角度:点一份蛋炒饭,饭店人员完成
上面的事情
接水:
面向过程的角度:自己拿起水杯,走到饮水机面
前,选择热水还是冷水,接水
面向对象的角度:祈求同桌接水,剩下事情,由
同桌这个对象去完成
如何在python中描述或者使用现实生活中的一个对象呢?
1. 需要我们先创建一个概念性的东西,用于描述某一种所
有对象的共同特点,在python中称之为类 class
2. 我们就可以根据创建好的类,来创建若干个对象
世间万物,皆为对象,同一种对象之间,会有相同的特点,
都可以使用属性和行为对任意一个对象进行描述。
人: class Person:
属性:姓名,年龄,性别... 成员变量:name,age,gender
行为:吃饭,睡觉,学习... 成员方法:eat(),sleep(),study()
创建类和对象
注意:class类中的函数,必须要有一个参数,且是第一个定义,self self: 表示当前调用该方法的对象
创建类:类名首字母要大写
init方法里面的参数就是这个是对象的属性值,在创建类的时候进行定义,创建对象的时候进行赋值,且每一个对象都有这些属性
self.属性或者方法,这是代表时类内部的属性或者方法
class 类名:
def __init__(self,属性1,属性2,...属性n):
self.属性1 = 属性1
self.属性2 = 属性2
. . .
self.属性n = 属性n
def method1(self):
pass
def method2(self):
pass
创建对象:创建的类有多少个属性,则根据这个类创建对象的时候就传入几个参数,一个类可以创建多个对象
对象1 = 类名(属性1,属性2,...属性n)
...
对象n = 类名(属性1,属性2,...属性n)
属性赋值【针对类中没有创建属性的情况】:
# 在外部对对象的属性进行赋值
对象.属性 = 参数
面向对象编程那些改进场景
可以改进多个传参的问题
# 改进前,需要进行多次定义参数列表和传参
def fun1(a1,b1,c1,d1):
pass
def fun2(a1,b1,c1,d1):
pass
def fun3(a1,b1,c1,d1):
pass
fun1(11,22,33,44)
fun2(11,22,33,44)
fun3(11,22,33,44) #改进后,这样每次调用fun就都会有四个属性值,只需要进行一次传参
class Demo:
def __init__(self,a1,b1,c1,d1):
self.a1 = a1
self.b1 = b1
self.c1 = c1
self.d1 = d1
def fun1(self):
pass
def fun2(self):
pass
def fun3(self):
pass
改进某一个事物的封装
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return f"name:{self.name},age:{self.age}" user_list = []
for i in range(1,4):
name = input("请输入你的名字:")
age = input("请输入你的年龄:")
p = Person(name,age)
user_list.append(p) for p in user_list:
print(p.__str__())
for p in user_list:
print(p)
# 最后两个for结果一样
注意:一个类一旦创建了,一定至少有两个方法:
# __init__()
相当于构造函数,对属性进行赋值
# __str__()
这个在打印对象的时候进行调用,前提没有指定调用某个函数,就默认调用__str__()方法
面向对象的三大特征
封装
属性与方法的私有化
私有化的属性与方法除了类就不能在进行调用,只能在类的内部自己调用,可间接性地通过没有私有化的方法去调用私有化的属性与方法
class Person:
def __init__(self,name,age):
self.__name = name
self.__age = age def set_name(self,name):
self.__name = name
def get_name(self):
return self.__name
def __eat(self):
print("人是铁,饭是钢,一顿不吃饿得慌!")
def fun(self):
self.__eat()
def __str__(self):
return f"name:{self.name},age:{self.age}" p = Person('fz',18)
print(p.get_name())
p.fun()
继承
继承是将多个类中的相同的部分,单独提取到一个类 中,这些类于单独提出来的这个类产生一个关系 这个关系,就叫做继承关系,其他类中也就拥有了相 同的部分,不需要特地定义出来。
总结:子类继承父类,父类有的子类一定有,父类没有的子类也可以有
通过继承,子类拥有了父类中的成员(私有成员除外)
class Fu:
def fun1(self):
print("好好学习,天天向上!")
def __fun2(self):
print("这是父类中私有的成员函数__fun2")
class Son(Fu):
pass
s1 = Son()
s1.fun1() # 好好学习,天天向上!
s1.__fun2() # 报错
若子类中出现与父类的函数名以及函数参数都一样, 只是实现不一样的情况,子类对象调用的是自己的函数
注意:这样的函数称之为函数的重写 override
class Fu:
def fun1(self):
print("好好学习,天天向上!")
def __fun2(self):
print("这是父类中私有的成员函数__fun2")
def fun3(self):
self.__fun2()
class Son(Fu):
def fun1(self):
print("这是子类中的函数fun1")
pass s1 = Son()
s1.fun1() # 这是子类中的函数fun1
子类中可以使用super()来调用父类中非私有的成员
class Fu:
def fun1(self):
print("这是父类中的fun1")
class Zi(Fu):
def fun1(self):
print("这是子类中的fun1")
def show(self):
self.fun1() # 调用的是子类中重写后的fun1函数
# 调用父类中的fun1
super().fun1()
z = Zi()
z.show()
若同时继承的类中有相同的函数名,谁先写就调用谁的
class Fu:
def fun1(self):
print("这是父亲中的函数fun1")
def show(self):
print("这是父亲中的函数show")
class Mather:
def fun2(self):
print("这是母亲中的函数fun2")
def show(self):
print("这是母亲中的函数show")
class Son(Mather,Fu):
def function1(self):
print("这是儿子自己的函数")
s1 = Son()
s1.show() # 这是母亲中的函数show
多态
表示的是某一个事物在不同时刻下的不同状态
在python中默认支持多态,因为python是动态数
据类型语言
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"name:{self.name}, age:{self.age}"
def eat(self):
print("吃")
def sleep(self):
print("睡")
class Dog(Animal):
pass
a1 = Animal('小黄',2)
a1 = Dog('小黑',3)
print(a1)
# Animal a = new Dog('小黑',3)
抽象
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"name:{self.name}, age:
{self.age}"
@abstractmethod
def eat(self):
pass
@abstractmethod
def sleep(self):
pass
class Dog(Animal):
@override
def eat(self):
print("吃")
@override
def sleep(self):
print("趴着睡")
# a1 = Animal('小黄',2)
a1 = Dog('小黑',3)
a1.eat()
a1.sleep()
类变量
将变量定义在类中函数外
class Demo1:
# 类变量
a = 100
def fun1(self):
a = 10
print(a)
print(Demo1.a)
d1 = Demo1()
d1.fun1()
# print(Demo1.a) # 通过类名直接访问
print(d1.a) # 也可以通过对象名进行访问
异常
在python程序中出现不正常的情况 python中默认遇到异常的处理方案:抛出错误, 程序停止,后续代码不会执行。
异常的分类
- 语法错误:未运行之前出现的错
- 会在程序编写的过程中,出现了错误【例如 pycharm会在错误的语法下出现红色下划线】
- 异常信息【Exceptions】
- 在程序运行过程中,出现了问题
异常的处理方案
try里面的语句报错,则try里面报错的语句的后面的语句将不再执行
try...except...语句
如果出现错误,才会之心except里面的语句
try:
list = [1,2,3,4,5,6,7]
print(list[10])
except:
print("出现错误啦~") # 出现错误啦~
try...except...else语句
当try 正常执行结束的时候,才会执else里面的语句
try:
list = [1,2,3,4,5,6,7]
print(list[6]) # 7
except:
print("出现错误啦~")
else:
print("这次没有出错哦") # 这次没有出错哦
finally子句
无论如何都会执行finally里面的语句,一般用于释放资源,但是下面这种方式有弊端,如果open前面有语句出错,那么下面的关闭流,则会报错
finally中一般情况下存放释放资源的代码逻辑
try:
f = open("user_info",mode='r',encoding='utf-8')
except:
print("出现错误啦~")
else:
print("这次没有出错哦") # 这次没有出错哦
finally:
f.close()
异常的使用场景
异常可以帮助我们替换一些复杂的判断场景
import random
list = [f"路人{i}" for i in range(1,8)]
jiang_xiang = [
("一等奖", 1, "小米酥妻"),
("二等奖", 1, "华为mate70 pro+"),
("三等奖", 2, "华为mate70 pro+"),
("安慰奖", 3, "苹果一个")
]
def chou_jiang(list):
for i,num,jiang in jiang_xiang:
# print()
input(f"正在抽取{i},按下回车键开始抽奖".center(50,'-'))
person_list = random.sample(list,num)
for person in person_list:
if person in list:
list.remove(person)
info = f"恭喜{'、'.join(person_list)}抽中{i}".center(50,'-')
yield info
try:
res1 = chou_jiang(list)
for i in range(len(jiang_xiang)):
print(res1.__next__())
print(res1.__next__())
except:
print("抽奖结束")
python基础学习6和7的更多相关文章
- Day1 Python基础学习
一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编写程序,本质仍然是直接操作 ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
- Day1 Python基础学习——概述、基本数据类型、流程控制
一.Python基础学习 一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编 ...
- Python 基础学习 总结篇
Python 基础学习总结 先附上所有的章节: Python学习(一)安装.环境配置及IDE推荐 Python学习(二)Python 简介 Python学习(三)流程控制 Python学习(四)数据结 ...
- (一)python基础学习
根据廖雪峰老师的python教程写一些学习总结! Python基础学习 1.使用list和tuple (1)list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时 ...
- python基础学习(起步)
目录 python基础学习(起步) 变量 常量 变量的内存管理 python垃圾回收机制 变量的其他赋值方式 今日编程小题 本人能力有限,若有偏颇之处请读者大大不吝赐教! 祝大家每天都在成长! pyt ...
- Python基础学习二
Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...
- Python基础学习一
Python基础学习一 1.变量与常量 变量名:大小写英文.数字.下划线的组合,数字不能开头 常量名:习惯上常量用大写字母命名,例如"PI" 2.多行输出 转义符:反斜杠(),如果 ...
- Python基础学习五
Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...
- Python基础学习四
Python基础学习四 1.内置函数 help()函数:用于查看内置函数的用途. help(abs) isinstance()函数:用于判断变量类型. isinstance(x,(int,float) ...
随机推荐
- 24暑集训Week1
24暑集训Week1 夜行的人,若你不唱歌的话,不惊醒这黑夜的话,就永远也走不出呼蓝别斯了. 这重重的森林,这崎岖纤细的山路,这孤独疲惫的心. 亲爱的,哪怕后来去到了城市,走夜路时也要大声地唱歌,像喝 ...
- 多进程可以共享内存,那么多进程是否可以共享显存呢?(CPU->内存,GPU->显存)
多进程可以共享内存,那么多进程是否可以共享显存呢?(CPU->内存,GPU->显存) 答案:不能.多进程可以共享内存,但是多进程不能共享显存(NVIDIA GPU 显存不能被多进程共享). ...
- Python 潮流周刊#76:用 50 行 Python 代码实现 BASIC(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- Apache Log4j2远程命令执行漏洞复现
目录 漏洞原理 复现 漏洞修复 Apache Log4j2 是一个基于Java的日志记录工具,被广泛应用于业务系统开发,开发者可以利用该工具将程序的输入输出信息进行日志记录.Log4j2 远程代码执行 ...
- java swing 学习
JSplitPane固定分割比例和禁止拖动分割条 有知友问JSplitPane的问题,在写代码的时候不想让分割条拖动,结果找不到方法,百度了 居然也找不到... 后来在一个犄角旮旯里发现了 ,, 就 ...
- PHP扩展之Yaconf
这个是继鸟哥出品的yaf,yar 之后的又一个好用的工具. Yaconf配置管理工具 具体可以看鸟哥的文档: https://www.laruence.com/2015/06/12/3051.htm ...
- 抓包工具之Charles(mac)
下载地址:https://www.charlesproxy.com/download/ 因为软件是收费的,所以破解方式可以参考:https://www.zzzmode.com/mytools/char ...
- ContosoRetailDW数据库恢复问题
https://www.microsoft.com/en-us/download/details.aspx?id=18279 下载 ContosoBIdemoBAK.exe和ContosoBIdemo ...
- 【报错解决】使用代理后从Github中clone仓库报错
当电脑使用代理后,会造成Github的clone和push等功能无法正常使用 报错内容:Failed to connect to github.com port 443 after ***** ms: ...
- tomcat部署cas6并配置自己的ssl证书
配置并安装tomcat,详见我的文章:windows安装tomcat10 安装必备的软件:(在<windows安装tomcat10>中已详细配置) apache-tomcat-10.1. ...