我是 Jerry,一个正在学 Python 的普通人。函数是 Python 编程的核心基础,也是代码复用、逻辑简化的关键工具。本篇从函数概述、基础使用、参数类型、匿名函数四个维度,用最通俗的语言+全新示例,带你轻松掌握函数基础。
1. 函数概述
1.1 为什么使用函数
在编写代码时,我们经常会遇到一些问题:
代码重复编写,冗余度高
后期修改功能时,需要改动多处,维护成本高
代码可读性差,别人不容易理解
函数就是解决这些问题的最佳方案:
本质:对特定功能的代码进行封装
核心:一次定义,多次调用,避免重复造轮子
函数的优点:
简化代码结构,提升开发效率
提高代码复用性,减少重复代码
增强代码可读性与可维护性
功能模块化,便于分工开发
💡 开发建议:但凡涉及独立功能,优先使用函数实现。
1.2 认识函数
我们通过一个简单需求,直观认识函数:
需求:计算圆的面积公式:S = πr²
# 导入数学模块,获取圆周率import math# 定义计算圆面积的函数def circle_area(r):return math.pi*r*r
1.3 定义函数
Python 中使用 def 关键字定义函数,这是固定语法规范。
标准语法:
def 函数名(参数1, 参数2, ...):"""函数说明文档(可选)"""函数体return 返回值# 可选
语法说明:
| 组成部分 | 说明 |
|---|
def | 关键字,define 的缩写,表示定义函数 |
| 函数名 | 遵循标识符命名规则,见名知意 |
() | 固定格式,包裹参数列表 |
| 形参 | 函数定义时的参数,本质是变量,可空 |
| 函数体 | 封装的功能代码 |
return | 返回结果给调用者,无返回值默认返回 None |
⚠️ 注意:函数必须先定义,后调用,调用不能在定义上方。
# 错误示例:调用在定义前# test() # 报错:name 'test' is not defineddef test():print("你好!")
1.4 函数调用
函数定义后不会自动执行,必须调用才会运行。
调用格式:函数名()
# 定义函数def test():print("hello python!")# 调用函数test()test()test()调用规则:
函数定义后不调用不执行
必须先定义,后调用
一个函数可以被多次调用
同名函数,后面定义的会覆盖前面的
2. 使用函数
根据参数、返回值、定义方式,函数可分为多种类型:
内置函数 / 自定义函数
无参函数 / 有参函数
有名函数 / 匿名函数
无返回值函数 / 有返回值函数
2.1 无参数的函数
适用于功能固定,不需要外部数据的场景:
# 定义无参函数def greet():print("欢迎学习 Python 函数!")# 调用greet()输出:
欢迎学习 Python 函数!
2.2 有参数的函数
需要接收外部数据参与运算,分为形参和实参:
# 定义:a、b 是形参def add_num(a, b):print(a+b)# 调用:10、20 是实参add_num(10, 20)add_num(55, 45)
输出:
30100
2.3 无返回值的函数
函数执行完成后,不向外返回数据,默认返回 None:
# 无返回值函数def say_hello():print("你好,我是无返回值函数!")# 调用result=say_hello()# 打印返回值,结果为 Noneprint(result)输出:
你好,我是无返回值函数!None
2.4 有返回值的函数
使用 return 关键字向外返回数据,支持返回单个 / 多个值:
# 1. 返回单个值def get_info():return"我是有返回值的函数"# 接收返回值res=get_info()print(res)# 2. 返回多个值(自动封装为元组)def get_multi_data():print("开始执行函数")return10, 20, 30# return 下方代码不会执行print("执行结束")data=get_multi_data()print(data) # (10, 20, 30)# 3. 空 return,返回 Nonedef empty_return():returnprint(empty_return()) # None输出:
我是有返回值的函数开始执行函数(10, 20, 30)None
return 核心规则:
可以返回 1 个或多个数据,多个数据以元组形式返回
return 执行后,函数立即结束,后续代码不执行
无 return 或空 return,默认返回 None
2.5 函数嵌套调用
函数之间可以相互调用,形成嵌套执行关系:
# 函数嵌套调用def func1():func2()print("执行函数1")def func2():func3()print("执行函数2")def func3():print("执行函数3")# 调用最外层函数func1()输出:
执行函数3执行函数2执行函数1
执行顺序:func1 → func2 → func3 → 打印函数3 → 打印函数2 → 打印函数1
2.6 函数中的参数
参数是函数与外部数据交互的桥梁:
形参:定义函数时的参数,接收数据
实参:调用函数时的参数,传递数据
传参:实参给形参赋值的过程
# 定义函数:num1、num2 为形参def get_max(num1, num2):if num1>num2:return num1else:return num2# 调用函数:18、35 为实参max_num=get_max(18, 35)print(max_num)
输出:
35
2.7 参数的类型
① 必需参数(位置参数)
调用函数时,必须按照顺序、数量传参,否则报错:
def student_info(name, age):print(f"姓名:{name},年龄:{age}")# 正确传参student_info("小明", 18)# 错误传参:顺序/类型不匹配# student_info(18, "小明")输出:
姓名:小明,年龄:18
② 关键字参数
通过参数名传参,顺序可以任意调整:
def student_info(name, age):print(f"姓名:{name},年龄:{age}")# 关键字传参,顺序无关student_info(age=20, name="小红")输出:
姓名:小红,年龄:20
③ 默认参数
定义函数时给参数设置默认值,调用时可省略该参数:
# num2 设置默认值 10def get_sum(num1, num2=10):print(num1+num2)# 不传 num2,使用默认值get_sum(20)# 传参,覆盖默认值get_sum(20, 30)
输出:
3050
⚠️ 注意:默认参数必须放在参数列表最后面。
④ 不定长参数(可变参数)
处理不确定数量的参数,分为两种:
# *args:接收多个位置参数def func_args(*args):print(args)func_args(1, 2, 3, "Python", True)# **kwargs:接收多个关键字参数def func_kwargs(**kwargs):print(kwargs)func_kwargs(name="小刚", age=22, city="上海")
输出:
(1, 2, 3, 'Python', True){'name': '小刚', 'age': 22, 'city': '上海'}
3. 匿名函数
使用 lambda 关键字创建一行式简易函数,无需定义函数名,称为匿名函数。
特点:
仅为单行表达式,语法简洁
自带返回值,无需写 return
适合简单逻辑,不适合复杂功能
语法:lambda 参数列表: 表达式
# 普通函数:计算平方def square(n):return n**2print(square(4))# 匿名函数实现相同功能lambda_square=lambda n: n**2print(lambda_square(4))# 多参数匿名函数add=lambda a, b: a+bprint(add(10, 20))
输出:
161630
本篇总结
| 知识点 | 核心内容 |
|---|
| 函数的作用 | 代码复用、简化结构、提升可维护性 |
| 函数四要素 | def、函数名、参数、return |
| 基础分类 | 无参/有参、无返回值/有返回值、嵌套调用 |
| 参数类型 | 必需参数、关键字参数、默认参数、不定长参数 |
| 匿名函数 | lambda 快速定义简单函数,一行搞定 |
下篇继续讲解函数进阶:变量作用域、递归函数、实战项目应用,教你如何封装自己的代码。
关注「AI 学习成长记」,我踩过的坑你别再踩。