python中的函数嵌套和嵌套调用
作者:LLLLLLLLLLLLIU 发布时间:2021-09-05 01:10:26
函数嵌套和嵌套调用
函数的嵌套
函数的嵌套:在函数里面还有函数。分为外函数和内函数。
嵌套函数是为函数内部服务的,比如减少代码的重复,想要调用函数,要使用函数名,内函数也一样。如果不用函数名调用内函数,内函数就永远不会执行。
内函数的调用
怎么在函数外部调用内函数呢?首先,不能直接调用内函数 ,需要先执行外函数的代码块。
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()
函数中定义函数
在函数内部定义的函数要在函数内部调用
def paint():
print("paint")
def paintA():
print("paintA")
paintA()
paint()
//输出如下:
//paint
//paintA
在函数外部调用函数的结果如下
paintA //试图在函数外部调用paintA()
//以下是报错信息
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-15-1a59d6e3eeb5> in <module>()
5 paintA()
6 paint()
----> 7 paintANameError: name 'paintA' is not defined
函数内的函数可以引用外部变量
但是不可以对其进行修改
a=6
def FuncX(x):
def FuncY(y):
return a*y
// return x*y,这里也可以写这条语句进行测试,因为对于FuncY()来说,x也算外部变量,我这里主要是为了突出外部变量这个概念
return FuncY
FuncX(5)(6)//把5赋给x,6赋给y
//输出结果如下:
36
试图对外部变量进行修改
a=6
def FuncX(x):
def FuncY(y):
#global a 加上这条语句即可修改a的值
a=a*y
return a #试图修改 a 的值
#return a=a*y Python不允许返回赋值表达式,并不是因为修改a的原因,这里更新一下
#更新时间 2019.1.4
return FuncY
FuncX(5)(6)
//报错信息
UnboundLocalError: local variable 'a' referenced before assignment
函数怎么修改外部变量的值的说明
对于全局变量的修改,如果全局变量是int或者str,那么如果想要在函数中对函数变量进行修改,则需要先在函数内,声明其为global或nonlocal,在进行修改, 如果是list或者dict则可以直接修改
来源:https://blog.csdn.net/weixin_44851971/article/details/106216497


猜你喜欢
- 开发中经常会使用npm install 安装依赖包,经常会看到^符号和~符号,现将二者的区别总结如下:版本号 x.y.z : z
- 一、问题这两天在学习使用flask + SQLAlchemy 定制一个web查询页面的demo ,在测试时,发现查询到的结果显示乱码 。这里
- 写在前面的话:Part 1记得刚毕业那时,常幻想着自己是个大艺术家,满怀憧憬的想找一份理想的工作。后来入了行,慢慢的发现自己好像不是这块料;
- <script language="javascript"> function window.onload(
- 大家可以先参考官方演示文档:效果图:'''==============3D scatterplot=========
- jquery作为一款高质量的框架被大多web开发者所推崇。jquery也的确是一款伟大的产品,在实际开发中明显提高了效率。但是任何产品并不是
- 先给出一个四人团对Decorator mode的定义:动态地给一个对象添加一些额外的职责。再来说说这个模式的好处:认证,权限检查,记日志,检
- python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,
- 调取摄像头的实现import numpy as npimport cv2cap = cv2.VideoCapture(0)#参数为0时调用本
- 一看,C盘只有不到2M可用空间,一查原因,sqlserver安装路径下的log目录文件占了好大,5G多, 于是上网搜了下,解决了: 把与sq
- 详解微信小程序中的页面代码中的模板的封装 最近在进行微信小程序中的页面开发,其实在c++或者说是js中都
- 高级特性切片操作:对list,tuple元素进行截取操作,非常简便。L[0:3],L[:3] 截取前3个元素。L[1:3] 从1开始截取2个
- 在 Facebook 上有一个彩蛋:登录 facebook.com ,点击你首页的任何地方,键盘输入 Up, Up, Down, Down,
- 需求是根据当前登录用户来显示某个choice字段不同的选择项。先放现在的实现版本。1、重写PushRuleForm的__init__方法,让
- 环境: 开发的IDE:JBuilderX 使用的数据库:MS Sql Server 2000 使用的数据库驱动:JSQL Driver(JD
- PDOStatement::setAttributePDOStatement::setAttribute — 设置一个语句属性(PHP 5
- 要自动发微博最简单的办法无非是调用新浪微博的API(因为只是简单的发微博,就没必要用它的SDK了)。参考开发文档http://o
- 利用Python将Market1501的分割图片和原图两张图片进行拼接成一左一右一张图片,并将图片的像素值调整成256*128.所有文件夹:
- 近来实验室的师姐要 * 文,由于论文交稿时间临近,有一些杂活儿需要处理,作为实验室资历最浅的一批,我这个实习生也就责无旁贷地帮忙当个下手。今天
- 在处理图像的时候经常是读取图片以后把图片转换为灰度图。作为一个刚入坑的小白,我在这篇博客记录了四种处理的方法。首先导入包:import nu