专业编程基础技术教程

网站首页 > 基础教程 正文

Python 语言学习要点记录8-模块

ccvgpt 2024-11-22 11:26:50 基础教程 1 ℃

在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 模块:

Python 语言学习要点记录8-模块

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"]

Tags:

最近发表
标签列表