在第2章【安装和运行Python】教程里面,我们已经介绍了想要运行Python程序有两种方法。第一种方法是打开Pyhint编辑器,该程序会自动打开new.py脚本文件,该文件位于Pyhint\Learn-Python\test文件夹内。在Pyhint编辑器左边的编辑框内输入代码,并点击上面的“运行”按钮,就可以运行Python代码。第二种方法是打开Pyhint编辑器,点击Pyhint编辑器上面的“打开终端”按钮,在弹出的黑色cmd终端窗口中,就可以运行“Pyhint\Learn-Python\test”文件夹内的文件,比如在“Pyhint\Learn-Python\test”文件夹内有一个new.py脚本文件,我们在黑色的cmd终端窗口中输人“python new.py”并按下Enter回车键即可运行“new.py”内的代码。
实际上,上面这两种方法运行Python程序的原理都是一样的,都是把程序作为单个以“.py”为后缀的文件运行的。在一些大型的Python程序中,我们可能需要将代码拆分成几个文件以便于分类管理,每个文件存放不同的功能代码,这样不仅方便修改和维护,而且提高了代码的可读性。为了满足这些需求,Python引入了“模块”的概念,可以把需要重复利用的代码定义在一个文件中,并在使用它们时直接导入即可。我们把已经定义好的,可重复利用的代码文件称为模块,模块中定义的代码可以被导入到另一个模块或者主模块中。
1、Python模块介绍
模块具体指的是一个包含所有已经定义的函数、变量、类等数据的文件,其后缀名是“.py”。简单理解,模块就是Python程序,也就是说,任何后缀名是“.py”的Python程序都可以作为模块。例如:我们新建一个funs.py文件,内容如下:
动手练一练: funs.py:
def fs(x):
odd = [] #创建一个空列表用来存奇数
even = [] #创建一个空列表用来存偶数
for i in x:
if i%2:
odd.append(i)
else:
even.append(i)
return odd, even
def fs2(x):
up = [] #创建一个空列表用来存正数
down = [] #创建一个空列表用来存负数
for i in x:
if i>0:
up.append(i)
else:
down.append(i)
return up, down
上面的模块定义好后,接下来我们就可以在与funs.py同一个目录下使用这个模块,在同一个目录下新建一个run.py文件,例如:
动手练一练: run.py:
import funs
list=[4, 7, 10, 25, 32, 44, 47]
result = funs.fs(list)
print(result) # 输出 ([7, 25, 47], [4, 10, 32, 44])
print("奇数为:", result[0]) # 输出 奇数为: [7, 25, 47]
print("偶数为:", result[1]) # 输出 偶数为: [4, 10, 32, 44]
执行以上代码,输出结果为:
([7, 25, 47], [4, 10, 32, 44])
奇数为: [7, 25, 47]
偶数为: [4, 10, 32, 44]
上面的例子中,我们使用了关键字“import”成功导入了前面定义的“funs”文件,并成功引用了“funs”模块中的“fs()”函数,利用该函数把list的列表数据分类成奇数和偶数。由于模块也是对象,调用模块中的内容和调用对象中的内容的方法是一模一样的,所以我们直接可以通过“funs.fs()”调用“funs”模块中的“fs()”函数。
这里需要注意的是,使用模块前必须先使用关键字“import”引入模块,Python中导入模块默认是从当前文件夹内查找模块,自定义的Python文件的模块一定不要和系统中已有的模块名冲突(不能同名)。
前面介绍了我们可以直接使用关键字“import”导入模块文件,“import”导入的是整个模块,还有另一种导入模块的方法是“from…import…”,它可以导入模块中的部分函数,并且可以直接使用函数,不需要通过对象调用,例如:我们更改一下run.py文件,内容如下:
动手练一练: run.py:
from funs import fs, fs2
list = [4, 7, 10, 25, 32, 44, 47]
result = fs(list)
print(result) # 输出 ([7, 25, 47], [4, 10, 32, 44])
print("奇数为:", result[0]) # 输出 奇数为: [7, 25, 47]
print("偶数为:", result[1]) # 输出 偶数为: [4, 10, 32, 44]
print("-------这是虚线-------")
list2 = [-3, 5, 6, -12, 11, -8, 16]
result2 = fs2(list2)
print(result2) # 输出 ([5, 6, 11, 16], [-3, -12, -8])
print("正数为:", result2[0]) # 输出 正数为: [5, 6, 11, 16]
print("负数为:", result2[1]) # 输出 负数为: [-3, -12, -8]
执行以上代码,输出结果为:
([7, 25, 47], [4, 10, 32, 44])
奇数为: [7, 25, 47]
偶数为: [4, 10, 32, 44]
-------这是虚线-------
([5, 6, 11, 16], [-3, -12, -8])
正数为: [5, 6, 11, 16]
负数为: [-3, -12, -8]
上面的例子中可以看到,“from…import…”的方式的执行结果和关键字“import”方式差不多。“from…import…”导入的内容就和直接定义在当前文件里面一样。使用“from…import…”的方式导人模块之后,可以直接使用函数“fs()”和“fs2()”,不需要通过对象“funs”调用。
2、Python内置__name__变量
Python中“__name__”就是标识模块名字的一个系统全局变量,可以通过“__name__”获得模块的模块名,例如:我们更改一下run.py文件,内容如下:
动手练一练: run.py:
import funs
print(__name__) # 输出 模块的名称“__main__”
print(funs.__name__) # 输出 funs模块的名称为“funs”
执行以上代码,输出结果为:
__main__
funs
上面的例子中,“funs.__name__”执行打印的结果是模块名字“funs”,但是通过直接执行“print(__name__)”打印的值却是“__main__”,因为在Python中“__name__”是代表当前文件的模块名,所以当模块被直接运行时模块名为“__main__”。有了这个特性,我们在定义模块的时候可以通过检查当前文件“__name__”输出的变量值是否为“__main__”,来判断当前文件是被自己执行还是作为模块被别的文件导人。例如:我们更改一下run.py文件,内容如下:
动手练一练: run.py:
if __name__ == "__main__":
print("直接运行")
else:
print("被当作模块导入")
执行以上代码,输出结果为:
直接运行
上面的例子中,如果run.py文件直接运行时,那么“__name__”默认等于字符串“__main__”,输出“直接运行”。在Python中,“__name__”属性值为“__main__”的模块是主模块,并且⼀个程序中只有⼀个主模块。
3、Python中dir()函数
dir()函数是Python的内置函数,使用dir()函数可以查看对象内的所有的属性和方法。在调试程序时,dir()函数可以快速查找对象的属性和方法,从而更好地理解对象的结构和行为。当我们为dir函数提供一个模块名的时候,它返回模块定义的名称列表。dir()函数不带参数时,返回当前作用域中的名字列表。具体来说,这些名字包括所有模块(即从当前模块导入的所有模块)、变量、函数、类等。例如:我们更改一下run.py文件,内容如下:
动手练一练: run.py:
import funs
print(dir(funs))
执行以上代码,输出结果为:
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fs', 'fs2']
上面的例子中,我们可以看到一些内置的变量,同时也可以看到模块“funs”中定义了两个函数“fs”和“fs2”。在开发程序中,当您的Python脚本中包含多个模块时,可以使用dir()函数快速了解模块中定义的内容。