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