Python 30 天 – 第 16 天 – 模块基础(什么是python模块)

作者 : 慕源网 本文共3467个字,预计阅读时间需要9分钟 发布时间: 2021-10-13 共502人阅读

本文是 30 天 Python 挑战系列的一部分。您可以在此处找到本系列之前所有帖子的链接

今天我花了一些时间探索 Python 中的模块。构建和组织代码是开发的一个非常重要的方面。到目前为止,我们已经通过使用命名函数和创建类来组织功能在 Python 中构建代码。但是,当项目的大小增加时,很难将所有代码保存在单个文件中,因为它变得非常大,无法阅读和理解功能。这个问题是通过使用模块来解决的。Python 中的模块是包含一些 Python 代码的 Python 文件(扩展名为 .py)。使用模块,可以根据功能或特性将单个文件拆分为多个文件或模块。模块是组织和重用代码的好方法。然后可以使用 import 关键字在另一个模块或交互式 Python 编译器中使用模块。

假设我们的项目中有两个文件。main.py 和utilities.py。main.py 是将由编译器运行的文件。

Utility.py 应该有一个函数。

def tagify(content, tag):  
    return f'<{tag}>{content}</{tag}>'  
  
  
def emojifier(content, emoji):  
    return f'{emoji} {content} {emoji}' 

然后可以像这样在 main.py 文件中使用此函数

import utilities    
result = utilities.tagify('hello world', 'p')    
emoji_result = utilities.emojifier('python', '?')    
print(result)  # <p>hello world</p>    
print(emoji_result)  # ? python ?  

因此,这些实用功能可以在任何文件中导入和重用,从而改进代码组织。

导入方式

导入语法可用于导入模块的不同方式

重命名导入

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 包等。


慕源网 » Python 30 天 – 第 16 天 – 模块基础(什么是python模块)

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录