欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python学习笔记(九)、模块

程序员文章站 2022-04-08 19:16:36
1 模块 使用import 语句从外部导入模块信息,python提供了很大内置模块。当你导入模块时,你会发现其所在目录中,除源代码文件外,还新建了一个名为__pycache__的子目录(在较旧的Python版本中,是扩展名为.pyc 的文件)。这个目录包含处理后的文件,Python能够更高效地处理它 ......

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,如下图:

python学习笔记(九)、模块

 

  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)                对字符串中所有的正则表达式特殊字符都进行转义

 

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