zoukankan      html  css  js  c++  java
  • Python学习笔记:模块学习

    一、定义:

      1、模块:用来从逻辑上组织python代码(包含:变量,函数,类等),本质是实现一个功能的.py结尾的python文件。

      2、包:用来从逻辑上组织模块的,本质就是一个目录。(必须带有一个__init__.py文件)

    二、导入方法

      1、导入一个模块,“import 文件名(不需要后缀)”,可以使用“文件名.函数名()”的方式调用。

      2、导入多个模块,“from 文件夹名(或文件名) import  文件名(或函数名、变量名等) ”,但不建议这样用,因为有重名的方法,后面的会覆盖前面的,造成调用混乱。

      3、为了区分导入的模块,使用as关键词,比如:“from 文件夹名 import 文件名 as 调用名”。

    三、导入的本质:将要导入的代码全部解释一遍,统一赋值给一个变量

      1、"import 模块名"的本质:将一个文件中的代码赋值给一个模块名,调用的时候用“模块名.变量(或函数)”方式调用。

      2、“from 文件夹名(或文件名) import  模块名(或函数名、变量名等)”:将文件中的代码块单独赋值给一个模块名。如果是导入函数或者变量,可以直接在代码中使用。

      3、导入包的本质:就是解释这个包下面的__init__.py文件

    四、路劲查找

      1、导入文件会在系统路径下寻找,系统路劲登记在os.path下面,如下:

    import sys
    print(sys.path)

      2、如果任意路径的文件模块需要的导入,应该怎么做?

    import sys,os
    
    # 查找目标文件所在的目录
    base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    # 将目标文件模块的目录加入到系统路劲下
    sys.path.append(base_dir)

    五、导入优化

      1、如下代码重复查找函数,可以做优化

    import moudle_test
    
    # 以下两个方法都调用了同个模块下的同个方法,这样重复查找方法造成了效率低
    def a ():
        moudle_test.test()
        print("is  a()")
    
    def b ():
        moudle_test.test()
        print("is  b()")
    
    ## 可以修改成如下方法
    
    from  moudle_test import test
    
    def a ():
        moudle_test.test()
        print("is  a()")
    
    def b ():
        moudle_test.test()
        print("is  b()")

    六、模块的分类

      1、标准库(内置模块):如os,time,datetime

      2、开源模块:第三方写的开源的,可以免费使用,

      3、自定义模块:自己写的模块

    七、标准库

      1、random:该模块实现了各种分布的伪随机数生成器。

    # 随机整数:
    print random.randint(1,50)
    
    # 随机选取0到100间的偶数:
    print random.randrange(0, 101, 2)
    
    # 随机浮点数:
    print random.random()
    print random.uniform(1, 10)
    
    # 随机字符:
    print random.choice('abcdefghijklmnopqrstuvwxyz!@#$%^&*()')
    
    # 多个字符中生成指定数量的随机字符:
    print random.sample('zyxwvutsrqponmlkjihgfedcba',5)
    
    # 从a-zA-Z0-9生成指定数量的随机字符:
    ran_str = ''.join(random.sample(string.ascii_letters + string.digits, 8))
    print ran_str
    
    # 多个字符中选取指定数量的字符组成新字符串:
    print ''.join(random.sample(['z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'], 5))
    
    # 随机选取字符串:
    print random.choice(['剪刀', '石头', ''])
    
    # 打乱排序
    items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
    print random.shuffle(items)

       2、os标准库:本模块提供了一种使用与操作系统相关的功能的便捷式途径

    import os
    
    # 返回环境变量
    print("输出操作系统分割文件路劲的字符串",os.environ)
    
    # 返回当前操作系统别名,nt代表windows,posix代表linux
    print("输出操作系统分割文件路劲的字符串",os.name)
    
    # 当前工作目录
    print("当前工作目录",os.getcwd())
    
    # 当前执行的py文件
    print("当前执行的py文件路径",__file__)
    
    # 改变当前工作目录到指定的路径。
    print("当前工作目录到指定的路径",os.chdir(r"c:/"))
    
    # 返回当前目录,返回的是当前执行python文件的文件夹,“.”代表当前目录
    print("当前目录",os.curdir)
    
    # 返回当前目录的父目录
    print("返回当前目录的父目录",os.pardir)
    
    # 递归依次创建目录
    # print("递归依次创建目录c:/a/b/c",os.makedirs("c:/a/b/c"))
    
    # 删除目录,只能从最下级目录开始删除
    # print("删除目录,只能从最下级目录开始删除",os.rmdir("c:/a/b/c"))
    
    # 删除目录,递归逐级删除
    # print("删除目录,递归逐级删除",os.removedirs("c:/a/b"))
    
    # 列出目录列表
    print("列出目录列表",os.listdir(os.curdir))
    
    # 修改目录或文件名
    # print("修改目录或文件名",os.rename("c:/a/a.txt","c:/a/ab.txt"))
    
    # 删除一个文件
    # print("删除一个文件",os.remove("c:/b/a.txt"))
    
    # 返回目录或文件的信息
    print("返回文件目录的信息",os.stat("c:/a/ab.txt"))
    
    # 输出操作系统的路径分割符,Windows为"\",Linux为"/"
    print("输出操作系统的路径分割符",os.sep)
    
    # 输出操作系统的换行符,Windows为"
    ",Linux为"
    "
    print("输出操作系统的换行符",str(os.linesep))
    
    # 输出操作系统分割文件路劲的字符串,为";"
    print("输出操作系统分割文件路劲的字符串",os.pathsep)
    
    # 调用cmd命令行
    # print("调用cmd命令行",os.system("ipconfig"))
    
    # 返回规范的绝对路劲,用""做为路劲分隔符
    print("返回规范的绝对路劲", os.path.abspath(__file__))
    
    # 分割路径,将文件分成目录和文件的组成的元组,目录可以不存在
    print("分割路径,将文件分成目录和文件的组成的元组", os.path.split(__file__))
    
    # 返回文件所在目录,即父目录,目录可以不存在
    print("返回文件所在目录,即父目录", os.path.dirname(__file__))
    
    # 返回文件名,目录可以不存在
    print("返回文件所在目录,即父目录", os.path.basename(__file__))
    
    # 判断路劲是否存在
    print("判断路劲是否存在", os.path.exists(__file__))
    
    # 判断路劲是否为绝对路劲,windwos以盘符开头,linux以“/”开头
    print("判断路劲是否为绝对路劲", os.path.isabs(__file__))
    
    # 判断路劲是否为文件
    print("判断路劲是否为文件", os.path.isfile(__file__))
    
    # 判断路劲是否为目录
    print("判断路劲是否为目录", os.path.isdir(__file__))
    
    # 拼接多个路径返回,第一个绝对路劲之前的参数会被忽略
    print("拼接多个路径", os.path.join("c","a","b","a.txt"))
    
    # 文件最后访问时间
    print("文件最后访问时间", os.path.getatime(__file__))
    
    # 文件最后修改时间
    print("文件最后修改时间", os.path.getmtime(__file__))

       3、sys标准库:系统相关的参数和函数

    # 获得文件输入参数,控制台输入“python python文件名 参数(参数之间用空格间隔)”
    print(sys.argv)
    
    # 返回操作系统平台名称
    print(sys.platform)
    
    # 返回python文件搜索路劲
    print(sys.path)
    
    # 打印并且计数
    print(sys.stdout.write("Hello World"))

      4、shutil标准库:模块提供了一系列对文件和文件集合的高阶操作

    import shutil
    
    # 先打开文件,后复制文件
    f1 = open("test1", encoding="utf-8")
    f2 = open("test2", mode="w", encoding="utf-8")
    shutil.copyfileobj(f1, f2)
    
    # 直接复制
    shutil.copyfile("test1","test3")
    
    # 同时copy文件和文件状态
    shutil.copy("test1","test3")
    
    # 递归复制目录和文件
    shutil.copytree("test","test_new")
    
    # 递归删除目录和文件
    shutil.rmtree("test_new")
    
    # # 移动文件
    shutil.move("f1","f2")
    
    # # 压缩
    shutil.make_archive("最终得到的压缩文件名","压缩格式如zip等","压缩路径")

       5、hashlib库:用于哈希加密

    import hashlib
    
    md5_test = hashlib.md5()
    md5_test.update(b"Hello")
    # 打印Hello的md5的值
    print(md5_test.hexdigest())
    
    md5_test.update(b"world")
    # 打印Helloworld的md5的值,注意这里是update操作,所以是两段加一起
    print(md5_test.hexdigest())
    
    
    md5_test2 = hashlib.md5()
    md5_test2.update(b"Helloworld")
    # 下面一个新对象打印的值也跟上面一样,证明了是两段加一起
    print(md5_test2.hexdigest())
    
    # 更安全的sha256加密
    sha256_test = hashlib.sha256()
    sha256_test.update(b"Hello")
    # 打印sha256的值
    print(sha256_test.hexdigest())
    
    # 中文处理
    sha256_test2 = hashlib.sha256()
    sha256_test2.update("你好中国".encode(encoding="utf-8"))
    # 打印sha256的值
    print(sha256_test.hexdigest())

      6、re模块:提供正则表达式的操作

      • " . ",指代任意一个字符,除了换行之外(如果有加 flags="r.S" 就可以匹配换行)。
      • " ^ " 和 " A ",匹配原文本的开头,意思是从开头开始匹配
      • “ $ ” 和 "  ",匹配原文本的末尾,意思是从某处开始一直匹配的原文本的末尾
      • “  *  ”,匹配*号前面的字符0次或者多次,比如re.findall("ab*","cabb3abcbbac"),结果["abb","ab","a"]
      • “ + ”,匹配+号前面的字符1次或者多次,比如"re.findall("ab+","ab+cd+abb+bba")“,结果["abb","ab"]
      • “ ? ”,匹配?号前面的字符1次或者0次,如果放在*或者+后面就变成”非贪婪模式“,只返回最短的匹配字符
      • {m},匹配前面字符m次
      • {n,m},匹配前面字符n 到m次,比如"re.findall("ab{1,3}","abb abc abbcbbb")“,结果["abb","ab","abb"]、
      • “ () ”,分组匹配,可以将括号内的字符当成一个整体来处理,比如"re.findall("(ab){1}","ababc")",结果["ab","ab"]
      • “ | ”,匹配|左或右的字符,或者逻辑。
      • " d ",匹配数字
      • “ D ”,匹配非数字,包括特殊字符。
      • “ w ”,匹配[0-9a-zA-Z]
      • " W ”,匹配非[0-9a-zA-Z]
      • ” s ”,匹配空白字符,空格、换行等。
      • “ (?P<city>)(?P<birthday>) ”,分组匹配后按所取的键名返回一个字典,比如re.search("(?P<city>(d){6})(?P<birthday>(d){8})","350783199306260001").groupdict(),结果是:{'city': '350783', 'birthday': '19930626'}
      • " split() ",分割后返回一个列表,比如print(re.split("d+","a12b13c")),结果是:[“a”,"b","c"]
      • “ sub() ”,替换, 最后一个参数是替换次数。比如print(re.sub(".+","a12b13c",flags=r.S)),结果是:a_b13c
      • " flags=r.S ",改变“.”的模式,使其可以匹配换行符,比如:print(re.match(".*" , "a12b13c" , flags=re.S)),结果是:a12b13c
      • " flags=r.M ",改变“^”和"$"的模式,使其可以匹配多行,比如:print(re.search("(aaab){1}$","aaa12b13c aaab a1da",flags=re.M)),结果是:aaab,如果不加re.M是匹配不到aaab的
      • “ flags=r.I ",忽略大小写,都匹配。比如:print(re.search("(aaab){1}","aaa12b13c Aaab a1da",flags=re.I)),结果是:Aaab

          

  • 相关阅读:
    Expression基础体验
    浅谈Pool对象
    TreeBuilder科学的树创建器
    2种负载均衡算法
    亲自打造Deferred对象
    Animation
    micro-template改造
    Node.js的缺陷
    让JSON.js完全适应.NET
    关系型数据库操作一些不好用的地方
  • 原文地址:https://www.cnblogs.com/tangwei-fuzhou/p/12743005.html
Copyright © 2011-2022 走看看