练习最大的收获就是先进行模仿,在发现问题,解决问题,最后掌握!
**上一篇文章题目:**Python基础(9):容器拆包和推导式讲解
链接: https://blog.csdn.net/2501_94250394/article/details/156398159?spm=1001.2014.3001.5501
前言
祝所有的小伙伴们元旦快乐,时间过得真快啊,转眼间就是2026年了,今天给大家分享26年的第一篇文章。给大家来个开胃小菜,介绍一下函数、嵌套和变量,下一篇博客给大家分享函数的进阶知识。旅程正式开启!
先偷瞄一眼:

一、Python中函数的作用与具体使用
1.1 函数有哪些作用
Python函数核心作用: 在Python实际开发中,使用函数不只有"代码重复使用"这一个目的,核心有两个:
-
代码重用:一次编写,多次调用,不用重复写相同代码。
-
模块化编程:以函数为核心,把复杂项目拆成独立小功能,代码更清晰、易维护。
1.2 什么是函数
简单来说,Python函数就是:有名字(可无名字)、独立完成特定功能的代码段,执行后可能返回一个结果。
具体拆解:
-
被命名的:多数函数有专属名字(方便调用),也存在无名字的匿名函数。
-
独立且功能专一:函数是独立代码块,只用来完成某一个特定操作,不能功能杂乱。
-
返回值:不少函数执行完毕后,会通过return关键字把执行结果反馈给调用它的位置。
1.3 函数的定义
基本语法:
python
def 函数名称([参数1, 参数2, ...]):
函数体
...
[return 返回值]
1.4 如何调用函数
在Python中,函数和变量一样,都是先定义后使用。
python
# 定义函数
def 函数名称([参数1, 参数2, ...]):
函数体
...
[return 返回值]
# 调用函数
函数名称(参数1, 参数2, ...)
具体案例:
python
# 无参数、无返回值的函数
# 定义函数:打印问候语
def say_hello():
print("你好呀!")
# 调用函数(执行函数内的代码)
say_hello()
# 有参数、有返回值的函数
# 定义函数:计算两个数的和
def add_num(a, b):
result = a + b # 函数体:执行求和逻辑
return result # 返回求和结果
# 调用函数,接收返回值
sum_result = add_num(3, 5)
print("3+5的结果是:", sum_result)
比如案例里面定义的两个函数,以函数二为例,比如下一次我想要使用函数计算,两数之和a + b,不需要在写一行代码,直接调用add_num(a, b),传入实参就行。a和b是形式参数,实际调用时需要传入具体数值。
拓展:
形式参数(形参):定义函数时括号内声明的参数,仅作为接收数据的占位符,无具体实际值,比如add_num(a, b)里面的a和b。
实际参数(实参):调用函数时括号内传入的具体数据或变量,用于给对应形参赋值,比如add_num(3, 5)里面的3和5。
1.5 return返回值的作用
注意: 函数的设计原则"高内聚、低耦合",函数执行完毕后,应该主动把数返回给调用处,而不应该都交由print()等函数直接输出。所以这时候我们就要介绍一下return。
1. return 的首要作用是将函数内部的执行结果(如计算结果、处理后的数据)传递到函数外部,供外部代码接收和使用。简单来说: 函数就像一个加工车间,return 就像车间的传送带,把车间里加工好的成品(执行结果)传送到车间外,供人取用。
2. return 还能在执行到它时立即终止函数的运行,函数中位于 return 之后的代码都不会再执行。
我们来具体研究一下
注意: 有return,函数返回具体有效数据供外部使用,无return函数仅默认返回空值None。
Q:如果一个函数如些两个return (如下所示),程序如何执行?
python
def return_num():
return 1
return 2
result = return_num()
print(result) #结果只执行 1
A:只执行了第一个return ,原因是因为return可以退出当前函数,导致return下方的代码不执行。
Q:如果一个函数要有多个返回值,该如何书写代码?
A:在Python中,理论上一个函数只能返回一个结果。但是如果我们要让一个函数可以同时返回多个结果 ,我们可以使用**return元组**的形式。
python
# 定义一个名为return_num的无参数函数
def return_num():
# 函数返回两个值1和2,Python中返回多个值时会自动打包成元组(tuple)类型
return 1, 2
# 调用函数return_num(),并将函数的返回值赋值给变量result
result = return_num()
# 打印变量result,输出结果为(1, 2)
print(result)
# 打印变量result的数据类型,输出结果为<class 'tuple'>,验证返回值是元组类型
print(type(result)) # <class 'tuple'>
Q:封装一个函数,参数有两个num1,num2,求两个数的四则运算结果
A:四则运算:加、减、乘、除
python
def size(num1, num2):
jia = num1 + num2
jian = num1 - num2
cheng = num1 * num2
chu = num1 / num2
return jia, jian, cheng, chu
# 调用size方法
print(size(20, 5))
1.6 说明文档是啥(了解)
函数说明文档(也叫docstring)是用三引号 包裹、写在函数内部第一行 的 "使用说明书 ",用来简要说明函数的功能、所需参数和返回结果,能让使用者不用查看函数内部代码就知道如何使用,还可通过help()函数或.__doc__属性快速查看这些信息。
python
# 定义带有最简说明文档的函数
def add(a, b):
"""计算两个数的和""" # 这就是最简单的函数说明文档(单行版)
return a + b
# 查看函数说明文档(两种最简方式)
# 方式1:用help()函数(查看格式更清晰)
help(add)
# 方式2:访问.__doc__属性(直接获取文档内容)
print(add.__doc__)
二、函数的嵌套及相应案例
2.1 什么是函数的嵌套
所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数 ,也可以说是**在一个函数(外层函数)的内部,去定义另一个函数(内层函数),**我们来详细了解一下。
2.2 基本语法
python
# 1. 定义外层函数
def 外层函数名([外层参数]):
# 2. 在外部函数体内,定义内层函数(只能在外层函数内使用/返回)
def 内层函数名([内层参数]):
内层函数体 # 内层函数的功能逻辑
# 3. 外层函数内可调用内层函数,或返回内层函数
内层函数调用/return 内层函数名
**注意:**内层函数默认只能在外层函数内部被调用,无法直接在外部全局作用域调用。
执行流程:
- 第一步:调用外层函数,启动流程只有主动调用外层函数,才会触发后续的内层函数相关操作;如果不调用外层函数,内层函数仅仅是 "定义在里面",不会被创建,更不会执行。
- 第二步:执行外层函数代码,先定义内层函数(不执行) 调用外层函数后,会从上到下 执行外层函数体的代码,当执行到 "def 内层函数 " 这一行时,只是完成内层函数的定义(创建内层函数),并不会立即执行内层函数的函数体。
- 第三步:外层函数调用内层函数,触发内层执行 外层函数继续往下执行,当遇到 "内层函数名 () "(内层函数调用语句)时 ,才会真正触发内层函数的执行,执行完内层函数的所有代码后,会返回到外层函数的调用位置,最后外层函数执行剩余代码(若有),整个流程结束。
案例:
python
# 1. 定义外层函数(仅定义,不执行)
def outer_func():
# 3. 执行到这里:定义内层函数(不执行内层代码)
def inner_func():
print("我是内层函数,被嵌套在外层函数里") # 4. 内层函数被调用时,才执行这行
# 4. 外层函数调用内层函数,触发内层执行
inner_func()
# 2. 调用外层函数,启动整个嵌套函数流程
outer_func()
对应执行步骤:
- 先执行
outer_func()(调用外层函数),启动流程; - 进入
outer_func()函数体,先执行def inner_func():,完成内层函数定义(此时不打印内容); - 接着执行
inner_func()(外层调用内层),触发内层函数执行; - 进入
inner_func()函数体,执行print语句,输出内容; - 内层函数执行完毕,返回外层函数;
- 外层函数无剩余代码,执行完毕,整个流程结束。
2.3 函数的具体应用案例
记得看注释,进行消化和吸收,或许就能看懂前面的内容了。
函数的应用案例:
python
# 需求实现:奇偶求和程序
# 核心功能:定义函数计算数字列表中偶数和、奇数和,返回包含两个和的列表,最终打印结果
# 1. 定义函数 calculate_sum(),参数 numbers_list 是待计算的数字列表(可以是整数/小数列表,此处专注整数场景)
def calculate_sum(numbers_list):
# 2. 初始化偶数和为0
# 原因:后续要对偶数进行累加运算,初始值设为0才能保证累加结果准确(若不初始化,直接累加会报错)
even_sum = 0
# 3. 初始化奇数和为0
# 原因:和偶数和初始化同理,为奇数的累加运算提供一个初始基准值
odd_sum = 0
# 4. 遍历数字列表 numbers_list 中的每一个元素,将当前元素赋值给变量 num
# 作用:逐个取出列表中的数字,以便后续判断其是偶数还是奇数,并进行对应累加
for num in numbers_list:
# 5. 检查当前数字 num 是否为偶数
# 判断逻辑:一个数对2取模(%)结果为0,说明该数能被2整除,即为偶数
if num % 2 == 0:
# 6. 如果是偶数,将该数字 num 累加到偶数和 even_sum 中
# 等价于 even_sum = even_sum + num,是Python中累加运算的简写形式
even_sum += num
else:
# 7. 如果不是偶数(即为奇数),将该数字 num 累加到奇数和 odd_sum 中
# 等价于 odd_sum = odd_sum + num,完成奇数的累加统计
odd_sum += num
# 8. 返回一个列表作为函数结果
# 列表第一个元素是偶数和 even_sum,第二个元素是奇数和 odd_sum,方便外部调用时按索引获取对应值
return [even_sum, odd_sum]
# 9. 定义一个测试用的整数列表 numbers
# 该列表包含多个整数(有偶数也有奇数),用于传入函数进行奇偶求和测试
numbers = [2, 5, 3, 7, 5, 7]
# 10. 调用 calculate_sum() 函数,将测试列表 numbers 作为参数传入
# 同时将函数返回的结果(奇偶和列表)赋值给变量 result,方便后续使用和打印
result = calculate_sum(numbers)
# 11. 使用 f-string 格式化输出结果
# result[0] 对应返回列表的第一个元素,即偶数的和;result[1] 对应返回列表的第二个元素,即奇数的和
# 格式化输出让结果展示更清晰,便于阅读
print(f"偶数的和是: {result[0]}, 奇数的和是: {result[1]}")
嵌套函数的案例:
python
# 案例功能:外层函数传入问候前缀,内层函数负责拼接并打印完整问候语
# 1. 定义外层函数:接收一个问候前缀参数(比如"你好"、"早上好")
def outer_greet(prefix):
# 2. 定义内层函数(嵌套在外层函数内部):接收一个姓名参数
# 内层函数可以直接使用外层函数的参数(prefix),这是嵌套函数的特性之一
def inner_greet(name):
# 内层函数功能:拼接前缀和姓名,打印完整问候语
print(f"{prefix},{name}!")
# 3. 外层函数内部调用内层函数(触发内层函数执行)
# 这里传入具体姓名,执行问候逻辑
inner_greet("小明")
inner_greet("小红")
# 4. 调用外层函数,传入具体的问候前缀,启动整个嵌套逻辑
print("--- 传入前缀'你好' ---")
outer_greet("你好")
print("\n--- 传入前缀'早上好' ---")
outer_greet("早上好")
注意:一定要注意缩进、缩进、缩进,不然会报错
三、解释变量的作用域
3.1 什么是变量的作用域
变量作用域指的是变量的作用范围(变量在哪里可用,在哪里不可用),主要分为两类:全局作用域与局部作用域。
其实作用域的划分比较简单,在函数内部定义范围 就称之为局部作用域 ,在函数外部(全局)定义范围 就是全局作用域
简化版:
python
# 全局作用域
def func():
# 局部作用域
全面版:
python
# 全局作用域:函数外部定义全局变量
global_var = "全局变量"
# 定义函数
def func():
# 局部作用域:函数内部定义局部变量
local_var = "局部变量"
# 局部内可访问全局变量和自身局部变量
print("内部访问全局:", global_var)
print("内部访问局部:", local_var)
# 全局作用域调用函数
func()
# 全局内可访问全局变量
print("外部访问全局:", global_var)
# 全局内无法访问局部变量(取消注释会报错)
# print("外部访问局部:", local_var)
3.2 局部变量与全局变量
在Python中,定义在函数外部的变量就称之为全局变量;定义在函数内部变量就称之为局部变量。
python
# 定义在函数外部的变量(全局变量)
num = 10
# 定义一个函数
def func():
# 函数体代码
# 定义在函数内部的变量(局部变量)
num = 100
3.3 变量作用域的作用范围
全局变量:在整个程序范围内都可以直接使用
python
str1 = 'hello'
# 定义一个函数
def func():
# 在函数内部调用全局变量str1
print(f'在局部作用域中调用str1变量:{str1}')
# 直接调用全局变量str1
print(f'在全局作用域中调用str1变量:{str1}')
# 调用func函数
func()
局部变量:在函数的调用过程中,开始定义,函数运行过程中生效,函数执行完毕后,销毁
python
# 定义一个名为func的无参数函数
def func():
# 在func函数内部定义一个局部变量num,该变量仅在func函数内部有效
num = 10
# 在局部作用域(func函数内)中访问并打印局部变量num的值
print(f'在局部作用域中调用num局部变量:{num}')
# 调用func函数,触发函数内部代码执行
func()
# 尝试在全局作用域(函数外部)中调用局部变量num
# 注意:该行代码会报错(NameError),因为局部变量num仅在func函数内有效,全局作用域无法访问
print(f'在全局作用域中调用num局部变量:{num}')
运行结果:

