网站首页 > 基础教程 正文
在Python 中,模块是包含 Python 定义和语句的文件。 文件名是模块名加上后缀.py。 在模块中,模块的名称(作为字符串)可用作全局变量 __name__ 的值。 例如,在当前文件夹下,创建一个文件,命名为 total.py,并输入下面的代码:
def sum(n):
s = 0
for i in range(n+1):
s += i
print(s)
def sum1(n):
s = 0
for i in range(n+1):
s += i
return s
那么可以用下面的代码导入 sum 模块:
import total
这里没有导入任何定义在 sum 中的函数。不过可以通过 sum 模块名来访问函数:
total.sum(10) #55
total.__name__ #'total'
也可以将函数赋值给一个本地变量:
sum = total.sum()
sum(10) #55
也可以不用将其他模块的所有函数都导入进来,可以只导入指定的函数:
from total import sum()
sum(10)
sum()函数就可以像是本地函数一样进行调用了。此时 total 就不能访问了,就是未定义变量了。当然以 _ 为开头的变量和函数将没办法导入。
也可以通过 * 导入所有的函数:
from total import *
sum(10)
一般不建议使用 * 导入模块的内容,会导致可读性变差。
导入模块时,可以通过 as 起个别名,同样也可以给导入的函数起个别名:
import total as tl
tl.sum(10) #55
from total import sum as s
s(10) #55
模块搜索
当导入模块时,python 会按一种逻辑进行搜索该模块:首先会在内置模块中搜索,也就是在 sys.builtin_module_names 列表中搜索。如果搜索不到,将在变量 sys.path 中提供的路径列表中搜索文件名。sys.path 会包含以下路径:
- 当前脚本文件所在路径
- PYTHONPATH 定义的路径
- 默认的安装路径,由 site 模块定义的 site-packages 路径。
编译 python 文件
为了提高加载模块的速度,Python 将每个模块的编译版本缓存在名为 module.version.pyc 的 __pycache__ 目录中,其中版本对编译文件的格式进行了编码;它通常包含 Python 版本号。
标准库
Python 附带一个标准模块库,在单独的文档 Python 库参考中进行了描述。 一些模块内置于解释器中; 这些提供了对不属于语言核心但仍然内置的操作的访问,无论是为了提高效率还是提供对操作系统原语(如系统调用)的访问。 这些模块的集合是一个配置选项,它也取决于底层平台。
dir() 函数
内置的 dir() 函数可以返回一个模块定义的变量,函数模块等的名字:
import total
print(dir(total))
#['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'sum', 'sum1']
但是 dir() 不会列出内置的函数和变量的名字,这些都定义在 builtins 模块中:
import builtins
dir(builtins)
#['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
'NotImplementedError', 'OSError', 'OverflowError',
'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',
'__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',
'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
'zip']
包
包是一种通过使用“带点的模块名称”来构造 Python 模块命名空间的方法。在 python 中,包和目录很相似,不同点在于包下需要有_ini_.py文件,文件内容可以为空。
例如在project目录下有两个包 Data 和 Business,分别有 search.py(内有 inquire() 函数) 和 process.py(内有filter()函数) 文件:
如果在 search.py 中想要访问 process.py 中的filter() 函数,一般导入即可 :
from Business.process import filter
filter()
当然也有可能你运行上述代码时,会报错误:ModuleNotFoundError: No module named 'Business'。
此时可以在 search.py 中添加一些内容:
import sys
import os
sys.path.append(os.path.dirname(sys.path[0]))
from Business.process import filter
filter()
加入 Business 包下有好几个模块,你想用 from... import * 一次性导入是否可以呢?
from Business import *
process.filter()
可能会报错误:AttributeError: module 'Business' has no attribute 'process'。
如果想要实现这一想法,可以在 Business 中的 __init__.py 中添加对 __all__的定义:
__all__ = ["process"]
- 上一篇: python-模块和包
- 下一篇: Python3中sort和sorted的区别
猜你喜欢
- 2024-11-22 python-模块和包
- 2024-11-22 python组织和管理代码:模块和包、子模块和子包概念及举例
- 2024-11-22 每个 Python 开发人员需要掌握的 5 个基本内置模块
- 2024-11-22 一文提升你的编程能力,Python能力提升系列——加载模块
- 2024-11-22 一文提升你的Python能力——定义模块、说明模块和测试模块
- 2024-11-22 一、Python 模块简介
- 2024-11-22 Python 中引入一个文件,模块的概念
- 2024-11-22 Python基础-模组(类库、模块)
- 2024-11-22 python编程系列教程:9-模块的使用
- 2024-11-22 Python学习点滴02 - 弄清模块、包和库(1)
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)