加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Python入门示例系列23 模块

发布时间:2023-04-12 14:24:50 所属栏目:教程 来源:
导读:一个py文件就可以看作一个module。

模块(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']
>>>

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章