python 函数嵌套和嵌套调用

本文详细介绍了Python中的函数嵌套,包括内函数的调用方式,如通过函数名调用和使用return调用。同时,讨论了变量的作用范围,强调了内函数可以访问外函数变量但修改需使用nonlocal。最后,提到了函数的嵌套调用概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数的嵌套

函数的嵌套:在函数里面还有函数。分为外函数和内函数。
嵌套函数是为函数内部服务的,比如减少代码的重复,想要调用函数,要使用函数名,内函数也一样。如果不用函数名调用内函数,内函数就永远不会执行。

内函数的调用

怎么在函数外部调用内函数呢?首先,不能直接调用内函数 ,需要先执行外函数的代码块。

def func1():
	print("这是外部函数")
	def func2():
		print("这是内部函数")
func2()  

没有执行外函数内部的代码块,python找不到内函数,所以报name ‘func2’ is not defined,函数func2()没有定义

有几种方式可以实现对内函数的调用。
1.在外函数内部调用内函数,即用函数名调用

def func1():
	print("这是外部函数")
	def func2():
		print("这是内部函数")
	func2() #函数名调用内函数
func1() 

这样调用外函数也会执行内函数的代码块了

2.可以用return调用内函数

在使用return之前,需要说明一点:我们都是使用"函数名()“调用函数的方法,单独使用"函数名”,我们会得到函数的内存地址;(函数名后面加括号才会告诉python,参数是否对得上,然后执行函数的代码块。)

  • "return函数名()"调用内函数
def func1():
	print("这是外部函数")
	def func2():
		print("这是内部函数")
	return func2()
func1()

函数没有返回值,即返回值为None,"return func2()"和"func2()"的效果是一样的

def func1():
	print("这是外部函数")
	def func2():
		print("这是内部函数")
	return func2()
m = func1() #调用函数func1(),调用函数func2的方法
print(m)    #m为None
  • 外函数内部"return函数名",也可以调用内函数,只不过调用外函数时多加一个括号
def func1():
	print("这是外部函数")
	def func2():
		print("这是内部函数")
	return func2
m = func1() 
print(m)
# 
#执行结果为
这是外部函数
<function func1.<locals>.func2 at 0x0000000002EB6620>

上面可以看到,使用函数名得到的是函数的地址,我们可以用一个变量指向这个地址,相当于创建一个变量,这个变量指向的是函数的地址。因为只有函数名是不能调用函数的方法的,所以调用外函数时要用到双括号。

def func1():
	print("这是外部函数")
	def func2():
		print("这是内部函数")
	return func2
func1()() ##执行func1()会返回func2然后再func2()
# m = func1()
# m()

我们可以用func1()返回一个函数func2,再加一个括号调用内函数的方法。

小结:想要调用内函数,首先要调用外函数,即执行外函数的代码块,才有内函数调用的环境。在外函数内部,可以用函数名调用内函数。也可以用return调用内函数,如果return是函数本身的地址,调用外函数时会用到双括号,先调用func1()得到func2然后再func2()。如果return func2(),那么和func2()是一样的,都是告诉python调用内函数。

变量的作用范围

外函数里面的变量和内函数里面的变量是有区别的,作用范围不一样。内函数也可以使用外函数的变量,但是如果想要在内部函数修改外部函数变量的值,就要使用关键字nonlocal

def func1():
	b = 2
	def func2():
		nonlocal b
		b = b - 1
	func2()
	print(b)

函数的嵌套调用

在一个函数里面调用别的函数

def print1():
	print("这是第一个函数")
def print2():
	print("这是定义的第二个函数")
	print1() #在print2()中调用print1()
print2()
### Python 函数嵌套调用的语法使用方法 在 Python 中,函数可以在另一个函数内部定义并被其函数调用。这种方式被称为嵌套函数,有助于实现更精细的作用域控制以及代码逻辑上的封装[^1]。 #### 定义与基本结构 当一个函数位于另一个函数内时,它仅能在该函数范围内访问: ```python def outer_function(): print("这是函数") def inner_function(): # 这里定义了一个内部函数 print("这是内部函数") inner_function() # 函数调用了内部函数 ``` 上述例子展示了如何在一个名为 `outer_function` 的函数体内声明一个新的局部函数 `inner_function` 并立即执行它。注意,除非通过返回或其他方式传递给其他部分,否则无法从面直接访问到这个内部函数。 #### 返回内部函数作为结果 除了在函数中直接调用内部函数,还可以将内部函数作为一个对象返回出去,在之后的时间点再对其进行调用: ```python def make_multiplier(factor): def multiply(number): return number * factor return multiply # 返回的是multiply函数本身而不是它的值 ``` 在这个案例里,`make_multiplier()` 接受一个乘数因子作为输入,并创建了一个新的函数 `multiply()` 来处理具体的数值相乘操作;最后不是立刻运行而是把整个未被执行的状态下的 `multiply` 函数当作输出传回去了。 #### 使用场景举例 考虑这样一个实际应用场景——构建带有记忆功能的小工具来计算斐波那契序列中的项: ```python def fibonacci_calculator(n): cache = {} def fib(x): if x not in cache: if x <= 1: result = x else: result = fib(x-1) + fib(x-2) cache[x] = result return cache.get(x) return fib(n) # 计算第n个斐波那契数的同时利用缓存优化性能 ``` 这里运用了闭包的概念,即即使 `fibonacci_calculator` 已经结束执行,由它产生的 `fib` 函数仍然能够记住并继续使用变量 `cache` ,从而提高了效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值