8.6 将函数存储在模块中
使用函数的意义在于使代码块与主程序分离,这样不但使得主程序结构逻辑更为清晰,容易理解,另一方面也简短了代码长度。其实,我们还可以更进一步,将函数写在称作模块的独立文件中,再将模块导入到主程序中。
将函数存储在独立的文件中,可以隐藏代码细节,可以在不同的程序中(而不只是一个)重用函数。
8.6.1 创建一个模块
模块是包含python代码的单个文件,即一个 .py文件,其可以包含函数、类和变量,用于将相关的功能组织到一个文件中,使得代码更易于管理和重用。创建一个模块实质上就是创建一个 .py文件,如下面的python文件
#一个名为 function_module.py的文件
def function_0():
print("我是一号函数")
return
def function_1():
print("我是二号函数")
def function_2():
print("我是三号函数")
这样,我们就创建了一个名为function_module的模块了
8.6.2 导入模块和模块内容
我们可以使用不同的方法使用import来导入模块的全部或部分内容。
- 我们可以导入整个模块,然后使用句点表示法访问模块中的函数。 方法:import + module_name
#如这里有另一个名为my_program.py的文件
import function_module #导入整个模块
function_module.function_0() #使用句点表示法访问模块中的函数
function_module.function_1()
在函数运行时,导入了整个模块,将其中的所有函数复制到了这个程序中。
- 我们也可以导入模块中的特定函数,这样就可以直接使用这些函数,而不需要使用句点表示法。 方法:from module_name import function_name
#如这里有另一个名为my_program.py的文件
from function_module import function_0 #导入模块中的特定函数
function_0() #直接使用这个函数
导入的函数名称有可能与程序中原有的函数冲突,又或者导入的函数名称太长,不方便使用。python支持对导入的函数或模块指定别名
- 我们还可以使用as给函数指定别名,这样可以避免函数名冲突。 方法:from module_name import function_name as fn
#如这里有另一个名为my_program.py的文件
from function_module import function_0 as f0 #导入模块中的特定函数并指定别名
f0() #直接使用这个函数
- 我们还可以使用as给模块指定别名,这样可以避免模块名冲突。 方法:import module_name as mn
#如这里有另一个名为my_program.py的文件
import function_module as fm #导入整个模块并指定别名
fm.function_0() #使用句点表示法访问模块中的函数
- 我们还可以直接导入模块中的所有函数,这样就可以直接使用这些函数,而不需要使用句点表示法。 方法: **from module_name import * **
#如这里有另一个名为my_program.py的文件
from function_module import * #导入整个模块中的所有函数
function_0() #直接使用这个函数
function_1()
然而,这种方法并不值得推荐,尤其是导入非自己编写的大型模块,因为你不知道会不会有函数名冲突,而且这样会使得代码难以理解。
最佳的做法是导入整个模块,然后通果句点表示法使用模块中的函数,或者导入模块中的特定函数。
8.7 函数编写指南
-
函数和模块都应尽量使用描述性名称,使用小写字母和下划线,以提高代码的可读性。 具体可以表现为,名词来描述对象,动词来描述操作,避免简写和缩写,命名风格应一致。
-
每个函数都应有表示其功能的注释 注释应紧跟在函数定义的下面,使用文档字符串格式,说明清楚函数名、需要的实参和返回值的类型,这样,仅看注释就可以明白如何让函数正确运行。
-
给形参指定默认值时,等号两边不要有空格,函数调用时的关键字实参也遵循这种约定 如:def function_name(parameter_0, parameter_1=‘default value’)
-
代码行的长度不应超过79字符 如果形参很多,导致函数定义的长度超过了79字符,可以在函数定义中输入左括号后按回车键,然后在下一行按两次Tab键,将形参列表和只缩进一层的函数体区分开。
-
如果程序或模块包含多个函数,两相邻函数间可以使用两个空行分隔,以提高可读性 如果在一个模块中,可以使用两个空行分隔不同功能的代码块。
-
导入模块的import语句应放在文件开头 这样可以清楚地知道程序使用了哪些模块。除非开头使用了注释来描述整个程序