Python基础(10):Python函数基础详解

练习最大的收获就是先进行模仿,在发现问题,解决问题,最后掌握!

**上一篇文章题目:**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. 模块化编程:以函数为核心,把复杂项目拆成独立小功能,代码更清晰、易维护。

1.2 什么是函数

简单来说,Python函数就是:有名字(可无名字)、独立完成特定功能的代码段,执行后可能返回一个结果。

具体拆解:

  1. 被命名的:多数函数有专属名字(方便调用),也存在无名字的匿名函数。

  2. 独立且功能专一:函数是独立代码块,只用来完成某一个特定操作,不能功能杂乱。

  3. 返回值:不少函数执行完毕后,会通过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 内层函数名

**注意:**内层函数默认只能在外层函数内部被调用,无法直接在外部全局作用域调用。

执行流程:

  1. 第一步:调用外层函数,启动流程只有主动调用外层函数,才会触发后续的内层函数相关操作;如果不调用外层函数,内层函数仅仅是 "定义在里面",不会被创建,更不会执行。
  2. 第二步:执行外层函数代码,先定义内层函数(不执行) 调用外层函数后,会从上到下 执行外层函数体的代码,当执行到 "def 内层函数 " 这一行时,只是完成内层函数的定义(创建内层函数),并不会立即执行内层函数的函数体。
  3. 第三步:外层函数调用内层函数,触发内层执行 外层函数继续往下执行,当遇到 "内层函数名 () "(内层函数调用语句) ,才会真正触发内层函数的执行,执行完内层函数的所有代码后,会返回到外层函数的调用位置,最后外层函数执行剩余代码(若有),整个流程结束。

案例:

python 复制代码
# 1. 定义外层函数(仅定义,不执行)
def outer_func():
    # 3. 执行到这里:定义内层函数(不执行内层代码)
    def inner_func():
        print("我是内层函数,被嵌套在外层函数里")  # 4. 内层函数被调用时,才执行这行
    
    # 4. 外层函数调用内层函数,触发内层执行
    inner_func()

# 2. 调用外层函数,启动整个嵌套函数流程
outer_func()

对应执行步骤:

  1. 先执行 outer_func()(调用外层函数),启动流程;
  2. 进入 outer_func() 函数体,先执行 def inner_func():,完成内层函数定义(此时不打印内容);
  3. 接着执行 inner_func()(外层调用内层),触发内层函数执行;
  4. 进入 inner_func() 函数体,执行 print 语句,输出内容;
  5. 内层函数执行完毕,返回外层函数;
  6. 外层函数无剩余代码,执行完毕,整个流程结束。

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大佬的小弟,希望大家喜欢!!!

晚安,兄弟们。

相关推荐
SZ1701102316 小时前
N-S图 (盒图) N-S图是“盒子嵌套”,PAD图是“树干分叉”*
python
Evand J6 小时前
【2026课题推荐】基于累计概率方法匹配轨迹的飞行目标轨迹定位,附MATLAB代码的演示效果
开发语言·matlab·目标跟踪·定位·轨迹匹配
_200_6 小时前
Lua 基本数据类型
开发语言·junit·lua
智航GIS6 小时前
8.5 os 模块
python
njsgcs6 小时前
blender内部python调用 cats-blender-plugin 导入模型
python·blender
郝学胜-神的一滴6 小时前
Python类型检查之isinstance与type:继承之辨与魔法之道
开发语言·数据结构·python·程序人生
DLite6 小时前
WSL中使用Mermaid离线生成LangGraph流程图
python·ai·流程图
环黄金线HHJX.7 小时前
【拼音字母量子编程语言AiPQL】
开发语言·ide·人工智能·算法·编辑器·量子计算
天下·第二7 小时前
python - 【编译.py文件】部署运行
开发语言·python