zoukankan      html  css  js  c++  java
  • 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文档。

  • 相关阅读:
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark RDD(Resilient Distributed Datasets)论文
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    【机器学习实战】第10章 K-Means(K-均值)聚类算法
    [译]flexbox全揭秘
  • 原文地址:https://www.cnblogs.com/www-123456/p/10526200.html
Copyright © 2011-2022 走看看