(翻译)30天学习Python第十六天——模块基础

(翻译)30天学习Python第十六天——模块基础

技术杂谈小彩虹2021-07-15 12:24:2970A+A-

30天学习Python第十六天——模块基础

模块

今天我花了一些时间探索Python中的模块。结构化和组织代码是开发中非常重要的一个部分。到目前你为止,我们已经使用命名函数和创建类来组织功能以结构化代码。但是,当项目的规模变大,很难将所有代码放在一个文件中,因为它的大小会变得非常大,阅读和理解代码会非常困难。这个问题可以通过使用模块解决。在Python中模块是包含一些Python代码的Python文件(带有.py后缀)。使用模块,一个文件可以基于功能或者特征被拆分到多个文件中。模块是组织和复用代码的绝佳方式。模块可以使用import关键字被用在另一个模块中或者交互式的Python解释器中。

假设在我们的项目中有两个文件,main..pyutilities.pymain.py是将要被解释器运行的文件。

utilities.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 

这些utility函数能够被任何文件引入和复用,从而改进代码组织。

引入方式

import语法有几种不同的方式可以用于引入模块

引入并且重命名

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...import语句

从一个模块中引入特定的名字而不引入整个模块

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__

__name__是Python中的特殊属性,用于检查模块的名称。

# utilities.py
print(__name__)  # utilities


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


def emojifier(content, emoji):
    return f'{emoji} {content} {emoji}'
# 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 

注意:解释器运行时这个文件中的__name__返回___main__。很巧的是这个文件的名字也叫main。但是文件的名称可以是任意的。在Python中有一个常见的用法是,执行一个条件语句判断语句是否是main模块。

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

包是放置在一个文件夹中的一组模块。包是将功能相近的模块放在一个组里,就像我们会把所有的音乐放在音乐文件夹里,把视频放在视频文件夹里,以此来更好的组织文件。所有的Python模块需要包含一个__init.py__文件。这样能够让Python解释器知道这个目录是一个Python包。

我们把utilities 模块放在一个叫helper的目录中,这个helper目录需要包含一个__init.py__文件使它成为一个包。这个包可以main文件引入

# 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')

上面的引入可以更加方便,像下面这样

from helper.utilities import tagify, emojifier

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')

内置模块

Python中带有许多内置模块,这些模块在安装Python时随着Python解释器一起下载。在其他的一些编程语言中,这也叫做标准库。这些模块由Python核心团队开发和维护,并且提供开箱即用的功能来做很多事情,比如读取文件、处理音频数据、处理邮件等等。Python标准库列表

这些模块可以像用户自己创建的模块那样引入。

import time  # 内置Python模块


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的外部包等。

原文链接

30 Days of Python - Day 16 - Module Basics

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1

联系我们