Python入门学习教程:第 10 章 函数
10.1 什么是函数?
在编程中,函数是一段具有特定功能的可重用代码块。它就像一个 “工具”,接收输入(可选),执行特定操作,然后返回输出(可选)。
想象一下,如果你需要多次计算两个数的和,每次都编写a + b的代码会很繁琐。这时可以定义一个 “求和函数”,每次需要计算时直接调用这个函数即可。函数的主要作用是:
- 实现代码复用(避免重复编写相同代码);
- 使程序结构更清晰(将复杂逻辑拆分为多个函数);
- 便于维护和修改(只需修改函数内部代码,所有调用处都会生效)。
10.2 函数的定义与调用
10.2.1 定义函数
在 Python 中,定义函数使用def关键字,基本语法如下:
def 函数名(参数列表):
"""函数文档字符串(可选,用于描述函数功能)"""
函数体(实现函数功能的代码块)
return 返回值(可选)
- 函数名:遵循变量命名规则,应简洁明了地反映函数功能。
- 参数列表:函数接收的输入,多个参数用逗号分隔(可以为空)。
- 函数体:缩进的代码块,实现函数的具体功能。
- return:用于返回函数的输出结果,执行到return后函数会立即结束(如果没有return,函数默认返回None)。
示例:定义一个计算两个数之和的函数
def add(a, b):
"""计算两个数的和并返回结果"""
result = a + b
return result
10.2.2 调用函数
定义函数后,需要通过 “函数名 (参数)” 的方式调用它,才能执行函数体中的代码。
示例:调用上面定义的add函数
# 调用add函数,传入参数3和5
sum_result = add(3, 5)
print(sum_result) # 输出:8
# 直接打印函数返回值
print(add(10, 20)) # 输出:30
示例:定义一个无参数、无返回值的函数
def say_hello():
"""打印问候语"""
print("Hello, Python!")
# 调用函数
say_hello() # 输出:Hello, Python!
10.3 函数的参数
函数的参数用于接收外部传入的数据,使函数更灵活。Python 中的参数类型主要有以下几种:
10.3.1 位置参数
位置参数是最基本的参数类型,调用函数时,实参(传入的具体值)的顺序必须与形参(函数定义时的参数)的顺序一致。
示例:
def introduce(name, age):
"""介绍姓名和年龄"""
print(f"我叫{name},今年{age}岁。")
# 按位置传入参数(name对应"张三",age对应18)
introduce("张三", 18) # 输出:我叫张三,今年18岁。
# 顺序错误会导致结果错误
introduce(18, "张三") # 输出:我叫18,今年张三岁。(不符合预期)
10.3.2 关键字参数
关键字参数允许在调用函数时,通过 “参数名 = 值” 的方式指定参数,无需严格按照位置顺序传入,使代码更清晰。
示例:
def introduce(name, age):
"""介绍姓名和年龄"""
print(f"我叫{name},今年{age}岁。")
# 使用关键字参数调用
introduce(name="李四", age=19) # 输出:我叫李四,今年19岁。
# 交换关键字参数的顺序,结果仍正确
introduce(age=20, name="王五") # 输出:我叫王五,今年20岁。
位置参数和关键字参数可以混合使用,但位置参数必须放在关键字参数前面:
introduce("赵六", age=21) # 正确:位置参数在前,关键字参数在后
# introduce(name="孙七", 22) # 错误:关键字参数不能放在位置参数前面
10.3.3 默认参数
默认参数是在定义函数时为参数指定默认值,调用函数时如果不传入该参数,则使用默认值。默认参数必须放在位置参数后面。
示例:
def introduce(name, age=18): # age的默认值为18
"""介绍姓名和年龄(默认18岁)"""
print(f"我叫{name},今年{age}岁。")
# 传入name,使用age的默认值
introduce("小明") # 输出:我叫小明,今年18岁。
# 同时传入name和age,覆盖默认值
introduce("小红", 20) # 输出:我叫小红,今年20岁。
10.3.4 可变参数
可变参数用于处理参数数量不确定的情况,分为两种:
- *args:接收任意数量的位置参数,返回一个元组。
- **kwargs:接收任意数量的关键字参数,返回一个字典。
示例 1:*args的使用
def sum_numbers(*args):
"""计算任意数量数字的和"""
total = 0
for num in args:
total += num
return total
# 传入3个参数
print(sum_numbers(1, 2, 3)) # 输出:6
# 传入5个参数
print(sum_numbers(10, 20, 30, 40, 50)) # 输出:150
# 传入列表(需要在列表前加*,将列表元素拆分为位置参数)
numbers = [1, 2, 3, 4]
print(sum_numbers(*numbers)) # 输出:10
示例 2:**kwargs的使用
def print_info(** kwargs):
"""打印任意数量的关键字参数信息"""
for key, value in kwargs.items():
print(f"{key}: {value}")
# 传入2个关键字参数
print_info(name="张三", age=18)
# 输出:
# name: 张三
# age: 18
# 传入字典(需要在字典前加**,将字典键值对拆分为关键字参数)
person = {"name": "李四", "gender": "男", "score": 90}
print_info(** person)
# 输出:
# name: 李四
# gender: 男
# score: 90
10.4 函数的返回值
函数的返回值是函数执行完毕后返回给调用者的结果,通过return语句实现。
10.4.1 基本用法
def multiply(a, b):
"""计算两个数的乘积并返回"""
return a * b # 返回乘积结果
print(multiply(3, 4)) # 输出:12
10.4.2 返回多个值
Python 允许函数通过return语句返回多个值,多个值之间用逗号分隔,返回的其实是一个元组。
示例:
def get_name_and_age():
"""返回姓名和年龄"""
name = "张三"
age = 18
return name, age # 相当于返回元组(name, age)
# 接收多个返回值
person_name, person_age = get_name_and_age()
print(person_name) # 输出:张三
print(person_age) # 输出:18
# 作为元组接收
result = get_name_and_age()
print(result) # 输出:('张三', 18)
10.4.3 提前结束函数
return语句会使函数立即结束,其后的代码不会执行。
示例:
def check_positive(num):
"""检查数字是否为正数"""
if num > 0:
return "正数"
print("这句代码在num>0时不会执行") # 当num>0时,此句不会执行
return "非正数"
print(check_positive(5)) # 输出:正数(未执行print语句)
print(check_positive(-3)) # 输出:非正数(执行了print语句)
10.5 函数的嵌套
函数的嵌套是指在一个函数内部定义另一个函数。内部函数只能在外部函数内部调用,外部无法直接访问。
示例:
def outer_function():
"""外部函数"""
print("这是外部函数")
def inner_function():
"""内部函数"""
print("这是内部函数")
# 在外部函数内部调用内部函数
inner_function()
# 调用外部函数
outer_function()
# 输出:
# 这是外部函数
# 这是内部函数
# 尝试直接调用内部函数(会报错)
# inner_function() # 会报错:NameError: name 'inner_function' is not defined
函数嵌套的主要作用是实现 “封装”,将内部函数的逻辑隐藏在外部函数中,只通过外部函数暴露功能。
10.6 函数的作用域
作用域是指变量的可访问范围。Python 中的变量作用域主要分为:
- 局部变量:在函数内部定义的变量,只能在函数内部访问,函数执行结束后自动销毁。
- 全局变量:在函数外部定义的变量,在整个程序中都可以访问(函数内部可以访问全局变量,但修改全局变量需要使用global关键字声明)。
示例:
# 全局变量
global_var = "我是全局变量"
def my_function():
# 局部变量
local_var = "我是局部变量"
print(local_var) # 正确:函数内部可以访问局部变量
print(global_var) # 正确:函数内部可以访问全局变量
# 修改全局变量(需要用global声明)
global global_var
global_var = "全局变量被修改了"
# 调用函数
my_function()
# 输出:
# 我是局部变量
# 我是全局变量
print(global_var) # 输出:全局变量被修改了(全局变量已被函数修改)
# 尝试访问局部变量(会报错)
# print(local_var) # 会报错:NameError: name 'local_var' is not defined
10.7 匿名函数(lambda)
匿名函数是一种不需要定义函数名的简洁函数,使用lambda关键字定义,语法如下:
lambda 参数列表: 表达式
匿名函数的特点:
- 只能包含一个表达式,表达式的结果就是函数的返回值;
- 不能包含复杂的代码块(如循环、条件语句等,简单的条件表达式可以);
- 通常用于需要临时定义简单函数的场景(如作为其他函数的参数)。
示例:
# 定义一个匿名函数(计算两个数的和)
add = lambda a, b: a + b
print(add(3, 5)) # 输出:8
# 匿名函数作为sorted()函数的参数(按元素的第二个值排序)
pairs = [(1, 3), (2, 1), (3, 2)]
# sorted()函数的key参数需要一个函数,用于指定排序依据
sorted_pairs = sorted(pairs, key=lambda x: x[1])
print(sorted_pairs) # 输出:[(2, 1), (3, 2), (1, 3)]
10.8 示例:函数的综合应用
实现一个简易的计算器,支持加、减、乘、除四种运算。
def add(a, b):
"""加法"""
return a + b
def subtract(a, b):
"""减法"""
return a - b
def multiply(a, b):
"""乘法"""
return a * b
def divide(a, b):
"""除法(处理除数为0的情况)"""
if b == 0:
return "错误:除数不能为0"
return a / b
def calculator():
"""简易计算器主函数"""
print("简易计算器(支持 + - * /)")
# 获取用户输入
num1 = float(input("请输入第一个数字:"))
operator = input("请输入运算符(+ - * /):")
num2 = float(input("请输入第二个数字:"))
# 根据运算符调用对应的函数
if operator == "+":
result = add(num1, num2)
elif operator == "-":
result = subtract(num1, num2)
elif operator == "*":
result = multiply(num1, num2)
elif operator == "/":
result = divide(num1, num2)
else:
result = "错误:不支持的运算符"
# 输出结果
print(f"结果:{result}")
# 运行计算器
calculator()
运行示例:
简易计算器(支持 + - * /)
请输入第一个数字:10
请输入运算符(+ - * /):*
请输入第二个数字:5
结果:50.0
10.9 小结
本章我们学习了 Python 中的函数,包括函数的定义与调用、参数类型(位置参数、关键字参数、默认参数、可变参数)、返回值、函数的嵌套、作用域以及匿名函数(lambda)。
函数是 Python 编程中实现代码复用和模块化的核心工具,合理使用函数可以使程序结构更清晰、更易于维护。在实际开发中,我们应该将复杂的逻辑拆分为多个功能单一的函数,提高代码的可读性和复用性。
下一章,我们将学习 Python 中的文件操作,包括文件的打开、读取、写入和关闭等。