您的位置:

用Python定义函数的正确方法

在Python中,函数是一个非常重要的概念,它可以将一段代码块封装成一个单独的、可重复使用的单元。正确定义一个函数可以提高代码的可读性、可维护性和可重用性。

一、函数的基本语法

def function_name(parameters):
    """docstring"""
    statement(s)

如上,函数定义以关键字def开头,后接函数名、参数列表,其中parameters是可选的。函数体内可以包含一条或多条statement,可以是任意有效的语句代码。函数的执行结果通过return语句返回。

函数名由字母、数字和下划线组合而成,并以字母或下划线开头。Python中的函数名是大小写敏感的。函数名要具有描述性,以便于代码阅读和理解。

# 示例1
def add(a, b):
    result = a + b
    return result

print(add(1, 2))
# 输出:3

上述示例定义了一个函数add,它的参数列表为ab。函数体内result = a + bab相加,将结果赋值给resultreturn result语句返回result的值。

二、参数传递

Python中函数的参数传递有两种方式:值传递和引用传递。

当将一个变量作为参数传递给函数时,Python默认采用的是值传递,即将变量的副本传递给函数。在函数中对副本进行修改不会影响原始变量。

# 示例2
def func(a):
    a = 3
    print("函数内部:", a)
    return

x = 5
func(x)
print("函数外部:", x)
# 输出:
# 函数内部: 3
# 函数外部: 5

示例2的执行过程如下:首先定义了一个函数func,其中将a的值修改为3,然后执行print("函数内部:", a)语句输出修改后的值。接着定义了变量x,将其值设为5,将x作为参数传递给func函数,执行func(x)语句,输出"函数内部: 3"。最后执行print("函数外部:", x)语句,输出原始值"函数外部: 5"。

如果使用引用传递,则意味着在函数内部对参数的任何修改都会影响原始变量。

# 示例3
def func(mylist):
    mylist.append([4, 5, 6])
    print("函数内部:", mylist)
    return

mylist = [1, 2, 3]
func(mylist)
print("函数外部:", mylist)
# 输出:
# 函数内部: [1, 2, 3, [4, 5, 6]]
# 函数外部: [1, 2, 3, [4, 5, 6]]

示例3的执行过程如下:首先定义了一个函数func,其中向mylist列表中添加一个新的列表[4, 5, 6],然后执行print("函数内部:", mylist)语句,输出修改后的列表。接着定义了列表mylist,将其值设为[1, 2,3],将mylist作为参数传递给func函数,执行func(mylist)语句,输出"函数内部: [1, 2, 3, [4, 5, 6]]"。最后执行print("函数外部:", mylist)语句,输出修改后的列表"函数外部: [1, 2, 3, [4, 5, 6]]"。

三、函数的参数

Python中的函数参数可以分为四种类型:必备参数、默认参数、可变参数和关键字参数。

1. 必备参数

必备参数是指必须要传递给函数的参数,如果没有传递这些参数,函数调用会失败。

# 示例4
def print_info(name, age):
    print("Name: ", name)
    print("Age: ", age)
    return

print_info("Tom", 18)
# 输出:
# Name:  Tom
# Age:  18

上述示例定义了一个函数print_info,其中包含两个必备参数nameage,并输出这两个参数的值。执行print_info("Tom", 18)语句,输出"Name: Tom"和"Age: 18"。

2. 默认参数

默认参数是指在函数定义时,为参数指定默认值,如果没有传递该参数,则使用默认值。

# 示例5
def print_info(name, age=18):
    print("Name: ", name)
    print("Age: ", age)
    return

print_info("Tom")
# 输出:
# Name:  Tom
# Age:  18

上述示例定义了一个函数print_info,其中age参数指定了默认值18,如果在函数调用时没有传递这个参数,则使用默认值18。执行print_info("Tom")语句,输出"Name: Tom"和"Age: 18"。

3. 可变参数

