文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python学习笔记(九)、模块

2023-01-31 00:01

关注

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 用于文本中的行分隔符('\n' , '\r' 或 '\r\n')
  • 函数 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文档。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