• python学习笔记(九)、模块


    博客已迁移到CSDN《https://blog.csdn.net/qq_33375499

    1 模块

      使用import 语句从外部导入模块信息,python提供了很大内置模块。当你导入模块时,你会发现其所在目录中,除源代码文件外,还新建了一个名为__pycache__的子目录(在较旧的Python版本中,是扩展名为.pyc 的文件)。这个目录包含处理后的文件,Python能够更高效地处理它们。以后再导入这个模块时,如果.py文件未发生变化,Python将导入处理后的文件,否则将重新生成处理后的文件。删除目录__pycache__不会有任何害处,因为必要时会自动创建它。

    2 包

      为组织模块,可将其编组为(package)。包其实就是另一种模块,但它可以包含其他模块。模块存储在扩展名为 .py 的文件中,而包则是一个目录。要被Python视为包,目录必须包含文件__init__.py。如果像普通模块一样导入包,文件__init__.py的内容就将是包的内容。

      如:包com.xxx.package_name下包含了person.py、bird.py等,并且包含了__init__.py,__init__.py中的内容为:import person              import bird,辣么要在其他py文件中使用该包的所有内容,只需使用from com.xxx.package_name import *       即可。

    3 获取模块信息

      3.1 获取模块包含的信息

        3.1.1 dir

        要查明模块包含哪些东西,可以使用函数dir,它列出对象的所有属性(对于模块,它列出所有的函数、类、变量等)。如:dir(copy)

        3.1.2 获取模块位置

        使用模块的特性__file__获取模块的绝对地址。

    4 常用模块

      本小结只列举了一些常用模块的一些常用功能,如果小伙伴们想知道完整的模块方法,请参考自己Python安装后的目录中的module Docs,如下图:

      4.1 sys

      模块sys让你能够访问与Python解释器紧密相关的变量和函数。

    • 变量 sys.argv 包含传递给Python解释器的参数,其中包括脚本名。
    • 函数 sys.exit 退出当前程序。
    • 映射 sys.modules 将模块名映射到模块(仅限于当前已导入的模块)。
    • 变量 sys.path 一个列表,包含要在其中查找模块的目录的名称。
    • 变量 sys.platform 一个字符串,返回运行解释器的“平台”名。这可能是表示操作系统的名称(如win32),也可能是表示其他平台类型(如java虚拟机)。

      4.2 os

      模块os能够让你访问多个操作系统服务。

    • 映射 os.envirom 包含本地系统的环境变量。
    • 函数 os.system(command) 用于在子shell中执行操作系统命令。
    • 变量 os.sep 用于路径名中的分隔符。如在windos中,文件路径使用 \ 。UNIX系统中,文件路径使用 / 等。
    • 变量 os.pathsep 用于组合多条路径,就像操作系统中的环境变量一样。pathsep用于分隔不同的路径名:如在window中为 ; ,为在UNIX中为 : 。
    • 变量 os.linesep 用于文本中的行分隔符(' ' , ' ' 或 ' ')
    • 函数 os.urandom(n) 使用随系统而异的强加密随机数据。

      4.3 fileinput

      模块fileinput让你能够对文件进行操作。

    • 函数 fileinput.input([fies[, inplace[, backup]]]) 帮助迭代多个输入流中的行,返回一个可以在for循环中进行迭代的对象。参数inplace=True时,可以对文件进行处理操作。参数backup用于给原始文件创建的备份文件指定扩展名。
    • 函数 fileinput.filename() 返回当前文件的名称。
    • 函数 fileinput.lineno() 返回(累计的)当前行号。
    • 函数 fileinput.filelineno() 返回在当前文件的行号。
    • 函数 fileinput.isfirstline() 检查当前行是否是文件中的第一行。
    • 函数 fileinput.isstdin() 检查最后一行是否来自 sys.stdin。
    • 函数 fileinput.nextfile() 关闭当前文件并移到下一个文件。
    • 函数 fileinput.close() 关闭整个文件链并结束迭代。

      4.4 集合、堆和双端队列

        4.4.1 集合

        很久以前集合是由模块sets中的Set类实现的。虽然在既有代码中可能遇到Set实例,但除非要像后兼容,否则没必要使用它。在较新的版本中,集合是由内置类set实现的,无需导入模块sets。如:set1 = set(rang(10))。

        注意:集合是可变的,因此不能用作字典中的键。但是frozenset集合类型是不可变的,能够用于键。

        4.4.2 堆

        堆,是一种优先队列,能够以任意顺序添加对象,并随时找出(并删除)最小的元素。相比于列表的方法min,效率高很多。

        实际上,Python没有独立的堆类型,而只有一个包含一些堆操作的模块。这个模块名为heapq(其中q表示队列),它包含6个函数(如下列所示),前4个与堆操作直接相关。必须使用列表来表示堆对象本身。

              函数              描述

              heappush(heap, x)        将x压入堆中

              heappop(heap)           从堆中弹出最小的元素

              heapify(heap)           让列表具备推特征

              heapraplace(heap, x)       弹出最小元素,并将x压入堆中

              nlargest(n, iter)          返回iter中n个最大的元素

              nsmallest(n, iter)          返回iter中n个最小的元素

        堆特征:位置 i 出的元素总是大于位置 i // 2 处的元素( 反过来说就是小于位置 i * 2 和 i * 2 + 1处的元素 )。

        函数heappop弹出最小的元素总是位于索引0处,并确保剩余元素中最小的那个位于索引0处(保持堆特征)。

        4.4.3 双端队列

        在需要按添加元素的顺序进行删除时,双端队列很有用。模块collections中,包含类型deque已经其他几个集合(collection)类型。

        与集合(set)一样,双端队列也是可迭代对象创建的,它包含很多有用的方法。

        from collections import deque

        q = deque(range(10))    #创建双端队列

        q.append(11)         #在队列末尾添加

        q.appendleft(12)      #在队列left上添加

        q.appendright(13)      #在队列right上添加

        q.popleft()          #获取并删除left顶端的元素

        q.popright()        #获取并删除right顶端的元素

        q.rotate(-1)        #逆时针旋转1位

        q.rotate(1)         #顺时针旋转1位

      4.5 time

      模块time包含用于获取当前时间、操作时间和日期、从字符串中读取日期、将日期格式化为字符串的函数。日期可表示为实数(从‘新纪元’1月1日0时起过去的秒数。不同平台新纪元可能不同。),也可表示为包含9个整数的元祖。如元祖(2019, 3, 18, 12, 12, 45, 0, 76, 0)表示2019年3月18号12时12分45秒  星期一  2019年的第76天(不考虑夏令时)。

      上述元祖这些都表示年、月(1~12)、日(1~31)、时(0~23)、分(0~59)、秒(0~61)、星期(0~6)、一年的第多少天、夏令时(0,1或 -1)。

      模块time中一些常用的函数如下:

    • 函数 time.asctime([tuple]) 将当前时间(时间元祖)转换为字符串。
    • 函数 time.localtime([secs]) 将秒数转换为表示当地时间的日期元祖。
    • 函数 time.gmtime([secs]) 将秒数转换为国际标准时间。
    • 函数 time.mktime(tuple) 将时间元祖转换为当地时间。
    • 函数 time.sleep(secs) 休眠secs秒。
    • 函数 time.strptime(string[, format]) 将字符串转为时间元祖,并能进行格式化。
    • 函数 time.time() 当前的国际标准时间,以从新纪元开始的秒数表示。

      4.6 random

      模块random包含生成伪随机数的函数。为啥叫伪随机数呢?是因为这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果你想真正的随机,应考虑使用前面os模块中的函数urandom。模块random中的SystemRandom类基于的功能与urandom类似,可提供接近于真正随机的数据。

      模块random中一些常用函数如下:

    • 函数 random.random() 返回一个 0~1(含)的随机实数。
    • 函数 random.getrandbits(n) 以长整数方式返回 n 个随机的二进制位(长整数表示为二进制后,位数等于n)。
    • 函数 random.uniform(a, b) 返回一个 a~b (含)的随机(均匀分布)实数。
    • 函数 random.choice(seq) 从序列seq中随机的选择一个元素。
    • 函数 random.randrange([start], stop, [step]) 从rang(start, stop, step)中随机的选择一个数。step表示步长。
    • 函数 random.shuffle(seq[, random]) 就地打乱可变序列seq,并确保每种可能的排序顺序出现的概率相同。
    • 函数 random.sample(seq, n) 从序列seq中随机的选择 n 个序列值不同的元素。

      4.7 shelve

      在实际工作中,如果只需要简单的对文件存取,可以使用模块shelve。对于模块shelve,最重要的函数就是open(filename, flag, protocol, writeback)。返回一个Shelf对象,供你用来存储数据。

      使用shelve,如果想保证从Shelf对象读取或赋值的所有数据结构都将保存到内存(缓存)中,并等到你关闭Shelf对象时才将它们写入磁盘,可以将writeback参数设置为True。在这种情况下,你必须保证在处理完毕后将Shelf对象关闭。

      参数:flag 默认为‘c’,如果数据文件不存在,就创建,允许读写;可以是: ‘r’: 只读;’w’: 可读写; ‘n’: 每次调用open()都重新创建一个空的文件,可读写。

      4.8 re

      模块re为正则表达式。关于正则表达式的概率大家可以自行去了解一下,只能说,这个东西很强大,并且高大上。

        4.8.1 通配符

        句点( . )表示通配符,只能匹配一个字符。

        4.8.2 对特殊字符进行转义

        使用两个反斜杠( \ )对特殊字符进行转义。

        4.8.3 字符集

        使用 [str] 或 [^str] 来表示字符集匹配,前者表示匹配字符集中的字符,后者表示匹配除字符集中的字符。

        4.8.4 二选一和子模式

        使用管道字符( | ) 表示二选一,如'python|java'。子模式,使用圆括号()。如'(python|java)',注意,当个字符也可称为子模式。

        4.8.5 可选模式和重复模式

        通过在子模式后面加上问好( ? ),可将其指定为可选的,即可包含可不包含,如'(java)?(python)?'。

        重复模式,(pattern)*:pattern可重复 0/1/n 次;(pattern)+:pattern可重复 1/n 次;(pattern){m, n}:pattern可重复 m~n 次。

        4.8.6 字符串的开头和末尾

        指定字符串开头使用脱字符( ^ ),如'^a'。指定字符串结尾使用美元符号( $ ),如'a$'。

        4.8.7 模块re中一些常用函数

          函数                  描述

          compile(pattern[, flags])           根据包含正则表达式的字符串创建模式对象,能提高匹配效率

          search(pattern, string[, flags])       在字符串中查找模式,如果存在,返回MatchObject对象,不存在返回None

          match(pattern, string[, flags])           在字符串开头匹配模式,如果存在,返回MatchObject对象,不存在返回None

          split(pattern, string[, maxsplit=0])                    根据模式来分隔字符串,maxsplit表示最多分隔多少次

          findall(pattern, string)             返回一个列表,其中包含字符串中所有与模式匹配的子串

          sub(pat, replace, string[, count=0])        将字符串中与模式pat匹配的子串都替换为replace

          escape(string)                对字符串中所有的正则表达式特殊字符都进行转义

           re.escape是一个工具函数,用于对字符串中所有可能被视为正则表达式运算符的字符进行转义。使用这个函数的情况有:字符串很长,其中包含大量特殊字符,而你不想输入大量的反斜杠进行转义;你从用户那里获取了一个字符串,想将其用于正则表达式中。

        4.8.8 匹配对象和编组

        在模块re中,查找与模式匹配的子串的函数都在找到时返回MatchObject对象。这些对象包含于模式匹配的子串的信息,还包含模式的哪部分与子串的哪部分匹配的信息。这些子串部分称为编组(group)。

        编组就是放在圆括号内的子模式,他们是根据左边的括号数编号的,其中 0 编组指的是整个模式。如下面模式中:

        'There (a (aa) cc (dd))'

        包含如下编组:

        0  There a aa cc dd

        1  a aa cc dd

        2  aa

        3  dd

        通常,编组包含诸如通配符和重复运算符等特殊字符,因此你可能想知道与给定编组匹配的内容。如模式:

        r'www.(.+).com$'

        编组 0 包含整个字符串,而编组1包含www. 和 .com之间的内容。

        re中匹配对象的重要方法有:

        group([group1,...]):获取与给定模式(编组)匹配的子串。

        start([group]):返回与给定编组匹配的子串的起始位置。

        end([group]):返回与给定编组匹配的子串的终止位置。(与切片一样,不包含终止位置)

        span([group]):返回与给定编组匹配的子串的起始和终止位置。

        注意:出了整个模式(编组0)外,最多还可以有99个编组,编号为1~99.

        在实际开发中,正则表达式时很难理解的,我们可以调用模块re中的函数是使用标志VERBOSE。这样能够让你在模式中添加空白(空白、制表符、换行符等)。如下

          pattern1 = re.compile(r'''

          ...*    #其实标志

          ...(     #...

          ''', re.VERBOSE)

      这里列举了一些比较常用的模块,还有很多有趣的模块,比如datetime、cmd、logging等,如果想了解更多,可以自行去查看API文档。

  • 相关阅读:
    【读书笔记】之《把时间当做朋友》
    软件工程——五大模型
    VB中的GetUserName函数
    VB中 vbp vbw frm frx log bas 等扩展名大全
    【机房收费系统】——基本数据设定的理解
    在64位WindowsServer2012R2中安装Oracle10g第二版(10.2.0.4.0)-20160106
    Linux——vi命令详解
    使用Postman测试WebService接口
    npm和yarn的淘宝镜像添加
    yarn配置私有registry
  • 原文地址:https://www.cnblogs.com/www-123456/p/10526200.html
Copyright © 2020-2023  润新知