news 2026/4/23 12:14:13

Python--函数(下)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python--函数(下)

目录

1.变量作用域

2.函数执行过程

2.1链式调用

2.2嵌套调用

2.3函数递归

3.参数默认值

4.关键字参数

1.变量作用域

观察以下代码:

def getPoint(): x = 10 y = 20 return x, y x, y = getPoint()
在这个代码中,函数内部存在x, y,函数外部也有x, y.
但是这两组x, y不是相同的变量,而只是恰好有一样的名字.
变量只能在所在的函数内部生效.
在函数getPoint()内部定义的x, y只是在函数内部生效.一旦出了函数的范围,这两个变量就不再生效了.
def getPoint(): x = 10 y = 20 return x, y getPoint() print(x, y)

在不同的作用域中,允许存在同名的变量
虽然名字相同,实际上是不同的变量.
x = 20 def test(): x = 10 print(f'函数内部 x = {x}') test() print(f'函数外部 x = {x}')
注意:
在函数内部的变量,也称为"局部变量"
不在任何函数内部的变量,也称为"全局变量"
如果函数内部尝试访问的变量在局部不存在,就会尝试去全局作用域中查找
x = 20 def test(): global x x = 10 print(f'函数内部 x = {x}') test() print(f'函数外部 x = {x}')

如果此处没有global,则函数内部的x = 10就会被视为是创建一个局部变量x,这样就和全局变
x不相关了.
if / while / for等语句块不会影响到变量作用域
换而言之,if / while / for中定义的变量,在语句外面也可以正常使用.
for i in range(1, 10): print(f'函数内部 i = {i}') print(f'函数外部 i = {i}')

2.函数执行过程

调用函数才会执行函数体代码.不调用则不会执行.
函数体执行结束(或者遇到return语句),则回到函数调用位置,继续往下执行.
def test(): print("执行函数内部代码") print("执行函数内部代码") print("执行函数内部代码") print("1111") test() print("2222") test() print("3333")

2.1链式调用

前面的代码很多都是写作
# 判定是否是奇数 def isOdd(num): if num % 2 == 0: return False else: return True result = isOdd(10) print(result)
实际上也可以简化写作
print(isOdd(10))
把一个函数的返回值,作为另一个函数的参数,这种操作称为链式调用.
这是一种比较常见的写法

2.2嵌套调用

函数内部还可以调用其他的函数,这个动作称为"嵌套调用" .
def test(): print("执行函数内部代码") print("执行函数内部代码") print("执行函数内部代码")
test函数内部调用了print函数, 这里就属于嵌套调用
一个函数里面可以嵌套调用任意多个函数.
函数嵌套的过程是非常灵活的
def a(): print("函数 a") def b(): print("函数 b") a() def c(): print("函数 c") b() def d(): print("函数 d") c() d()
如果把代码稍微调整,打印结果则可能发生很大变化.
def a(): print("函数 a") def b(): a() print("函数 b") def c(): b() print("函数 c") def d(): c() print("函数 d") d()

函数之间的调用关系,Python中会使用一个特定的数据结构来表示,称为函数调用栈.每次函数调用,
都会在调用栈里新增一个元素,称为栈帧.
可以通过PyCharm调试器看到函数调用栈和栈帧.
在调试状态下, PyCharm左下角一般就会显示出函数调用栈
每个函数的局部变量,都包含在自己的栈帧中
def a(): num1 = 10 print("函数 a") def b(): num2 = 20 a() print("函数 b") def c(): num3 = 30 b() print("函数 c") def d(): num4 = 40 c() print("函数 d") d()

选择不同的栈帧,就可以看到各自栈帧中的局部变量

2.3函数递归

递归是 嵌套调用 中的一种特殊情况,即一个函数嵌套调用自己.
代码示例:递归计算5!
def factor(n): if n == 1: return 1 return n * factor(n - 1) result = factor(5) print(result)
上述代码中,就属于典型的递归操作.factor函数内部,又调用了factor自身.
注意:递归代码务必要保证
存在递归结束条件.比如if n == 1就是结束条件.n1的时候,递归就结束了.
每次递归的时候,要保证函数的实参是逐渐逼近结束条件的.
如果上述条件不能满足,就会出现"无限递归" .这是一种典型的代码错误
def factor(n): return n * factor(n - 1) result = factor(5) print(result)

