欢迎来到Python教程自学网!
当前位置: 首页 > Python基础教程 > python自定义函数的写法及用法

python自定义函数的写法及用法

   

python自定义函数的写法及用法

函数是什么

函数是一组操作的集合,并赋予它一个名字。你已经使用过许多 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)