0基础学python30天_(翻译)30天学习Python

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

模块

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

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

utilities.py应该有一个函数def tagify(content, tag):return f'{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)  # 

hello world

print(emoji_result)  # ???? python ????复制代码

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

引入方式

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

引入并且重命名import utilities as utils

result = utils.tagify('hello world', 'p')

emoji_result = utils.emojifier('python', '????')

print(result)  # 

hello world

print(emoji_result)  # ???? python ????复制代码

from...import语句

从一个模块中引入特定的名字而不引入整个模块from utilities import tagify, emojifier

result = tagify('hello world', 'p')

emoji_result = emojifier('python', '????')

print(result)  # 

hello world

print(emoji_result)  # ???? python ????复制代码

使用*引入全部from utilities import *

result = tagify('hello world', 'p')

emoji_result = emojifier('python', '????')

print(result)  # 

hello world

print(emoji_result)  # ???? python ????复制代码

上述导入方式不被认为是良好的编程实践,因为它影响可读性,并可能导致标识符的重复定义。

__name__

__name__是Python中的特殊属性,用于检查模块的名称。# utilities.pyprint(__name__)  # utilitiesdef tagify(content, tag):return f'{content}{tag}>'def emojifier(content, emoji):return f'{emoji} {content} {emoji}'复制代码# main.pyfrom utilities import tagify, emojifier

print(__name__)  # __main__result = tagify('hello world', 'p')

emoji_result = emojifier('python', '????')

print(result)  # 

hello world

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

hello world

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

result = helper.utilities.tagify('hello world', 'p')

emoji_result = helper.utilities.emojifier('python', '????')

print(result)  # 

hello world

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

hello world

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

你可能感兴趣的:(0基础学python30天)