import utilities as utils
result = utils.tagify('hello world', 'p')
emoji_result = utils.emojifier('python', '?')
print(result) # <p>hello world</p>
print(emoji_result) # ? python ?
from… 导入语句
从模块导入特定名称而不导入整个模块
from utilities import tagify, emojifier
result = tagify('hello world', 'p')
emoji_result = emojifier('python', '?')
print(result) # <p>hello world</p>
print(emoji_result) # ? python ?
使用 * 导入所有名称
from utilities import *
result = tagify('hello world', 'p')
emoji_result = emojifier('python', '?')
print(result) # <p>hello world</p>
print(emoji_result) # ? python ?
上述导入方式不被视为良好的编程实践,因为它会影响可读性并可能导致标识符的重复定义。
__name__
Python 中有一个特殊的 dunder 属性__name__ 来检查模块的名称。
# utilities.py
print(__name__) # utilities
def tagify(content, tag):
return f'<{tag}>{content}</{tag}>'
def emojifier(content, emoji):
return f'{emoji} {content} {emoji}'
__name__ 为编译器运行的文件返回 __main__。这里巧合的是文件名也是 main. 但是,文件名可以是任何内容。Python中有一个常见的做法是根据模块是否是主模块的条件来执行一段代码。
# main.py
from utilities import tagify, emojifier
print(__name__) # __main__
result = tagify('hello world', 'p')
emoji_result = emojifier('python', '?')
print(result) # <p>hello world</p>
print(emoji_result) # ? python ?
Packages
包只是放置在文件夹中的一组模块。包用于将具有相似功能的模块组合在一起,就像我们将所有音乐文件保存在音乐文件夹中,将所有视频保存在视频文件夹中以更好地组织文件一样。每个 Python 模块都需要包含一个 __init.py__ 文件。这让 Python 编译器知道该目录是一个 Python 包。
让我们将实用程序模块放在名为 helper 的目录中。这个辅助目录需要有一个 __init.py__ 文件才能使它成为一个包。然后可以将此包导入到主文件中
# main.py
from utilities import tagify, emojifier
print(__name__)
result = tagify('hello world', 'p')
emoji_result = emojifier('python', '?')
print(result) # <p>hello world</p>
print(emoji_result) # ? python ?
if (__name__ == '__main__'):
print('This is the main module'
) # This line gets printed as its the main module
上面的导入可以像这样更方便
# main.py
import helper.utilities
result = helper.utilities.tagify('hello world', 'p')
emoji_result = helper.utilities.emojifier('python', '?')
print(result) # <p>hello world</p>
print(emoji_result) # ? python ?
if (__name__ == '__main__'):
print('This is the main module')
内置模块
Python 自带很多内置模块。这些模块在安装 Python 时与 Python 编译器一起下载。在其他一些编程语言中,这些也称为标准库。这些模块由 Python 核心团队开发和维护,并提供开箱即用的功能来完成许多很酷的事情,例如读取文件、处理音频数据、处理电子邮件等等。
这些模块可以像任何其他用户创建的模块一样导入。
让我们使用内置模块 time 来创建一个高阶函数,用于计算运行函数所需的时间。
import time # built-in Python module
def list_maker(max_items):
result = []
for item in range(max_items):
result.append(item)
return result
def higher_order(func):
def wrapper(item):
time_start = time.time()
list_maker(item)
time_end = time.time()
time_diff = time_end - time_start
print(f'took {time_diff} seconds')
return wrapper
res = higher_order(list_maker)
print(res(100000))
结果会因系统配置而异。
在函数式编程部分,我们之前也使用了一个内置模块functools来导入reduce函数。
这就是今天的全部内容。明天我们将探索与 Python 模块相关的其余概念,例如使用外部 Python 包等。