每天10分钟,带你一周精通Python:第7章函数和模块
在前几章,我们简单提到了函数和模块。在本章中,让我们详细学习一下它们。再次重申,所有的编程语言都有内建的代码,我们可以使用它们让我们的生活更加轻松。这些代码包含了预先写好的类、变量和函数,它们可以完成某种常见的任务,并保存在被称作模块的文件中。让我们先来了解一下函数。
7.1 什么是函数?
函数是预先写好的可以完成特定任务的代码。作为一个类比,你可以想象一下MS Excel中的可用的数学函数。为了把数字加起来,我们可以使用sum0函数,并输入sum(A1:A5),而不是输入A1+A2+A3+A4+A5。
依据函数的写法,是否是一个类的一部分(类是面向对象编程中的一个概念,在本书中我们不会涉及它),以及你如何引入它,我们可以简单地输入函数的名字或者使用点标记来调用函数。有些函数需要我们传入函数需要的数据来完成任务。这些数据叫作参数,我们通过把它们的值放入括号中,并以逗号分隔开,来把它们传入到函数中。
比如,为了在屏幕上显示文字,我们使用print(函数,我们通过输入print(“Hello World”)来调用它,其中print是函数的名字,“Hello World”是参数。
另一方面,为了操作文本字符串,可以使用replace()函数,我们需要输入"Hello World".replace(“World”,“Universe”),其中replace是函数的名字,而“Universe”是参数。点号前面的字符串,即“Hello World”,是将被替换的字符串。因此,“HelloWorld”将会被修改为“Hello Universe”。
7.2 定义函数
在Python中我们可以定义自己的函数,并在程序中重复使用它们。定义一个函数的语法如下所示。
def functionName(parameters):
code detailing what the function
should do
return [expression]
其中有两个关键字,def和return。
def告诉程序下一行开始的缩进的代码是函数的一部分。return是我们从函数返回一个结果的关键字。在函数中可以有不只一个的return语句。然而,一旦函数执行了一个returm语句,函数就结束了。如果你的函数不需要返回值,你就可以忽略return语句。另一种方式是你可以写return或者return None。
现在让我们定义第一个函数。假设我们想要确定一个输入的数字是不是素数。下面是我们将如何使用在第3章中学到的取余符号(%)和在第6章学到的fon循环和if语句来定义这个函数。
def checkIfPrime (numberToCheck):
for x in range(2, numberToCheck):
if (numberToCheckx == 0):
return False
return True
在上面的函数中,第2行和第3行使用一个for循环来把输入的参数numberToCheck用从2到numberToCheck-1间的所有数字相除,来确定余数是否是零。如果余数是零,numberToCheck就不是一个素数。第4行将会返回False,函数会结束退出。
如果在for循环中迭代到最后的一个数,所有的除法都没有得到余数零,函数将会执行到第5行,并返回True。接着函数将会结束退出。
为了使用这个函数,我们可以输入checklfPrime(13),并把它像这样分配给一个变量:
answer = checkIfPrime(13)
其中我们传入的参数值是13。接着我们可以通过输入print(answer)来打印出结果。我们将会得到输出:True。
7.3 变量作用域
当定义一个函数时,一个很重要的需要理解的概念是变量的作用域。函数内部定义的变量和外部定义的变量有不同的作用域。它们主要有两个不同点。
- 第一点,在一个函数内定义的任何变量仅在函数内可访问。这些变量叫作局部变量。在函数外定义的任何变量叫作全局变量,可以在程序中的任何位置访问。
为了理解这个概念,可以尝试下面的代码。
messagel="Global Variablen"
def myFunction():
print("\nINSIDE THE FUNCTION")
#在函数内可以访问全局变量
inside a function
print (message1)
#声明一个局部变量
message2 ="Local Variable"
print (message2)
#调用函数
myFunction()
print("\nOUTSIDE THE FUNCTION")
#外部函数可以访问全局变量
function
print (message1)
#在函数外无法访问局部变量
function.
print (message2)
如果运行这个程序,你将会得到下面的输出。
INSIDE THE FUNCTION
Global Variable
Local Variable
OUTSIDE THE FUNCTION
Global Variable
NameError: name ‘message2’ is not defined
在函数内,无论局部变量,还是全局变量,都是可以访问的。在函数外部,局部变量message2就不能访问了。当我们在函数外部想要访问它时,就会得到一个NameError错误。
- 第二个关于变量作用域需要理解的概念是,如果一个局部变量和一个全局变量具有相同的名字,函数内部的所有代码都将访问这个局部变量,而所有外部的代码都将访问全局变量。尝试运行下面的代码。
message1 ="Global Variable (shares same
name as a local variable)"
def myFunction():
message1 = "Local Variable (shares
same name as a global variable)"
print("\nINSIDE THE FUNCTION")
print (message1)
#调用函数
myFunction ()
# 在函数外面打印 message1
print ("\nOUTSIDE THE FUNCTION")
print (message1)
你将会得到下面的输出结果。
INSIDE THE FUNCTION
Local Variable (shares same name as a
global variable)
OUTSIDE THE FUNCTION
Global Variable (shares same name as a
local variable)
当我们在函数内部打印message1时,它会打印“Local Variables(shares same name as a global variable)”,因为它打印的是一个局部变量。
当我们在函数外部打印它时,它访问的将是全局变量,因此打印出来的是 “Global Variable (shares same name as a local variable)”。
7.4 引入模块
Python有大量的内建函数。这些函数被保存在被称作模块的文件中。为了使用Python模块中的内建代码,我们需要先在程序中引入它们。我们通过使用import关键字来达到这个目的。一共有三种方法可以实现。
- 第一种方法是通过使用importmodulename把整个模块都引入到程序中。
比如,为了引入random模块,我们可以这么写import random。
- 为了使用random模块中的randrange0函数,我们可以这么写random. randrange(1, 10)。
如果觉得每次使用函数时都要写random很麻烦,你可以通过使用import random as r(其中r可以是你选择的任何名字)来引入模块到程序中。现在要使用randrange)函数,你仅需要简单地通过使用r.randrange(1,10)即可。
- 第三种引入模块的方法是从模块中引入特定的函数,可以这么写from moduleName import name1[,name2[,…nameN]]。
比如,从random模块中引入randrange()函数,我们可以这么写from random import randrange。如果想要引入多个函数,我们可以把它们用逗号分开。要引入randrange()和randint()函数,我们可以这么写from random import randrange,randint。现在要使用引入的函数,我们就再也不需要使用点号,仅仅写randrange(1,10)就可以了。
7.5 创建模块
除了引入内建的模块,我们也可以创建我们自己的模块。如果你有一些函数想在将来的程序项目中重复使用,这么做就非常有用了。
创建一个模块非常简单,仅需要把文件以.py的扩展名保存,并把它放到你想要从中引入的Python文件的同一个文件夹中即可。
假设你想要使用前面所讲的在另一个Python脚本中定义的checklfPrime()函数。下面就是你这么做的方法。首先把上面的代码保存为prime.py并放到桌面上。prime.py应该包含下面的代码。
def checkIfPrime (numberToCheck):
for x in range(2, numberToCheck):
if (numberToCheckx == 0):
return False
return True
接下来,创建另一个Python文件,并将其命名为useChecklfPrime.py。把它也保存在桌面上。useChecklfPrime.py应该包含下面的代码。
import prime
answer = prime.checkIfPrime(13)
print (answer)
现在运行useChecklfPrime.py。你应该得到输出结果True。就是如此简单。
然而,假设你想要保存prime.py和useChecklfPrime.py到不同的文件夹中。你将需要在useCheckfPrime py中添加一些代码,告诉Python解释器到哪里找到这个模块。
假设你在C盘里创建了一个叫作‘MyPythonModules’的文件夹保存prime.py。你需要在useChecklfPrime.py文件的顶部添加下面的代码(在import prime这行的前面)。
import sys
if 'C:\\MyPythonModules' not in sys.path:
sys.path.append('C:\\MyPythonModules')
sys.path表示的是Python的系统路径。它是一个文件夹的列表,Python会在这些文件夹中搜索模块和文件。上面的代码在你的系统路径中添加了文件夹 ‘C:MyPythonModules’。
现在你可以把prime.py放入到C:MyPythonModules文件夹中,把checklfPrime.py放到你希望的任意文件夹中。