编程学习网 > 编程语言 > Python > Python 函数教程:值传递与引用传递!
2024
05-14

Python 函数教程:值传递与引用传递!

在Python中,def是一个关键字,用于定义一个新的函数。函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。使用函数可以使代码更加模块化、易于理解、易于调试和维护。


什么是函数?
想象一下,你在搭建一座乐高城堡,每次需要窗户时,都从零开始拼凑。这不仅费时,而且效率低下。如果预先设计一个“造窗”模块,需要时直接调用,岂不更高效?在编程中,这个“模块”就是函数。

函数是一段封装好的、可重复使用的代码块,它执行特定任务并可能返回一个结果。定义函数可以减少代码重复,使程序更易于阅读和维护。

如何定义和调用函数?

在Python中,我们使用def关键字来定义函数,后面跟着函数名和圆括号,圆括号内可以有参数(也可以没有)。函数体以冒号起始,并且需要缩进。

# 定义一个简单的函数,用于打印问候语
def say_hello(name):
    """向指定的人问好"""
    print(f"Hello, {name}!")

# 调用函数
say_hello("山海摸鱼人")  # 输出: Hello, 山海摸鱼人
基本语法
定义一个函数的基本语法如下:

def function_name(parameters):
    """
    这里是文档字符串(docstring),用于描述函数的功能、参数和返回值。
    """
    # 函数体:执行具体任务的代码
    # 可以有多行代码
    
    # 如果函数需要返回值,可以使用return语句
    return result
function_name 是你给函数取的名字,应遵循Python的命名规则,即小写字母和下划线的组合,且首字母不应为数字。
parameters 是函数的参数列表,可以有0个、1个或多个参数,参数之间用逗号分隔。如果函数不需要任何参数,也要保留一对空的圆括号。
文档字符串(docstring)位于函数定义的开头,是对函数的说明,是好习惯,但不是强制性的。
函数体包含了实际执行的代码,这部分代码需要缩进。
return 语句用于从函数中返回一个值给调用者。如果没有return语句,函数默认返回None。一个函数可以有多个return语句,但是执行到第一个return时函数就会结束。
示例
下面是一个简单的函数示例,该函数接收两个参数并返回它们的和:

def add_numbers(a, b):
    """
    返回两个数的和。
    
    参数:
    a -- 第一个加数
    b -- 第二个加数
    
    返回:
    两个数的和
    """
    result = a + b
    return result

# 调用函数
sum_result = add_numbers(3, 4)
print(sum_result)  # 输出: 7
注意事项
作用域:函数内部定义的变量(局部变量)只在函数内部可见,不会影响到函数外部的同名变量,除非你使用了全局变量声明(如global关键字)。
默认参数:在定义函数时,可以为参数指定默认值,这样调用函数时可以省略这些参数。
关键字参数:调用函数时,可以通过参数名指定参数值,这在参数多或者想明确指定某些参数值时非常有用。
不定长参数:可以使用*args和**kwargs来让函数接受任意数量的位置参数和关键字参数。
通过灵活运用def定义函数,你可以构建复杂而有条理的程序,让代码更易于管理和扩展。

形式参数与实际参数
当你定义一个函数时,函数内的参数称为形式参数(或简称形参),它们是占位符,代表将来调用函数时传入的具体值。实际调用函数时传递给这些形参的值被称为实际参数(或简称实参)。

# 形式参数示例
def add_numbers(a, b):  # a 和 b 是形式参数
    return a + b

result = add_numbers(3, 5)  # 3 和 5 是实际参数
print(result)  # 输出: 8
值传递与引用传递
理解值传递和引用传递是深入Python函数机制的关键。

值传递:当函数接收的是不可变数据类型(如整数、浮点数、字符串、元组等)作为参数时,Python采用值传递。这意味着函数内部对参数的修改不会影响到原始数据。
def modify_num(num):
    num += 10  # 尝试修改num的值

x = 20
modify_num(x)
print(x)  # 输出: 20,因为整数是不可变的,所以x的值未改变
引用传递:对于可变数据类型(如列表、字典、集合等),虽然Python也是值传递,但传递的是对象的引用(内存地址),因此在函数内部修改这类参数会影响到原始数据。
def append_item(lst):
    lst.append("山海摸鱼人")  # 修改列表内容

my_list = [1, 2, 3]
append_item(my_list)
print(my_list)  # 输出: [1, 2, 3, '山海摸鱼人']
实际应用
掌握函数和参数传递机制后,我们可以编写更高效、复用性更强的代码。

以下是一个提升工作效率的例子,利用函数处理日常办公中的数据清洗任务。

假设你经常需要从一个包含各种信息的列表中筛选出满足特定条件的记录,比如找出所有工资高于某个阈值的员工信息。

# 员工信息列表,每个元素是一个包含姓名和工资的元组
employees = [("张三", 8000), ("李四", 9500), ("王五", 7000)]

# 定义筛选函数,根据工资阈值过滤员工
def filter_employees_by_salary(employees_list, threshold):
    """
    筛选工资高于指定阈值的员工
    :param employees_list: 员工信息列表
    :param threshold: 工资阈值
    :return: 筛选后的员工列表
    """
    return [emp for emp in employees_list if emp[1] > threshold]

# 调用函数,筛选出工资高于8500的员工
high_salary_employees = filter_employees_by_salary(employees, 8500)
print(high_salary_employees)  # 输出: [('李四', 9500)]
通过定义filter_employees_by_salary函数,我们不仅实现了代码的重用,还使得数据处理逻辑更加清晰。
以上就是Python 函数教程:值传递与引用传递!的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取