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 中的变量作用域主要分为:

  1. 局部变量:在函数内部定义的变量,只能在函数内部访问,函数执行结束后自动销毁。
  1. 全局变量:在函数外部定义的变量,在整个程序中都可以访问(函数内部可以访问全局变量,但修改全局变量需要使用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 中的文件操作,包括文件的打开、读取、写入和关闭等。