python81-Python的函数之局部函数

前面所看到的函数都是在全局范围内定义的,它们都是全局函数。Python 还支持在函数体内定义函数,这种被放在函数体内定义的函数称为局部函数。

在默认情况下,局部函数对外部是隐藏的,局部函数只能在其封闭(enclosing)函数内有效其封闭函数也可以返回局部函数,以便程序在其他作用域中使用局部函数。

# !/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2024/01

# @Author : Laopi

#定义函数,这个函数包含局部函数

def get_math_func(type,nn):

#定义一个计算平方的局部函数

def square(n): #①

return n*n

#定义一个计算立方的局部函数

def cube(n): #②

return n*n*n

#定义一个计算阶乘的局部函数

def factorial(n): #③

result = 1

for index in range(2,n+1):

result*=index

return result

#调用局部函数

if type =='square':

return square(nn)

elif type == 'cube':

return cube(nn)

else:

return factorial(nn)



print(get_math_func("square",4)) #16

print(get_math_func("cube",4)) #64

print(get_math_func("factorial",4)) #24

上面程序中第一行def get_math_func(type,nn)代码定义了get math func函数,接下来程序的①,②,③号代码定义了3个局部函数,而get_math_func()函数则根据参数选择调用不同的局部函数.

如果封闭函数没有返回局部函数,那么局部函数只能在封闭函数内部调用,如上面程序所示。另外,还会出现一种情况,如果封闭函数将局部函数返回,且程序使用变量保存了封闭函数的返回值,那么这些局部函数的作用域就会被扩大。因此程序完全可以自由地调用它们,就像它们都是全局函数一样。

局部函数内的变量也会遮蔽它所在函数内的局部变量。

def test():

#局部变量name

name = '软件测试划水老师傅'

def testinner():

#访问testinner函数所在test函数内的name局部变量

print(name)#软件测试划水老师傅

name = '测试老痞'

testinner()

test()

运行上面代码,会导致如下错误:

该错误是由局部变量遮蔽局部变量导致的,在testinner()函数中定义的name局部变量遮蔽了它所在test()函数内的name局部变量,因此导致程序中第6行代码报错。

为了声明 testinner()函数中的“name = '测试老痞'”赋值语句不是定义新的局部变量,只是访问它所在test()函数内的name局部变量,Python提供了nonlocal关键字,通过nonlocal语句即可声明访问赋值语句只是访问该函数所在函数内的局部变量。将上面程序改为如下形式。

def test():

#局部变量name

name = '软件测试划水老师傅'

def testinner():

nonlocal name

#访问testinner函数所在test函数内的name局部变量

print(name)#软件测试划水老师傅

name = '测试老痞'

testinner()

test()

增加上面程序中的nonlocal name代码之后,接下来testinner()函数中的name = '测试老痞'就不再是定义新的局部变量,而是访问它所在函数(test()函数)内的name局部变量。

nonlocal和前面介绍的global功能大致相似,区别只是global用于声明访问全局变量,而nonlocal用于声明访问当前函数所在函数内的局部变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软件测试老痞

你的支持,是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值