Python入门示例系列23 模块
发布时间:2023-04-12 14:24:50 所属栏目:教程 来源:
导读:一个py文件就可以看作一个module。
模块(module)是一个包含函数、变量、类等的文件,其后缀名是.py。模块可以被别的程序引入(import),以使用该模块中的函数、变量、类等功能。这也是使用 python 标准库的方法。
模块(module)是一个包含函数、变量、类等的文件,其后缀名是.py。模块可以被别的程序引入(import),以使用该模块中的函数、变量、类等功能。这也是使用 python 标准库的方法。
|
一个py文件就可以看作一个module。 模块(module)是一个包含函数、变量、类等的文件,其后缀名是.py。模块可以被别的程序引入(import),以使用该模块中的函数、变量、类等功能。这也是使用 python 标准库的方法。 import 语句 理解 import 的执行过程。被import的py文件会全部执行一遍。 不管是 import sth,还是 from sth import sth,被import的py文件总是全部执行一遍。 想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下: import module1[, module2[,... moduleN] 当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。 搜索路径是一个解释器会先进行搜索的所有目录的列表。如想要导入模块 support,需要把命令放在脚本的顶端: support.py 文件代码 def print_func( par ): print ("Hello : ", par) return test.py 引入 support 模块: test.py 文件代码 # 导入模块 import support # 现在可以调用模块里包含的函数了 support.print_func("aaa") 以上实例输出结果: Hello : aaa 一个模块只会被导入一次,不管执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。 当我们使用import语句的时候,Python解释器是怎样找到对应的文件的呢? 这就涉及到Python的搜索路径,搜索路径是由一系列目录名组成的,Python解释器就依次从这些目录中去寻找所引入的模块。搜索路径是在Python编译或安装的时候确定的,安装新的库应该也会修改。搜索路径被存储在sys模块中的path变量,做一个简单的实验,在交互式解释器中,输入以下代码: import sys print(sys.path) 以上实例输出结果: ['E:\\temp\\testtest', 'E:\\temp\\testtest', 'C:\\python38\\python38.zip', 'C:\\python38\\DLLs', 'C:\\python38\\lib', 'C:\\python38', 'C:\\python38\\lib\\site-packages', 'C:\\python38\\lib\\site-packages\\win32', 'C:\\python38\\lib\\site-packages\\win32\\lib', 'C:\\python38\\lib\\site-packages\\Pythonwin'] sys.path 输出是一个列表,其中第一项是空串'',代表当前目录,亦即我们执行 python 解释器的目录(对于脚本的话就是运行的脚本所在的目录)。 因此若在当前目录下存在与要引入模块同名的文件,就会把要引入的模块屏蔽掉。 了解了搜索路径的概念,就可以在脚本中修改 sys.path 来引入一些不在搜索路径中的模块。 现在,在解释器的当前目录或者 sys.path 中的一个目录里面来创建一个 fibo.py 的文件,代码如下: 实例 # 斐波那契(fibonacci)数列模块 def fib(n): # 定义到 n 的斐波那契数列 a, b = 0, 1 while b < n: print(b, end=' ') a, b = b, a+b print() def fib2(n): # 返回到 n 的斐波那契数列 result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result def _fun(a,b): return a+b if __name__ == "__main__": print("run as main") else: print("this module was imported by others") 然后进入Python解释器,使用下面的命令导入这个模块: >>> import fibo 这样做并没有把直接定义在fibo中的函数名称写入到当前符号表里,只是把模块 fibo 的名字写到了那里。 可以使用模块名称来访问函数: 实例 import fibo print(fibo.fib(100)) print(fibo.fib2(50)) print(fibo._fun(1,2)) print(fibo.__name__) 结果: 1 1 2 3 5 8 13 21 34 55 89 None [1, 1, 2, 3, 5, 8, 13, 21, 34] fibo 如果你打算经常使用一个函数,你可以把它赋给一个本地的名称: >>> fib = fibo.fib >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 from … import 语句 Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下: from modname import name1[, name2[, ... nameN]] 例如,要导入模块 fibo 的 fib 函数,使用如下语句: >>> from fibo import fib, fib2 >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 这个声明不会把整个fibo模块导入到当前的命名空间中,它只会将fibo里的 fib函数, fib2函数 引入进来。 from … import * 语句 把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明: from modname import * 这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。 可以一次性的把模块中的所有(函数,变量)名称都导入到当前模块的字符表: from fibo import * print(fib(100)) print(fib2(50)) print(__name__) print(_fun(1,2)) # NameError: name '_fun' is not defined 这将把所有的名字都导入进来,但是那些由单一下划线(_)开头的名字不在此例。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。 __name__属性 一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用 __name__ 属性来使该程序块仅在该模块自身运行时执行。 from fibo import * print(fib(100)) 结果: this module was imported by others 1 1 2 3 5 8 13 21 34 55 89 None 说明: 每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。 说明:__name__ 与 __main__ 底下是双下划线, _ _ 是这样去掉中间的那个空格。 dir() 函数 内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回: import fibo print(fibo.fib(100)) print(dir(fibo)) 结果: this module was imported by others 1 1 2 3 5 8 13 21 34 55 89 None ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_fun', 'fib', 'fib2'] 如果没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称: >>> a = [1, 2, 3, 4, 5] >>> import fibo >>> fib = fibo.fib >>> dir() # 得到一个当前模块中定义的属性列表 ['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys'] >>> a = 5 # 建立一个新的变量 'a' >>> dir() ['__builtins__', '__doc__', '__name__', 'a', 'sys'] >>> >>> del a # 删除变量名a >>> >>> dir() ['__builtins__', '__doc__', '__name__', 'sys'] >>> (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
