模块类与对象

  • 模块

    内置模块 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

![image-20241129194721135](D:\soft\Typora\python基础 .assets\image-20241129194721135.png)

时间戳,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的更多相关文章

  1. Day1 Python基础学习

    一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编写程序,本质仍然是直接操作 ...

  2. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

  3. Day1 Python基础学习——概述、基本数据类型、流程控制

    一.Python基础学习 一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编 ...

  4. Python 基础学习 总结篇

    Python 基础学习总结 先附上所有的章节: Python学习(一)安装.环境配置及IDE推荐 Python学习(二)Python 简介 Python学习(三)流程控制 Python学习(四)数据结 ...

  5. (一)python基础学习

    根据廖雪峰老师的python教程写一些学习总结! Python基础学习 1.使用list和tuple (1)list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时 ...

  6. python基础学习(起步)

    目录 python基础学习(起步) 变量 常量 变量的内存管理 python垃圾回收机制 变量的其他赋值方式 今日编程小题 本人能力有限,若有偏颇之处请读者大大不吝赐教! 祝大家每天都在成长! pyt ...

  7. Python基础学习二

    Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...

  8. Python基础学习一

    Python基础学习一 1.变量与常量 变量名:大小写英文.数字.下划线的组合,数字不能开头 常量名:习惯上常量用大写字母命名,例如"PI" 2.多行输出 转义符:反斜杠(),如果 ...

  9. Python基础学习五

    Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...

  10. Python基础学习四

    Python基础学习四 1.内置函数 help()函数:用于查看内置函数的用途. help(abs) isinstance()函数:用于判断变量类型. isinstance(x,(int,float) ...

随机推荐

  1. 24暑集训Week1

    24暑集训Week1 夜行的人,若你不唱歌的话,不惊醒这黑夜的话,就永远也走不出呼蓝别斯了. 这重重的森林,这崎岖纤细的山路,这孤独疲惫的心. 亲爱的,哪怕后来去到了城市,走夜路时也要大声地唱歌,像喝 ...

  2. 多进程可以共享内存,那么多进程是否可以共享显存呢?(CPU->内存,GPU->显存)

    多进程可以共享内存,那么多进程是否可以共享显存呢?(CPU->内存,GPU->显存) 答案:不能.多进程可以共享内存,但是多进程不能共享显存(NVIDIA GPU 显存不能被多进程共享). ...

  3. Python 潮流周刊#76:用 50 行 Python 代码实现 BASIC(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  4. Apache Log4j2远程命令执行漏洞复现

    目录 漏洞原理 复现 漏洞修复 Apache Log4j2 是一个基于Java的日志记录工具,被广泛应用于业务系统开发,开发者可以利用该工具将程序的输入输出信息进行日志记录.Log4j2 远程代码执行 ...

  5. java swing 学习

    JSplitPane固定分割比例和禁止拖动分割条 有知友问JSplitPane的问题,在写代码的时候不想让分割条拖动,结果找不到方法,百度了 居然也找不到... 后来在一个犄角旮旯里发现了 ,,  就 ...

  6. PHP扩展之Yaconf

    这个是继鸟哥出品的yaf,yar 之后的又一个好用的工具.  Yaconf配置管理工具 具体可以看鸟哥的文档: https://www.laruence.com/2015/06/12/3051.htm ...

  7. 抓包工具之Charles(mac)

    下载地址:https://www.charlesproxy.com/download/ 因为软件是收费的,所以破解方式可以参考:https://www.zzzmode.com/mytools/char ...

  8. ContosoRetailDW数据库恢复问题

    https://www.microsoft.com/en-us/download/details.aspx?id=18279 下载 ContosoBIdemoBAK.exe和ContosoBIdemo ...

  9. 【报错解决】使用代理后从Github中clone仓库报错

    当电脑使用代理后,会造成Github的clone和push等功能无法正常使用 报错内容:Failed to connect to github.com port 443 after ***** ms: ...

  10. tomcat部署cas6并配置自己的ssl证书

    ​配置并安装tomcat,详见我的文章:windows安装tomcat10 安装必备的软件:(在<windows安装tomcat10>中已详细配置) apache-tomcat-10.1. ...