Python 函数详解:从入门到进阶
在 Python 编程中,函数是最重要的基础之一。写得多了你会发现:不会封装函数的代码,就像没有模块化的积木,既难维护又难复用。本文将系统介绍函数的概念、参数、变量作用域、模块导入、递归以及匿名函数 lambda,配合示例代码,帮助你从零到熟练使用函数。
一、函数基础:为什么要用函数?
1.1 函数的介绍与定义
函数是什么?
- 一段可以被重复调用的代码块,给它起一个名字,需要时只要“叫它的名字”就能执行。
- 把功能封装成函数,可以让代码更清晰、可复用、易维护。
函数定义语法:
def 函数名(参数列表):
# 函数体
...
def say_hello():
print("你好,欢迎学习 Python 函数!")
# 调用函数
say_hello()
1.2 函数的调用
定义函数只是把代码“存起来”,要执行必须调用它。
def greet(name):
print(f"你好,{name}!")
greet("小明")
greet("小红")
这里 greet("小明") 和 greet("小红") 就是两次调用,同一套代码,多次复用。
1.3 函数的复用
函数的最大价值之一,就是复用逻辑。
def calc_bmi(weight, height):
"""根据体重(kg)和身高(m)计算 BMI"""
bmi = weight / (height ** 2)
print(f"你的 BMI 为:{bmi:.2f}")
calc_bmi(60, 1.7)
calc_bmi(75, 1.8)
一旦逻辑写好,哪怕你要计算 100 个人的 BMI,也只需要不断调用 calc_bmi,而不是复制粘贴一大堆代码。
1.4 return 返回值
return 有两个核心作用:
- 结束函数执行
-
把结果“返回”给调用者
def add(a, b): result = a + b return result sum1 = add(3, 5) sum2 = add(10, 20) print(sum1, sum2) # 8 30如果函数中没有写 return,Python 会默认返回 None:
def foo(): print("只打印,不返回值") res = foo() print(res) # 输出:None二、函数的参数:让函数更通用
2.1 实参和形参
- 形参(形式参数):在定义函数时括号里的参数,是“占位符”。
-
实参(实际参数):在调用函数时传入的实际值。
def power(base, exponent): # base、exponent 是形参 return base ** exponent result = power(2, 3) # 2、3 是实参 print(result) # 82.2 默认参数
给参数设置默认值,可以让函数更灵活。
def greet(name="游客"): print(f"你好,{name}!") greet() # 使用默认值,输出:你好,游客! greet("小王") # 使用传入的值,输出:你好,小王!适用场景:有些参数大多数情况下是固定的,偶尔才需要修改,这时用默认参数就很友好。
2.3 可变参数:接收不定数量的值
有时候你并不知道会传入多少个参数,可以使用可变参数。
def my_sum(*args): # args 是一个元组 total = 0 for x in args: total += x return total print(my_sum(1, 2, 3)) # 6 print(my_sum(5, 10, 15, 20)) # 50可变参数常用于:配置项、日志、通用工具函数等场景。
-
2.4 关键字参数
位置参数要按照顺序传入,关键字参数则不受顺序限制,更清晰可读。
def describe_person(name, age, city): print(f"{name},{age}岁,居住在{city}") # 位置参数 describe_person("小李", 20, "上海") # 关键字参数(顺序可变) describe_person(age=25, city="北京", name="小王")
在较复杂的函数调用中,推荐多使用关键字参数,能显著提升可读性。
三、变量作用范围:局部还是全局?
3.1 全局变量的问题
- 全局变量:在函数外部定义,整个模块都能访问。
-
问题在于:谁在修改它?什么时候被改了? 难以追踪。
count = 0 # 全局变量 def show_count(): print("当前 count:", count) show_count() print("外部 count:", count)3.2 使用 global 修改全局变量
如果要在函数中修改全局变量,需要声明 global:
count = 0 def increase(): global count count += 1 print("函数内部 count:", count) increase() increase() print("函数外部最终 count:", count)3.3 可变类型带来的影响
对于可变类型(如列表、字典),即使不使用 global,在函数内部也能改变外部的数据内容
nums = [1, 2, 3] def add_number(lst): lst.append(4) # 修改的是同一个列表对象 print("函数内部:", lst) add_number(nums) print("函数外部:", nums) # [1, 2, 3, 4]四、模块与函数:分文件管理代码
当代码越来越多时,我们会把不同功能拆成不同文件,这些文件在 Python 中就叫做模块(module)。
假设当前目录中有一个 utils.py:
# utils.py def add(a, b): return a + b4.1 导入整个模块
import utils result = utils.add(3, 5) # 通过“模块名.函数名”调用 print(result)
4.2 只导入指定函数
from utils import add print(add(10, 20))
4.3 导入模块中的全部函数
from utils import * print(add(1, 2))
4.4 给模块或函数设置别名
为了减少输入或者避免重名,可以使用 as 起别名:
import utils as u from utils import add as a print(u.add(2, 3)) print(a(5, 6))
4.5 __name__ 属性与主程序入口
每个 Python 文件在执行时,内部都有一个变量 __name__:
- 如果是直接运行该文件:__name__ == "__main__"
- 如果是被其他文件 import:__name__ 等于模块名
-
常见用法:
# demo.py def main(): print("这是主函数") if __name__ == "__main__": # 只有直接运行 demo.py 时才执行这里 main()六、匿名函数 lambda:一行搞定的小函数
匿名函数(lambda),顾名思义:没有名字的函数。
它适合写一些简单的一行表达式,通常配合 sorted、map、filter 等高阶函数使用。
add = lambda a, b: a + b print(add(3, 4)) # 7
效果等价于:
def add(a, b): return a + b总结:
-
函数是 Python 编程的“基本功”:
- 用函数封装逻辑,让代码更清晰、可复用;
- 用好参数和返回值,减少对全局变量的依赖;
- 学会拆分模块、合理导入函数,让项目结构更合理;
- 在合适场景下使用递归和 lambda,可以让代码更优雅
本站大部分文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了您的权益请来信告知我们删除。邮箱:1451803763@qq.com