可变参数是指函数传递的参数个数不确定,可以是任意个。Python中可变参数可以使用星号*表示。

# 示例6
def sum_num(*args):
    sum = 0
    for i in args:
        sum += i
    return sum

print(sum_num(1, 2, 3))
# 输出:6
print(sum_num(1, 2, 3, 4, 5))
# 输出:15

上述示例定义了一个函数sum_num,其中可变参数*args将传入的所有参数封装成一个元组。函数体内通过循环遍历所有参数,将它们相加并返回结果。

4. 关键字参数

关键字参数是指传递给函数的参数在函数内部通过参数名来匹配。Python中,关键字参数可以使用两个星号**表示。

# 示例7
def print_info(name, age):
    print("Name: ", name)
    print("Age: ", age)
    return

print_info(name="Tom", age=18)
# 输出:
# Name: Tom
# Age: 18

上述示例定义了一个函数print_info,其中的参数都是必备参数。通过在参数名前面加上name=或者age=将其变成关键字参数,这样在调用函数时就可以按照参数名来传递参数。注意:如果同时存在可变参数和关键字参数,则可变参数必须放在关键字参数的前面。

四、函数的注释

Python中可以为函数添加注释,提高代码的可读性。注释可以在函数定义内部的字符串中,称为docstring,也可以在函数定义后面通过#来添加单行注释。

# 示例8
def add(a, b):
    """
    add(a, b) -> int

    返回a和b的和。
    """
    result = a + b
    return result

print(add(1, 2))
# 输出:3

上述示例定义了一个函数add,其中第一行用字符串格式书写add(a, b) -> int,指定了函数的参数和返回值。在接下来的若干行中用多行字符串表示函数的功能和特点。

注意:可使用help()函数来查看函数的注释。

# 示例9
help(add)
# 输出:
# Help on function add in module __main__:
#
# add(a, b)
#     add(a, b) -> int
#     
#     返回a和b的和。

总结

Python中函数的定义非常简单,可以通过基本语法来定义函数,对于参数传递、可变参数、关键字参数等需要灵活运用。在定义函数时,注释也很重要,可以提高代码的可读性和可维护性。下面是所有示例的代码。

# 示例1
def add(a, b):
    result = a + b
    return result

print(add(1, 2))
# 输出:3


# 示例2
def func(a):
    a = 3
    print("函数内部:", a)
    return

x = 5
func(x)
print("函数外部:", x)
# 输出:
# 函数内部: 3
# 函数外部: 5


# 示例3
def func(mylist):
    mylist.append([4, 5, 6])
    print("函数内部:", mylist)
    return

mylist = [1, 2, 3]
func(mylist)
print("函数外部:", mylist)
# 输出:
# 函数内部: [1, 2, 3, [4, 5, 6]]
# 函数外部: [1, 2, 3, [4, 5, 6]]


# 示例4
def print_info(name, age):
    print("Name: ", name)
    print("Age: ", age)
    return

print_info("Tom", 18)
# 输出:
# Name:  Tom
# Age:  18


# 示例5
def print_info(name, age=18):
    print("Name: ", name)
    print("Age: ", age)
    return

print_info("Tom")
# 输出:
# Name:  Tom
# Age:  18


# 示例6
def sum_num(*args):
    sum = 0
    for i in args:
        sum += i
    return sum

print(sum_num(1, 2, 3))
# 输出:6
print(sum_num(1, 2, 3, 4, 5))
# 输出:15


# 示例7
def print_info(name, age):
    print("Name: ", name)
    print("Age: ", age)
    return

print_info(name="Tom", age=18)
# 输出:
# Name: Tom
# Age: 18


# 示例8
def add(a, b):
    """
    add(a, b) -> int

    返回a和b的和。
    """
    result = a + b
    return result

print(add(1, 2))
# 输出:3


# 示例9
help(add)
# 输出:
# Help on function add in module __main__:
#
# add(a, b)
#     add(a, b) -> int
#     
#     返回a和b的和。