• python学习之路day06(模块+面向对象)


    1.pickle 序列化模块
    import pickle
    from collections import Iterator,Iterable
    ##pickle 序列化模块
    """
    序列化:
    把不能直接存储的数据变得可存储
    反序列化:
    把数据恢复成原本的数据格式
    serialize 序列化
    unserialize 反序列化
    """
    #正常情况下不能够直接把容器类型数据直接存储到文件当中
    """
    with open("ceshi.txt",mode='w',encoding='utf-8') as fp:
    lst=[1,2,3,4]
    fp.write(lst)
    """
    #dumps 把任意对象序列化成一个bytes
    lst=[1,2,3,4]
    res=pickle.dumps(lst)
    print(res)

    #lasds 把任意bytes反序列化成原来的数据
    res=pickle.loads(res)
    print(res)

    def func():
    print("我是一个函数")
    #序列化函数
    res=pickle.dumps(func)
    print(res)
    #反序列化函数
    func=pickle.loads(res)
    func()

    #序列化迭代器
    it=iter(range(10))
    print(isinstance(it,Iterator))
    res=pickle.dumps(it)
    print(res)
    res=pickle.loads(res)
    print(res)

    #dumps 和loads 把数据存储在文件
    lst=[1,2,3,4]
    with open("ceshi.txt",mode='rb+') as fp:
    res=pickle.dumps(lst)
    fp.write(res)
    #读取内容的时候,先把光标移到文件行首
    fp.seek(0)
    res2=fp.read()
    print(res2)
    lst=pickle.loads(res)
    print(lst,type(lst))

    #jump 把对象序列化后写入到file-like object(即文件对象)
    def func2():
    print("我是func2")
    with open("ceshi02.txt",mode="wb") as fp:
    #参数1:要序列化的数据,参数2:对应的文件对象
    pickle.dump(func2,fp)

    #load 把file-like object(即文件对象)中的内容拿出来反序列化成原来的数据
    with open("ceshi02.txt",mode="rb") as fp:
    func=pickle.load(fp)
    func()

    #pickle 模块可以序列化所有的数据类型

    2.json
    import json,pickle
    ####json
    """
    json 可以序列化数据,可以转换成一个字符串
    json 格式的数据,可以让所有的编程语言都能够识别
    有数据类型的现在:bool float int list tuple dict str None
    """
    #第一组:dumps和loads 用来序列化或反序列化字符串
    """
    ensure_ascii=True 是否显示中文,设置ensure_ascii=False 显示中文
    sort_keys=False 对字典的键进行ASCII排序
    """
    dic={"name":"lizuqing","age":"58","sex":"man","family":["爸爸","妈妈","姐姐","妹妹"]}
    res=json.dumps(dic,ensure_ascii=False)
    print(res,type(res))

    dic=json.loads(res)
    print(dic,type(dic))

    #第二组:dump和load 用来对数据进行存储
    dic={"name":"lizuqing","age":"58","sex":"man","family":["爸爸","妈妈","姐姐","妹妹"]}
    with open("ceshi03.txt",mode="w",encoding="utf-8") as fp:
    json.dump(dic,fp,ensure_ascii=False) #{"name": "lizuqing", "age": "58", "sex": "man", "family": ["爸爸", "妈妈", "姐姐", "妹妹"]}

    with open("ceshi03.txt",mode="r",encoding="utf-8") as fp:
    dic=json.load(fp)
    print(dic,type(dic))

    #json 和pickle 两个模块的区别
    #json 的用法特征
    """
    json 可以连续dump,但是不能连续load
    load只可以load一次,它是一次性把所有数据作为一个整体来进行转化
    """

    dic1={"a":1,"b":2}
    dic2={"c":3,"d":4}
    with open("ceshi04.txt",mode="w",encoding="utf-8") as fp:
    json.dump(dic1,fp)
    fp.write(" ")
    json.dump(dic2,fp)
    fp.write(" ")
    #error 只能load一次,是一次性把所有数据转化
    """
    with open("ceshi04.txt",mode="r",encoding="utf-8") as fp:
    res=json.load(fp)
    print(res)
    """
    #解决方式
    with open("ceshi04.txt",mode="r",encoding="utf-8") as fp:
    for line in fp:
    # res1=fp.readline()
    res=json.loads(line)
    print(res)
    #pickle 的用法特征
    """
    pickle 可以连续dump,也可以连续load
    """
    dic1={"a":1,"b":2}
    dic2={"c":3,"d":4}
    with open("ceshi05.txt",mode="wb") as fp:
    pickle.dump(dic1,fp)
    pickle.dump(dic2,fp)

    with open("ceshi05.txt",mode="rb") as fp:
    dic1=pickle.load(fp)
    dic2=pickle.load(fp)
    print(dic1)
    print(dic2)

    with open("ceshi05.txt",mode="rb") as fp:
    try:
    while True:
    dic=pickle.load(fp)
    print(dic) #异常错误处理
    except:
    pass
    print(333)

    """
    try ....except....
    把有问题的代码直接卸载try这个代码块中,
    如果出现异常,直接走except 这个代码块,防止报错终止程序
    try:
    print("wangwendashuaiguo")
    except:
    pass
    print(333)
    """
    # 总结:
    """

    # json 和 pickle 两个模块的区别:
    (1)json序列化之后的数据类型是str,所有编程语言都识别,
    但是仅限于(int float bool)(str list tuple dict None)
    json不能连续load,只能一次性拿出所有数据
    (2)pickle序列化之后的数据类型是bytes,
    所有数据类型都可转化,但仅限于python之间的存储传输.
    pickle可以连续load,多套数据放到同一个文件中

    """

    3.random
    import random
    #random()获取随机0-1之间的小数(左闭右开) 0<=x<1
    res=random.random()
    print(res)

    #randrange()随机获取指定范围内的整数(包含开始值,不包含结束值,间隔值)
    # 0  1   2 不包含3
    res=random.randrange(3)
    print(res)
    #1-4
    res=random.randrange(1,5)
    print(res)
    #1  4  7
    res=random.randrange(1,10,3)
    print(res)

    #randint()  随机获取指定范围内的整数(必须两个参数,了解)
    res=random.randint(1,4)
    print(res)
    #randint 无论给1个还说3个都说错误的,只能给2个
    #res=random.randint(1,10,3)

    #unifrom()  获取指定范围内的随机小数(左闭右开) 1<=x<3
    res=random.unifrom(1,3)
    print(res)
    res=random.unifrom(2,-1)   #-1<x<=2
    print(res)

    #return a+(b-a)*self.random()
    """
    2+(-1-2)*0=2
    2+(-1-2)*1=-1
    """

    #choice  随机获取序列中的值(多选一0
    lst=["苏泽惠","郭艺梦你","银燕","李倩"]
    res=random.choice(lst)
    print(res)
    def mychioce():
     length=len(lst)
     res=random.randrange(0,length)
     return lst[res]
    print(mychioce())

    #sample() 随机获取序列中的值(多选多)[返回列表]
    lst=["苏泽惠","郭艺梦你","银燕","李倩"]
    res=random.sample(lst,2)
    print(res)

    #shuffle() 随机打乱 序列中的值(直接打乱原序列)
    lst=["苏泽惠","郭艺梦你","银燕","李倩"]
    random.shuffle(lst)
    print(lst)

    #随机验证码  4
    def yanzhengma():
    strvar=""
     
     print(ord("a"))  #97
     print(chr(97))  #a

     for i in range(4):
      #a~z 97 ~ 122   获取小写字母
      res1=chr(random.randrange(97,123))
      #A~Z  65 ~ 90   获取大写字母
      res2=chr(random.randrange(65,91))
      #1 ~9  获取0-9 是个数字
      res3=random.randrange(1,10)
      #吧可能的字符放到列表中
      lst=[lst1,lst2,lst3]
      #拼接字符串
      strvar+=str(random.chioce(lst))
     return strvar
     
    res=yanzhengma()
    print(res) 
     

    5.os 模块 对系统进行操作
    import os
    # system 在python中执行命令
    os.system("mspaint")
    os.system("ipconfig")

    #popen()  执行系统命令返回对象,通过read方法读出字符串,不会乱码
    obj=os.popen("ipconfig")
    print(obj.read())
    #listdir()  获取指定文件夹中所有内容的名称列表
    """
    . 代表的是当前路径
    .. 代表的是上一级路径
    """
    res=os.listdir(".")
    print(res)

    #getcwd()  获取当前文件所在的默认路径
    res=os.getcwd()
    print(res)   #获取当前路径
    print(__file__)   #获取当前文件名完整路径

     os.mkdir("ceshi100")   #创建目录(文件)
     os.rmdir("ceshi100")    #删除目录(文件)
     os.rename("ceshi100","ceshi200")   #对文件目录重命名(文件)

    #copy(src,dst)   复制文件权限和内容
    import shutil
    shutil.copy("2.py","chishi333")

    #chdir()  修改当前文件工作的默认路径
    os.chdir(r"V:homeworkL004day05")
    os.mkdir("ceshi200")

    #environ  获取或修改环境变量  (了解)
    print(os.environ)

    #name 获取系统标识  linux,mac --> posix    windows -->  nt
    print(os.name)   #nt

    6.os.path
    import os
    #os Windows中的换行
    print(repr(os.linesep))
    #abspath 将相对路径转为绝对路径
    res=os.path.abspath(".")
    print(res)
    #basename 返回文件名 5颗星
    pathvar=r"E:PycharmProjectsweekday_04day06os_module.py"
    res=os.path.basename(pathvar)
    print(res)
    #dirname 返回路径部分 5颗星
    pathvar=r"E:PycharmProjectsweekday_04day06os_module.py"
    res=os.path.dirname(pathvar)
    print(pathvar)

    print(os.getcwd()) #获取当前路径 5颗星
    print(__file__) #获取完整文件路径 5颗星

    #split() 将路径拆分成单独的文件部分和路径部分 组合成一个元组
    pathvar=r"E:PycharmProjectsweekday_04day06os_module.py"
    res=os.path.split(pathvar)
    print(res)

    #join() 将多个路径和文件组成新的路径 可以自动通过不同的系统加不同的斜杠 linux / windows 5颗星
    """
    linux: /home/wangwen/a.py
    windows: E:PycharmProjectsweekday_04day06

    #绝对路径
    以 / 开头的是绝对路径 Linux
    以盘符开头的完整路径是绝对路径 windows

    #相对路径
    . 当前路径
    .. 上一级路径
    """
    path1="wenkday_04"
    path2="day06"
    path3="os_module.py"
    res=os.path.join(path1,path2,path3) #推荐
    print(res)
    res=path1+path2+path3
    print(res)

    #splittext() 将路径分隔为后缀和其他部分
    pathvar=r"E:PycharmProjectsweekday_04day06os_module.py"
    res=os.path.splitext(pathvar)
    print(res)

    #getsize() 获取文件的大小 5颗星
    pathvar=r"E:PycharmProjectsweekday_04day06os_module.py"
    res=os.path.getsize(pathvar)
    print(res)

    #isdir() 检测路径是否是一个文件夹 5颗星
    pathvar=r"E:PycharmProjectsweekday_04day06"
    print(os.path.isdir(pathvar))

    #isfile() 检测路径是否是一个文件 5颗星
    pathvar=r"E:PycharmProjectsweekday_04day06os_module.py"
    print(os.path.isfile(pathvar))
    print("--------------------")
    #getmtime() 获取文件最后一次修改时间(返回时间戳)
    pathvar=r"E:PycharmProjectsweekday_04day06pickle_module.py"
    res=os.path.getmtime(pathvar)
    print(res)
    import time
    str_time=time.ctime(res)
    print(str_time)
    #getatime() 获取文件最后一次访问时间(返回时间戳)
    pathvar=r"E:PycharmProjectsweekday_04day06pickle_module.py"
    res=os.path.getatime(pathvar)
    print(res)
    str_time=time.ctime(res)
    print(str_time)

    #exists() 检测指定的路径是否存在 5颗星
    pathvar=r"E:PycharmProjectsweekday_04day06pickle_module.py"
    res=os.path.exists(pathvar)
    print(res)
    #isabs() 检测一个路径是否是绝对路径 abspath 5颗星
    """
    别人传变量给你先判断是不是绝对路径,如果不是用abspath转换
    """
    pathvar=r"E:PycharmProjectsweekday_04day06pickle_module.py"
    res=os.path.isabs(pathvar)
    print(res)

    strvar="."
    res=os.path.isabs(strvar)
    print(res)
    7.计算文件夹所有的大小
    import os
    path1=os.getcwd()
    # print(res1)
    pathvar=os.path.join(path1,"ceshi300")
    #E:PycharmProjectsweekday_04day06ceshi300
    print(pathvar)

    #part1 基本操作
    lst=os.listdir(pathvar)
    print(lst)
    #初始化变量 size=0
    size=0
    for i in lst:
    # print(i)
    #拼接成完整的绝对路径
    pathnew=os.path.join(pathvar,i)
    # print(pathnew)
    # res=os.path.getsize(pathnew)
    # print(res)
    #判定它是不是文件,计算大小,getsize只能算文件的大小
    if os.path.isfile(pathnew):
    print(i, "是一个[文件]")
    size+=os.path.getsize(pathnew)
    # 判定它是不是文件夹
    elif os.path.isdir(pathnew):
    print(i,"是一个[文件夹]")
    print(size) #1957+2620=4577

    #part2 递归方法计算文件夹里面所有内容大小
    def getallsize(pathvar):
    size=0
    lst = os.listdir(pathvar)
    for i in lst:
    pathnew=os.path.join(pathvar,i)
    if os.path.isfile(pathnew):
    #统计文件大小
    size += os.path.getsize(pathnew) #4577
    elif os.path.isdir(pathnew):
    size+=getallsize(pathnew) #7578
    # pass

    return size
    res=getallsize(pathvar)
    print(res)
    8.zipfile 压缩模块
    import zipfile
    #part1 压缩文件
    #创建压缩包
    zf=zipfile.ZipFile("ceshi01.zip","w",zipfile.ZIP_DEFLATED)
    #写入文件
    #wrte(路径,别名)
    # zf.write("1.py")
    # zf.write("2.py")
    zf.write(r"E:PycharmProjectsweekday_04day061.py","1111.py")
    zf.write(r"E:PycharmProjectsweekday_04day062.py","2222.py")
    #可以在写入文件的同时,创建一个文件夹
    zf.write(r"E:PycharmProjectsweekday_04day063.py","temp/3333.py")
    #关闭文件
    print(zf)
    zf.close()
    #part2 解压文件

    zf=zipfile.ZipFile("ceshi01.zip","r")
    """
    extratall 解压所有
    extrat 解压单个文件
    """
    #解压所有文件到某个路径下,./代表当前路径下的某个文件夹sdf
    zf.extractall("./ceshi01")
    #extrat 解压单个文件
    zf.extract("1111.py","./ceshi002")
    zf.close()

    #part3 追加文件 with语法自动关闭zip压缩包操作
    with zipfile.ZipFile("ceshi01.zip","a",zipfile.ZIP_DEFLATED) as zf:
    zf.write("ceshi05.txt")

    #part4 查看压缩包内容
    with zipfile.ZipFile("ceshi01.zip","r",zipfile.ZIP_DEFLATED) as zf:
    lst=zf.namelist()
    print(lst)

    9.面向对象
    """
    用几大特征表达一类事物称为一个类,类更像是一张图纸,表达的是一个抽象概念
    对象是类的具体实现,更像是由这图纸产出的具体物品,类只有一个,但对象可以有多个
    """
    #(1)类的定义
    class MyClass:
    pass
    #推荐写法
    class MyClass():
    pass
    class MyClass(object):
    pass
    #(2)类的实例化
    class car():
    color="蓝色"
    #类的实例化,产生的是对象
    obj=car()
    print(obj)
    #(3)类的基本结构
    """
    类中只有两样东西:
    (1)成员属性
    (2)成员方法
    """
    class MyCar():
    #成员属性
    color="红色"
    #成员方法
    def func(self):
    pass

    #例外不标准写法,不推荐使用
    """
    类中的逻辑在定义类的时候,直接执行,这个写法语法上不报错,
    但是严禁 禁止使用
    """
    class MyCar():
    if 5==5:
    print(123)
    #(4)类的命名
    """
    推荐使用驼峰命名方法:
    每个单词首字母大写:
    myclass => MyClass
    mycar => MyCar
    """

    10.封装
    #封装:对类中成员属性和方法的保护,控制外界对内部成员的访问,修改,删除等操作
    class MyCar():
    #公有成员属性
    pinpai="布加迪威航"
    #私有成员属性
    __oil="2.5L"
    def run(self):
    #self.pinpai <======> obj.pinpai
    print("我的小车会跑",self.pinpai)
    #私有方法
    def __oil_info(self):
    print("油耗信息是保密的")

    """
    绑定方法:
    (1)绑定到对象:系统会默认吧对象当成参数进行传递,让self形参进行接收。(对象.方法)
    (2)绑定到类:系统会默认把类当成参数进行传递,让形参进行接收(对象.方法,类.方法 通过装饰器修饰)
    """
    #实例化对象 或者类的实例化,都可以,都是产生对象的意思
    obj=MyCar()
    #(1)实例化的对象访问公有成员属性和方法
    print(obj.pinpai)
    #obj.run(),系统自动把obj这个对象当成参数传递给run()方法中self这个参数进行接收
    obj.run()
    # obj.__oil() 不允许调用
    #(1)实例化的对象添加公有成员属性和方法
    # __dict__ 可以获取对象或者类的内部成员
    print(obj.__dict__) #d打印obj的成员
    obj.color="黄色"
    print(obj.color)
    print(obj.__dict__)

    #动态添加成员方法
    # (1)添加无参方法
    def fang_xiang_pan():
    print("我说是制造方向盘的方法!")

    #让类外的函数赋值给obj对象的成员方法 fang_xiang_pan
    obj.fang_xiang_pan=fang_xiang_pan
    obj.fang_xiang_pan()
    print(obj.__dict__)

    # (2)添加有参方法
    def func(self,something):
    print(self.pinpai,something)

    #将右侧的值赋值给左侧的成员属性func
    obj.func=func
    #需要手动把对象传进去,不如使用绑定方法
    obj.func(obj,"有参方法")

    #使用绑定方法自动把obj当成参数传递 依靠 MethodType
    #将创建的绑定方法,赋值给成员属性func2,意味着下次调用不需要手动传递该对象,系统会自动帮你传递;
    import types
    #MethodType(函数,要绑定的对象上)
    obj.func2=types.MethodType(func,obj)
    obj.func2("有参方法")

    # (3)添加lambda 表达式
    obj.dahuangfneg=lambda :print("请叫我大黄蜂")
    obj.dahuangfneg()
    obj.qingtianzhu=lambda n :print(n)
    obj.qingtianzhu("擎天柱")

    #继承:一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法
    #多态:不同的子类对象,调用相同的父类方法,产生不同的执行结果

    11.类的相关操作
    class Plane():
    #公有成员属性
    captain="lizhuqing"
    # 私有成员属性
    __air_sister=20
    #普通公有方法
    def fly():
    print("灰机会飞!",Plane.__air_sister) #灰机会飞! 20
    # 普通私有方法
    def __fly2():
    print("空姐数量是保密的!")
    obj=Plane()
    #对象无法调用无参的普通方法,必须要加self
    # obj.fly() error

    #(1)定义的类访问公有成员属性和方法
    print(Plane.captain)
    #无论是对象还是类,都无法在类外调用类中的私有成员
    # print(Plane.__air_sister) error
    Plane.fly()
    #查看类Plane的所有成员
    print(Plane.__dict__)
    #(2)定义的类添加公有成员属性和方法
    Plane.engine="烧汽油的"
    print(Plane.__dict__) #多了obj方法
    print(obj.__dict__) #为空

    #添加方法
    #(1)无参方法
    def bianxing():
    print("我的飞机变成小鸟")
    Plane.bianxing=bianxing
    Plane.bianxing()

    #(2)有参方法
    def setname(name):
    print("我的飞机名字:",name)
    Plane.setname=setname
    Plane.setname("大黄蜂")
    Plane.setname("擎天柱")

    #(3)lambda表达式
    Plane.lunzi=lambda :print("我是制造飞机轮胎的方法")

    """
    (很重要)
    调用类中成员的时候,要么使用对象,要么使用类调用,不能直接写
    对象可以使用类中的相关公有成员,但是没有归属权,
    类中的成员都归当前这个类所有,但是不能使用对象中的相关成员

    对象中如果有这个成员,用对象自己的
    如果没有,用类中的成员.
    """

    #(3)定义的类删除公有成员属性和方法
     12.#类的删除
    class MyCar():
    price="100元"
    __oil="百公里1升"
    #普通方法
    def bianxing_cat1():
    print("车会变形猫",MyCar.price)
    #绑定到对象方法
    def bianxing_cat2(self):
    print("车会变形猫",self.price)
    #普通私有方法
    def __oil_info1():
    print("油耗信息保密1。")

    # 私有绑定方法
    def __oil_info2(self):
    print("油耗信息保密2。")
    #定义公有绑定方法
    def pub_func(self):
    print(self.__oil)
    self.__oil_info2()
    #定义公有普通方法
    def pub_func2():
    print(MyCar.__oil)
    MyCar.__oil_info1()
    #实例化对象
    obj=MyCar()
    print(obj.__dict__)
    print(MyCar.__dict__)

    #(1) 实例化的对象删除公有成员属性和方法
    obj.price="2元" #动态为该对象付成员属性,price
    print(obj.price)
    del obj.price
    print(obj.price)
    #func这个成员是一个静态方法,无论是类还是对象,都能当成普通方法调用
    """在类外动态添加成员方法,返回 的是静态方法。"""
    obj.func=lambda n : print("我是func函数!",n)
    obj.func(123)
    # del obj.func 删除方法
    # obj.func(123) 删除之后无法调用

    #(2) 定义的类删除公有成员属性和方法
    # del MyCar.price 删除后无法调用
    print(MyCar.price) #对象无法调用
    # print(obj.price) #类无法调用

    del MyCar.bianxing_cat1
    # MyCar.bianxing_cat1() 删除后无法调用

    #(3) 可否在内外调用私有属性 不可以
    """
    改名策略:
    _类名+私有成员名:比如
    __oil==>_MyCar__oil
    __oil_info1==>_MyCar__oil_info1
    """
    #对象的调用
    print(obj._MyCar__oil)
    obj._MyCar__oil_info2()
    #类的调用
    print(MyCar._MyCar__oil)
    MyCar._MyCar__oil_info1()
    #(4)通过公有方法调用私有成员
    obj.pub_func()
    MyCar.pub_func2()
    13.构造方法  __init__
    #__init__ 魔术方法(构造方法)
    """
    触发时机:实例化对象,初始化的时候触发
    功能:为对象添加成员
    参数:参数不固定,至少一个self参数
    返回值:无
    """

    #(1) 基本语法
    class MyClass():
    def __init__(self):
    self.name="anyixuan"
    # 实例化对象
    obj=MyClass()
    print(obj.name)

    #(2) 多个参数的 __init__
    class MyClass():
    def __init__(self,name):
    #self.name(成员属性name) = name(参数name)
    self.name=name

    #实例化对象的同时,在括号中加上对应的参数,self是系统自己传递的,name需要手动传递, “hegeg”会被name形参接收走
    obj=MyClass("hugege")
    print(obj.name)

    #(3) 综合实力:类可以有一个,对象可以有多个 不同对象直接彼此数据隔离
    class Children():
    def __init__(self,name,skin):
    self.name=name
    self.skin=skin
    def cry(self):
    print("小孩一生下就哭")

    def eat(self):
    print("小孩饿了就喝奶奶")

    def sleep(self):
    print("小孩一天23小时睡觉,还有一小时上厕所")

    def child_info(self):
    print("该对象姓名:{},肤色是:{}!".format(self.name,self.skin))

    #实例化对象1
    child1=Children("王铁成","黑色")
    child1.cry()
    child1.child_info()

    #实例化对象2
    child2=Children("廖雪峰","黄色")
    child2.eat()
    child2.child_info()

    #实例化对象3
    child3=Children("王宝强","绿色")
    child3.sleep()
    child3.child_info()




  • 相关阅读:
    机器不学习:如何处理数据中的「类别不平衡」?
    机器不学习:一种提升预测能力的方法-机器学习模型
    机器不学习:CNN 入门讲解1-什么是卷积
    机器不学习:浅析深度学习在实体识别和关系抽取中的应用
    机器不学习:用神经模块网络学习推理
    机器不学习:初识迁移学习
    机器不学习:一文彻底读懂智能对话系统
    跟随鼠标的div
    回到顶部的流畅滚动——scrollTop
    js学习小笔记
  • 原文地址:https://www.cnblogs.com/vivian0119/p/11273827.html
Copyright © 2020-2023  润新知