**注意:**全局变量可以在全局起作用,但是局部变量只能在函数内部进行调用,全局调用就会报错
3.4 global关键字的应用场景
Q:我们能不能在局部作用域中对全局变量进行修改呢?
python
# 定义全局变量num = 10
num = 10
# 定义一个函数func
def func():
# 尝试在局部作用域中修改全局变量
num = 20
# 调用函数func
func()
# 尝试访问全局变量num
print(num)
思考:结果是10,所以由运行结果可知,在函数体内部理论上是没有办法对全局变量进行修改的,所以一定要进行修改,必须使用global关键字。
python
# 定义全局变量num = 10
num = 10
# 定义一个函数func
def func():
# 尝试在局部作用域中修改全局变量
global num
num = 20
# 调用函数func
func()
# 尝试访问全局变量num
print(num)
注意: global关键字只是针对不可变数据类型的变量 进行修改操作(数值、字符串、布尔类型、元组类型),可变类型可以不加global关键字。
拓展:
可变类型(如列表、字典):可以原地修改自身内容(比如给列表加元素、改字典的键值),不会改变变量的 "引用"(变量还是指向原来的全局对象)。
不可变类型(如整数、字符串):无法原地修改,"修改" 本质是重新创建新对象并赋值 (比如num=10改成num=20,是让num指向新的整数对象),这会被 Python 默认当成 "定义局部变量"。
案例:
可变类型(列表)------ 不用global
python
# 全局可变类型(列表)
global_list = [1, 2]
def modify_list():
# 原地修改全局列表的内容(不是重新赋值变量)
global_list.append(3)
modify_list()
print(global_list) # 输出 [1,2,3](全局列表被成功修改)
不可变类型(整数)------ 需要global
python
# 全局不可变类型(整数)
global_num = 10
def modify_num():
# 若直接赋值,会被当成局部变量
# global_num = 20 # 不写global的话,这里是定义局部变量,不影响全局
# 要修改全局变量,必须加global
global global_num
global_num = 20
modify_num()
print(global_num) # 输出20(全局变量被修改)
四、总结
本来准备给小伙伴们来一点新年礼物,上一份小小的开胃菜,开始新的一年,没想过到有点多,但是满含爱意,希望大家别拒绝。希望大家看得时候,看看里面提到的注意事项和代码里面的注释内容。这些内容大家主要还是先了解,在后期不断练习的基础上慢慢掌握。
新的一年,小弟在这里祝大家,心想事成、万事如意、财源滚滚、岁岁平安......
上述内容会根据大家的评论和实际情况进行实时更新和改进。
麻烦小伙伴们动一动发财的小手,给小弟点个赞和收藏,如果能获得小伙伴的关注将是我无上的荣耀和前进的动力。
小伙伴们,我是AI大佬的小弟,希望大家喜欢!!!
晚安,兄弟们。