在上一篇《手把手陪您学Python》29——匿名函数中,我们介绍了匿名函数的格式和用法。
使用函数的优点之一是可以将自定义函数的代码块与主程序分离,使整个代码结构更清晰,可读性更高。同时,自定义函数的使用,还能够实现代码段的复用,避免实现同一作用的代码段在整个程序中多次重复出现。
但我们之前学习的函数都是在一个程序或者文件中体现的,虽然可以复用,但也仅仅只能在这一个程序或者文件中复用。如果想在多个程序或者文件中复用同一个函数,在我们目前介绍的方法中是无法实现的。
今天我们就介绍一种方法,可以将函数存储在独立的文件中,通过导入,就可以实现在不同程序或者文件中重复使用同一个函数,而无需在每个程序或文件中重复编写相同的函数代码。
这种方法就是——模块。
模块是一个储存函数的独立文件,使用import语句,可以在当前运行的程序中使用模块中的代码。
1、模块的意义和价值
通过将函数存储在独立的文件中,可以无需考虑函数的实现过程,而让我们专注于更高阶的代码逻辑中。不仅能够让我们复用自己编写的自定义函数,还能够与其他程序员共享这些模块(或者说函数),甚至还能够让我们使用其他更高级的函数库。
在这个系列文章的第一篇——《手把手陪您学Python》1——为什么要学Python?中,我们介绍过,库是Python最为独特的特性之一。
在Python中,不仅有官方提供的很多内置库,还有外部开发者为Python开发的诸多第三方库。有了这些“库”的加持,很多的复杂而又强大的功能就不需要我们这些使用者自己编程实现了。只要在Python中调用这些库,就能够轻而易举地实现很多强大的功能,比如图形处理、自然语言分析、网络爬虫、机器学习等等。
这里所说的库就是指函数库,一个由多个函数构成的大型模块。而调用这些库的过程,就是我们今天要讲的使用import语句导入模块的过程。
所以说,虽然今天的内容学习理解起来非常简单,但它却是将我们这些Python初学者,与整个Python强大世界连接的纽带。有了这些库的加持,只要我们能够掌握一些基本的Python语句和结构,就能够实现很多强大功能,而这对于别的编程语言来说,是十分难以想象的。
像我们在下一阶段要学习的Numpy、Pandas就是数据分析领域中最为基础和重要的两个库。通过导入和使用Numpy、Pandas,不仅可以让我们掌握使用Python进行数据分析的方法,还能够超越Excel,成为数据分析的大神!
所以,让我们一起加油吧!!!
2、创建模块
要让函数是可导入的,就得先创建模块。
模块是扩展名为.py的文件,包含要导入到程序中的代码。
由于Jupyter Notebook保存文件的扩展名是.ipynb,是不能够作为模块保存和导入的,所以在制作模块文件时,需要我们使用PyCharm软件编写代码和保存模块。在导入模块进行使用时,可以随意使用Jupyter Notebook或PyCharm。
下面就让我们一起创建一个包含buy_iphone()和buy_ipad两个函数的模块:
In [1]: def buy_iphone(amount, model, *others): # 使用了不定长函数
print("\n购买{}台{},型号及颜色等要求如下:".format(amount, model))
for other in others:
print("- {}".format(other))
def buy_ipad(amount, model, *others):
print("\n购买{}台{},型号及颜色等要求如下:".format(amount, model))
for other in others:
print("- {}".format(other))
将这个代码段在PyCharm中保存为apple.py(默认就是保存为.py),这就是我们创建的第一个模块,包含着我们一会儿可以多次用于导入的函数。
3、导入模块的方法
导入模块的方法有很多种,下面就对每种方法进行逐一的介绍。
a、导入整个模块
在apple.py所在的目录中,创建一个名为shopping_a.py的文件。(如果用Jupyter Notebook创建,文件名就是shopping_a.ipynb,都可以。)
使用import语句导入刚才创建的模块,就可以调用里面的函数了。
In [2]: import apple
apple.buy_iphone("1", "ihone 12", "型号:Pro Max", "颜色:蓝色", "内存:128GB", "1年延保服务")
apple.buy_ipad("2", "iPad", "型号:Air4", "网络:WIFI", "颜色:绿色", "内存:256GB", "1年延保服务")
当运行这段代码时,import apple让Python打开apple.py文件,并将其中所有函数都复制到当前程序中,也就实现了从其他文件或者模块调用函数的目的,其语法格式为:
import 模块名
我们不需要了解这个复制、调用的过程是如何实现的,只需要知道在shopping_a.py这个文件的代码中,可以使用apple.py中定义的所有函数了。
要调用被导入模块中的某一特定函数,需要将被导入模块的名称和要使用的函数名称之间用英文句点“.”进行连接,语法格式为:
模块名.函数名()
这样的语法格式,和我们之间介绍的“对象.方法()”非常类似,这也是Python程序易于编写,可读性高的一个体现。
上面的代码中,apple.buy_iphone()和apple.buy_ipad()就是调用的apple.py中的两个函数的过程。
运行上面的程序,可以得到下面的结果:
Out[2]:
购买1台ihone 12,型号及颜色等要求如下:
- 型号:Pro Max
- 颜色:蓝色
- 内存:128GB
- 1年延保服务
购买2台iPad,型号及颜色等要求如下:
- 型号:Air4
- 网络:WIFI
- 颜色:绿色
- 内存:256GB
- 1年延保服务
为了输出结果的美观,我们在模块的函数中,都增加了转义符“\n”,所以输出的结果前都有个空行。由于输出结果类似,在后面的实例中就不再展示输出结果了,大家可以自行运行程序查看输入结果。
这就是第一种导入模块的方法,只需编写一条import语句,并在其中指定模块,就可以在程序中使用该模块中的所有函数了。
b、导入特定函数
除了将整个模块进行导入外,还可以导入模块中的特定函数,这种导入方法的语法格式为:
from 模块名 import 函数名
如果用逗号“,”分隔函数名,还可以根据需要,从模块中导入任意数量的函数,其语法格式为:
from 模块名 import 函数名1, 函数名2, 函数名n
对于我们之前建立的apple.py模块,如果只想导入buy_iphone()函数,可以再创建一个文件shopping_b.py,并编写如下代码:
In [3]: from apple import buy_iphone
buy_iphone("1", "ihone 12", "型号:Pro Max", "颜色:蓝色", "内存:128GB", "1年延保服务")
可以看到,使用这种方法时,就不需要再使用“模块名.函数名()”的语法格式了,而是像普通自定义函数一样,直接使用函数名调用函数就可以了。
c、使用as给函数指定别名
由于要导入的模块的函数名称是已经定义好,或者说通用的,可能并不能满足于我们某一个程序的命名规则,还有可以与我们现有程序中的函数名称冲突。此时,就可以使用as关键字,给我们从其他模块中调用的函数进行命名,相当于起了个“外号”,其语法格式为:
from 模块名 import 函数名 as 别名
如果要导入多个函数并进行重命名,就可以写为:
from 模块名 import 函数名1 as 别名1, 函数名2 as 别名2, 函数名n as 别名n
对于之前建立的模块,我们可以再创建一个文件shopping_c.py,来实现这种导入功能:
In [4]: from apple import buy_iphone as ph, buy_ipad as pd
ph("1", "ihone 12", "型号:Pro Max", "颜色:蓝色", "内存:128GB", "1年延保服务")
pd("2", "iPad", "型号:Air4", "网络:WIFI", "颜色:绿色", "内存:256GB", "1年延保服务")
我们可以看到,通过给函数重命名(起别名),不仅可以解决合理命名的问题,还可以简化函数的名称,便于使用。当然,简化也要在保证不影响可读性的情况下进行。\
d、使用as给模块指定别名
除了给函数指定别名,还可以给模块指定简化的别名,便于我们在导入整个模块,并调用函数时使用,其语法格式为:
import 函数名 as 别名
当我们使用这种导入方法时,就可以在shopping_d.py中使用如下代码:
In [5]: import apple as a
a.buy_iphone("1", "ihone 12", "型号:Pro Max", "颜色:蓝色", "内存:128GB", "1年延保服务")
a.buy_ipad("2", "iPad", "型号:Air4", "网络:WIFI", "颜色:绿色", "内存:256GB", "1年延保服务")
导入模块和调用函数的方式和介绍的第一种方法是一样的,只不过用简化的模块名称a代替了原模块名称apple。
因为在一个程序中会导入的模块远比其中的函数要少的多,所以一般使用简化模块名称的方式,而不是简化函数名称的方式来编写代码,这样既达到了简化代码的目的,也不会影响程序的可读性。
所以,这种导入方式也是Python中最为常用的导入方式,包括我们在数据分析中,就会经常用到:
import numpy as np
import pandas as pd
这样的导入语句。
以及np.array(),pd.DataFrame()这样的函数调用语句等。
e、导入模块中的所有函数
使用“*”可以导入模块中的所有函数,然后就可以像自定义函数一样使用他们了,其语法格式为:
from 模块名 import *
最后建立一个shopping_e.py的文件,编写如下代码:
In [6]: from apple import *
buy_iphone("1", "ihone 12", "型号:Pro Max", "颜色:蓝色", "内存:128GB", "1年延保服务")
buy_ipad("2", "iPad", "型号:Air4", "网络:WIFI", "颜色:绿色", "内存:256GB", "1年延保服务")
由于导入了模块中的所有函数,在程序中可以直接使用名称调用每个函数,而无需再用“.”来引入了。
但是,当我们要使用不是我们自己编写的模块,特别是大型模块时,最好不要采用这种导入方法。因为要导入的模块中可能包括大量我们不确认的函数,其名称可能会与我们当前程序中的函数名称冲突。当遇到这种重复的函数名称时,Python会覆盖其中的一部分函数,而不是分别导入所有的函数,可能导致一些我们意料不到的结果。
所以,最好的方式还是导入整个模块,并通过模块名和函数名的组合方式,调用并使用函数。当然,如果需要,还可以指定模块名称,达到简化代码的目的。
以上就是通过导入模块来调用其他文件中函数的方法的介绍,同时,我们也理解了Python中强大的函数库的调用原理,为我们后面学习数据分析及其他Python应用奠定了基础。
下一篇,我们将要在调用函数的基础上再进一步,看一看如何通过Python直接对其他文件进行读写等操作,敬请关注。
感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^
要阅读《手把手陪您学Python》系列文章的其他篇目,请关注公众号点击菜单选择,或点击下方链接直达。
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》5——Jupyter Notebook
For Fans:关注“亦说Python”公众号,回复“手30”,即可免费下载本篇文章所用示例语句。