递归的优点
递归类似于"数学归纳法" ,明确初始条件,和递推公式,就可以解决一系列的问题.
递归代码往往代码量非常少.
递归的缺点
递归代码往往难以理解,很容易超出掌控范围
递归代码容易出现栈溢出的情况
递归代码往往可以转换成等价的循环代码.并且通常来说循环版本的代码执行效率要略高于递归版
.
实际开发的时候,使用递归要慎重!

3.参数默认值

Python中的函数,可以给形参指定默认值.
带有默认值的参数,可以在调用的时候不传参.
代码示例:计算两个数字的和
def add(x, y, debug=False): if debug: print(f'调试信息: x={x}, y={y}') return x + y print(add(10, 20)) print(add(10, 20, True))
此处debug=False即为参数默认值.当我们不指定第三个参数的时候,默认debug的取值即为False.
带有默认值的参数需要放到没有默认值的参数的后面
def add(x, debug=False, y): if debug: print(f'调试信息: x={x}, y={y}') return x + y print(add(10, 20))

4.关键字参数

在调用函数的时候,需要给函数指定实参.一般默认情况下是按照形参的顺序,来依次传递实参的.
但是我们也可以通过关键字参数,来调整这里的传参顺序,显式指定当前实参传递给哪个形参
def test(x, y): print(f'x = {x}') print(f'y = {y}') test(x=10, y=20) test(y=100, x=200)

形如上述test(x=10, y=20)这样的操作,即为关键字参数
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:09:21

前端可以转型AI工程师吗?那可太能了...

近来粉丝里面有几个前端Leader,他们略显焦虑的感慨AI对编程领域的冲击太大,尤其是前端,这让他们感受到了不小的压力。 于是,他们想咨询前端是不是能够转AI,并疑惑前端能在AI这个赛道走多远? 只说应用层的…

作者头像 李华
网站建设 2026/4/14 22:39:25

39、深入探索Windows 8防火墙与注册表操作

深入探索Windows 8防火墙与注册表操作 1. Windows 8防火墙概述 在当今数字化时代,计算机面临着各种各样的在线威胁,如病毒、恶意软件和黑客攻击等。很多人认为使用Windows系统时必须配备第三方的杀毒、反恶意软件和防火墙软件,但实际上,Windows 8系统自带的防火墙已经具备…

作者头像 李华
网站建设 2026/4/23 11:27:49

Spring Boot 实战:从零搭建图书管理系统(附完整代码 + 详细教程)

开篇:本文能帮你解决什么问题? 作为计算机应用技术专业的学生,Spring Boot 课程的核心是 “学用结合”—— 但很多初学者会陷入 “懂知识点却做不出项目” 的困境:配置文件不会写、数据库整合报错、接口调试无头绪。 本文面向 S…

作者头像 李华
网站建设 2026/4/23 11:38:34

Kotaemon冥想引导语音生成:放松训练助手

Kotaemon冥想引导语音生成:放松训练助手 在快节奏的现代生活中,越来越多的人开始寻求心理调适与情绪管理的方式。冥想作为一种被广泛验证有效的放松手段,正从专业心理咨询室走向大众日常生活。然而,传统冥想应用往往依赖预录音频&…

作者头像 李华
网站建设 2026/4/18 11:50:28

Kotaemon查询改写模块:提升检索相关性

Kotaemon查询改写模块:提升检索相关性 在企业级智能问答系统的开发中,一个常见的尴尬场景是:系统背后的知识库明明包含了正确答案,但用户提问时却“查无结果”。这种“看得见够不着”的困境,往往并非模型生成能力不足&…

作者头像 李华
网站建设 2026/4/7 16:34:11

13、畅享数字娱乐:音乐、视频与游戏操作指南

畅享数字娱乐:音乐、视频与游戏操作指南 在当今数字化时代,电脑已经成为了我们娱乐生活中不可或缺的一部分。我们可以通过电脑播放音乐、观看视频、玩游戏等,享受丰富多彩的数字娱乐体验。本文将详细介绍如何使用相关工具在电脑上进行音乐播放、视频观看以及音乐文件的处理等…

作者头像 李华