函数是什么
函数是一组操作的集合,并赋予它一个名字。你已经使用过许多 Python 内置的函数,例如 string.title() 和 list.sort() 。我们也可以定义自己的函数,它们可以“教导” Python 作一些新的行为。
通用语法
一个函数通常如下所示:
# Let's define a function.
def function_name(argument_1, argument_2):
# Do whatever we want this function to do,
# using argument_1 and argument_2
# Use function_name to call the function.
function_name(value_1, value_2)
这段代码并不能运行,但显示了函数的通常用法。
定义一个函数
使用关键字 def 告诉 Python 你将要定义一个函数。
给你的函数起一个名字。函数名应当能表明函数是干什么的。
给函数需要的数据起名称。
它们是变量名,而且只在函数里用。
这些名称被称为函数的参数(arguments)
确保函数的定义以冒号结束。
在函数内部,写下任意你想要的代码。
使用你的函数
函数名后跟圆括号调用函数。
在圆括号中,给出函数运行需要的数据。
函数中的参数可以是变量,例如 current_name 和 current_age,也可以是实际的数据,例如 'eric' 和 5。
示例
第一个例子
第一个简单的例子,我们实现一个道贺的程序。我们先实现一个不用函数的版本,尝试去理解函数的作用。如下所示:
print("You are doing good work, Adriana!")
print("Thank you very much for your efforts on this project.")
print("\nYou are doing good work, Billy!")
print("Thank you very much for your efforts on this project.")
print("\nYou are doing good work, Caroline!")
print("Thank you very much for your efforts on this project.")
上述代码有很多重复的地方,函数就是用来替代重复的代码,在需要的地方引用它。使用函数后的代码如下所示:
def thank_you(name):
# This function prints a two-line personalized thank you message.
print("\nYou are doing good work, %s!" % name)
print("Thank you very much for your efforts on this project.")
thank_you('Adriana')
thank_you('Billy')
thank_you('Caroline')
在初始代码中,每条被打印的语句中,除了名字其他部分都是相同的。当你看到这样的重复语句后,就可以使用函数使你的程序更有效率。
一个常见的错误
函数一定要在使用之前定义。否则就会引起错误。示例如下:
thank_you('Adriana')
thank_you('Billy')
thank_you('Caroline')
def thank_you(name):
# This function prints a two-line personalized thank you message.
print("\nYou are doing good work, %s!" % name)
print("Thank you very much for your efforts on this project.")
第一行先调用了函数,但是 Python 不知道如何运行这个函数。只有在调用它之前定义才能正确运行。
第二个例子
在我们介绍列表中的排序方法时,写了很多重复的代码。让我们先来看看不使用函数情况下的代码。如下所示:
students = ['bernice', 'aaron', 'cody']
# Put students in alphabetical order.
students.sort()
# Display the list in its current order.
print("Our students are currently in alphabetical order.")
for student in students:
print(student.title())
# Put students in reverse alphabetical order.
students.sort(reverse=True)
# Display the list in its current order.
print("\nOur students are now in reverse alphabetical order.")
for student in students:
print(student.title())
接下来使用函数来实现相同的功能。代码如下所示:
def show_students(students, message):
# Print out a message, and then the list of students
print(message)
for student in students:
print(student.title())
students = ['bernice', 'aaron', 'cody']
# Put students in alphabetical order.
students.sort()
show_students(students, "Our students are currently in alphabetical order.")
#Put students in reverse alphabetical order.
students.sort(reverse=True)
show_students(students, "\nOur students are now in reverse alphabetical order.")
这段代码就简洁的多了。我们想要显示列表中的学生名字并展示一条提示信息。给这个操作赋予一个名字 show_students() 。
这个函数需要两条信息来完成它的工作。学生列表和一条要展示的信息。在函数内部,打印要展示的信息并循环打印学生列表。
现在为止我们的程序变得相当简洁,我们只需要关注重复代码中不同的部分即可。程序的可读性也提高了。
使用函数的优点
通过这些例子,你可能已经体会到使用函数的好处:
在这个简单的例子中,我们节省了不少的工作量。在更大的程序中,将会节省更多的工作量。
当一个函数可以工作后,我们不必担心函数的代码。每次在程序中重复使用函数时,都是一次检验函数的机会。每次发现 bug 时,只需要修改函数代码而不必在每个重复的地方修改。
同理,在完善,增添代码功能时,只需要修改函数内部代码即可。
返回值
每个函数都可以返回一个值。返回值可以是当前函数主要功能外无足轻重的功能,也可以是函数的主要功能。下述代码通过数字返回相应的单词。
def get_number_word(number):
# Takes in a numerical value, and returns
# the word corresponding to that number.
if number == 1:
return 'one'
elif number == 2:
return 'two'
elif number == 3:
return 'three'
# ...
# Let's try out our function.
for current_number in range(0,4):
number_word = get_number_word(current_number)
print(current_number, number_word)
在上述代码中,输出的第一行是 None,这是一个逻辑错误。函数接受一个参数 0,这个变量不在函数 if 链的判断范围内,返回了一个 None。我们需要添加一个else来处理不在判断范围内的情况。如下所示:
def get_number_word(number):
# Takes in a numerical value, and returns
# the word corresponding to that number.
if number == 0:
return 'zero'
elif number == 1:
return 'one'
elif number == 2:
return 'two'
elif number == 3:
return 'three'
else:
return "I'm sorry, I don't know that number."
# Let's try out our function.
for current_number in range(0,6):
number_word = get_number_word(current_number)
print(current_number, number_word)
如果你在函数中使用返回语句,谨记在碰到返回返回语句后函数会立即停止执行。例如,我们可以在函数的返回语句后添加一条语句,这条语句永远都不会被执行。如下所示:
def get_number_word(number):
# Takes in a numerical value, and returns
# the word corresponding to that number.
if number == 0:
return 'zero'
elif number == 1:
return 'one'
elif number == 2:
return 'two'
elif number == 3:
return 'three'
else:
return "I'm sorry, I don't know that number."
# This line will never execute, because the function has already
# returned a value and stopped executing.
print("This message will never be printed.")
# Let's try out our function.
for current_number in range(0,6):
number_word = get_number_word(current_number)
print(current_number, number_word)
想一想
我们只是简单的介绍一下函数。它还有更多的用法,接下来多多使用函数,体会函数的不同用法。想一想下面的问题:
如何给函数的参数赋初始值。
如何让函数接受不同数量的参数。
动手试一试
Greeter
写下一个函数,参数是一个人的名字,并打印出一条祝福的语句。
用你的函数祝福3个人。
将人名存储在列表中,并且用 for 循环调用函数。
Full Names
写下一个函数,参数包括姓和名字,并打印出一条包含全名的语句。
使用不同的参数,调用 3 次你的函数。
Addition Calculator
写下一个函数,包含两个数字类型的参数。计算参数的和并打印出参数和它们的和。
调用 3 次你的函数。
Return Calculator
修改 Addition Calculator 中的函数,返回参数的和。并在函数外打印出来。
# Ex : Greeter
# put your code here
# Ex : Full Names
# put your code here
# Ex : Addition Calculator
# put your code here
# Ex : Return Calculator
# put your code here
网友评论