Python3入门基础(09)一个模块

Posted 有时有味

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3入门基础(09)一个模块相关的知识,希望对你有一定的参考价值。

Python3 模块

模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。

标准模块

Python 本身带着一些标准的模块库。如 sys 库,它内置在每一个 Python 解析器中。

字符串正则匹配

re 模块为高级字符串处理提供了正则表达式工具。对于复杂的匹配和处理,正则表达式提供了简洁、优化的解决方案:
math 模块为浮点运算提供了对底层C函数库的访问
random 提供了生成随机数的工具
datetime 模块为日期和时间处理同时提供了简单和复杂的方法。

命名空间

命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。

一般有三种命名空间:

  • 内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
  • 全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
  • 局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)

命名空间查找顺序

命名空间查找顺序:局部的命名空间 -> 全局命名空间 -> 内置命名空间。

命名空间生命周期

命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。

因此,我们无法从外部命名空间访问内部命名空间的对象。

# var1 是全局名称
var1 = 5
def some_func():
 
    # var2 是局部名称
    var2 = 6
    def some_inner_func():
 
        # var3 是内嵌的局部名称
        var3 = 7

作用域

作用域就是一个 Python 程序可以直接访问命名空间的正文区域。

在一个 python 程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则会报未定义的错误。

Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python 的作用域一共有4种,分别是:

  • L(Local):最内层,包含局部变量,比如一个函数/方法内部。
  • E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
  • G(Global):当前脚本的最外层,比如当前模块的全局变量。
  • B(Built-in): 包含了内建的变量/关键字等,最后被搜索。

规则顺序: L –> E –> G –> B。

在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。

import 与 from … import

在 python 用 import 或者 from … import 来导入相应的模块。一个模块只会被导入一次,不管你执行了多少次 import。这样可以防止导入模块被一遍又一遍地执行。

  • 将整个模块(modname)导入,格式为: import module1[, module2[,… moduleN]
  • 从某个模块中导入某个函数,格式为: from modname import name1
  • 从某个模块中导入多个函数,格式为: from modname import name1[, name2[, … nameN]]
  • 将某个模块中的全部函数导入(不建义常用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。),格式为: from modname import *

import 语法会首先把 item 当作一个包定义的名称,如果没找到,再试图按照一个模块去导入。如果还没找到,抛出一个 :exc:ImportError 异常。

注意:当使用 from package import item 这种形式的时候,对应的 item 既可以是包里面的子模块(子包),或者包里面定义的其他名称,比如函数,类或者变量。

反之,如果使用 import item.subitem.subsubitem 这种导入形式,除了最后一项,都必须是包,而最后一项则可以是模块或者是包,但是不可以是类,函数或者变量的名字。

包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。比如一个模块的名称是 A.B, 那么他表示一个包 A 中的子模块 B 。

目录只有包含一个叫做 __init__.py 的文件才会被认作是一个包,主要是为了避免一些滥俗的名字(比如叫做 string)不小心的影响搜索路径中的有效模块。最简单的情况,放一个空的 __init__.py 就可以了。当然这个文件中也可以包含一些初始化代码或者为 __all__ 变量赋值。

采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。

在导入一个包的时候,Python 会根据 sys.path 中的目录来寻找这个包中包含的子目录。

import time
import schedule

from F80_Demo.WxWorkSmsText import execute_job

关于“__”

__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。

__name__属性

一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用 __name__ 属性来使该程序块仅在该模块自身运行时执行。

  • 每个模块都有一个 __name__ 属性,当其值是 __main__ 时,表明该模块自身在运行,否则是被引入。
  • __name____main__ 底下是双下划线, _ _ 去掉中间的空格。
from F80_Demo.WxWorkSmsText import execute_job

如上,如果这么使用 import,意味着将另外一个一个模块(脚本)中的所有代码插到当前模块中,并且可以直接执行被导入模块的可执行代码。

__main__属性

无论是隐式的还是显式的相对导入都是从当前模块开始的。主模块的名字永远是 __main__。一个 Python 应用程序的主模块,应当总是使用绝对路径引用。

__all__属性

如果包定义文件 __init__.py 存在一个叫做 __all__ 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入。

__init__属性

类有一个名为 __init__() 的特殊方法(构造方法,类似 Java 的 无参构造),该方法在类实例化时会自动调用。

当然,__init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上,类似 Java 的 有参构造。

dir() 函数

内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:

>>> import math
>>> dir(math)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp']

以上是关于Python3入门基础(09)一个模块的主要内容,如果未能解决你的问题,请参考以下文章

Python3快速入门——Python3正则表达式

Python3快速入门Python3正则表达式

Python3入门基础(02)数据类型

Python3入门基础(03)数据结构

Python3入门基础(03)数据结构

Python3入门基础(08)一个函数