函数是 python 编程的核心组成部分,它通过封装特定功能实现代码复用,让程序结构更清晰、逻辑更严谨。本文基于实例代码,全面讲解 python 函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧。
一、函数的基本概念与作用
函数本质是封装特定功能的代码块,如同一个 "黑匣子"—— 输入参数后,通过内部逻辑处理,最终输出结果。其核心价值在于:
- 代码复用:避免重复编写相同逻辑
- 模块化:将复杂问题拆解为多个独立功能
- 可维护性:单一功能的修改不影响其他部分
"""
函数作用:
封装一个特定的功能,相当一个黑匣子
代码功能复用
语法:
def 函数名(形参列表):
函数体
[return 返回值]
调用: res=函数名(实参列表)
没有返回值,不需要接收,如果接收,返回的是none
return作用:返回结果,跳出函数
"""二、函数的定义与调用
1. 无参函数
没有参数的函数,直接执行预设逻辑:
# 无参函数
def test():
print(123456)
# 调用
test() # 输出:123456适用于逻辑固定、无需外部输入的场景(如打印固定信息)。
2. 带参函数
需要接收外部参数的函数,灵活性更高。以下是计算aa到bb累加和的示例:
# 带参函数:计算aa到bb的总和
def add(aa, bb):
sum = 0
for i in range(aa, bb + 1):
sum += i
print(sum)
# 调用函数
a = int(input('请输入a:')) # 从用户输入获取参数
b = int(input('请输入b:'))
add(a, b) # 实参a、b传递给形参aa、bb- 形参:函数定义时的
aa、bb(形式参数,仅在函数内部有效) - 实参:函数调用时的
a、b(实际参数,将值传递给形参)
3. 带返回值的函数
通过return关键字返回处理结果,调用者可接收并进一步处理:
# 计算n的阶乘(n!)
def jiecheng(n):
cheng = 1
for i in range(1, n + 1):
cheng *= i
return cheng # 返回计算结果
# 调用并接收返回值
res1 = jiecheng(5) # 5! = 120
res2 = jiecheng(10) # 10! = 3628800
print(res1, res2) # 输出:120 3628800return的双重作用:返回结果 + 立即结束函数(其后代码不再执行)- 若函数无
return,调用后返回none
4. 函数嵌套调用
函数内部可以调用其他函数,实现复杂逻辑的拆解:
# 计算1! + 2! + ... + m!的总和
def add_cheng(m):
sum = 0
for i in range(1, m + 1):
sum += jiecheng(i) # 嵌套调用阶乘函数
print(sum)
# 调用
add_cheng(5) # 1!+2!+3!+4!+5! = 153
add_cheng(10) # 总和为4037913通过嵌套调用,将 "求阶乘" 和 "求和" 两个功能分离,代码更易理解和维护。
三、参数传递机制:值传递与引用传递
python 中参数传递的方式取决于数据类型,分为两种:
1. 值传递(基本数据类型)
对于int、float、str等不可变类型,传递的是值的副本,函数内部修改不影响外部变量:
def test(n):
n = n + 1 # 内部修改参数
print(n) # 输出:11
a = 10
test(a)
print(a) # 输出:10(外部变量未变)2. 引用传递(复杂数据类型)
对于list、dict、set等可变类型,传递的是内存地址,函数内部修改会影响外部变量:
def test2(lst):
lst[1] = 66 # 内部修改列表元素
print(lst) # 输出:[1, 66, 3]
ls = [1, 2, 3]
test2(ls)
print(ls[1]) # 输出:66(外部列表被修改)总结:不可变类型传递值,可变类型传递地址,这是 python 参数传递的核心特性。
四、变量作用域:全局变量与局部变量
变量的作用域指其可访问的范围,分为:
1. 局部变量
在函数内部定义的变量,仅在函数内部有效:
def test3():
a = 10 # 局部变量(仅test3内可访问)
print(a) # 输出:10
test3()
# print(a) # 报错:nameerror(外部无法访问)2. 全局变量
在函数外部定义的变量,可在所有函数中访问(但修改需声明):
b = 11 # 全局变量
m = 18 # 全局变量
def test3():
b = 20 # 定义同名局部变量(覆盖全局变量)
global m # 声明使用全局变量m
m += 10 # 修改全局变量
print(a, b, m) # 输出:10 20 28(a是局部变量,b是局部变量,m是全局变量)
test3()
print(b, m) # 输出:11 28(全局b未变,全局m已修改- 函数内部可直接使用全局变量,但修改全局变量需用
global声明 - 若局部变量与全局变量同名,函数内部优先使用局部变量
五、函数类型标注(type hints)
python 3.5 + 支持类型标注,通过注释指定参数和返回值的类型,增强代码可读性和可维护性:
"""
函数类型标注:
基本类型: int float str bool bytes
复杂类型: from typing import list,tuple,dict,set,union,iterable,sequence,any,callable
"""
from typing import list, union, callable, iterable, sequence
# 标注参数类型
def test(a: int, b: float, c: str, d: bool):
print(a, b, c, d)
test(1, 2.5, 'hello', true) # 符合类型标注的调用
# 复杂类型标注:list[union[int, float]]表示列表元素可为int或float
def test2(
a: list[union[int, float]], # 元素为int或float的列表
tt: callable, # 可调用对象(如函数)
c: union[int, str], # 可为int或str
d: iterable, # 可迭代对象(如列表、range)
e: sequence # 序列对象(如列表、元组)
):
tt() # 调用传入的函数
print(a, c, d, e)
def active():
print('函数作为参数')
test2([1, 2.5, 3], active, 2, [], range(10)) # 符合类型标注的调用
# 标注返回值类型
def test3(a: int, b: float) -> union[int, float]:
return a + b
print(test3(1, 2.5)) # 输出:3.5(符合返回值类型)注意:类型标注仅为提示,python 解释器不会强制检查(需借助第三方工具如mypy验证)。
六、总结
函数是 python 编程的基础工具,本文讲解的核心知识点包括:
- 函数的定义与调用:无参、带参、带返回值函数的使用
- 函数嵌套:通过调用其他函数实现复杂逻辑
- 参数传递:不可变类型值传递,可变类型引用传递
- 变量作用域:局部变量与全局变量的访问规则
- 类型标注:增强代码可读性的现代编程技巧
到此这篇关于python 函数详解:从基础语法到高级使用技巧的文章就介绍到这了,更多相关python 函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论