零基础入门学习Python(11):内嵌函数、闭包和变量作用域
来源:互联网 发布:太阳能功率优化器 编辑:程序博客网 时间:2024/06/04 19:04
零基础入门学习Python(11):内嵌函数、闭包和变量作用域
内嵌函数(也称为内部函数)
>>> def fun1(): print('fun1()正在被调用...') def fun2(): #在func1()中定义一个函数func2() print('fun2()正在被调用...') fun2() #此处是fun1()调用fun2()!!!>>> fun1()fun1()正在被调用...fun2()正在被调用...
闭包
>>> def FunX(x): def FunY(y): return x * y return FunY #返回值是一个内部定义的函数。返回的函数带参数时,则直接写出函数名>>> i = FunX(8)>>> i<function FunY at 0x010601E0>>>> type(i)<class 'function'>>>> i(5)40>>> FunX(8)(5) #闭包可以实现输入不同参数40
不能在外部函数调用内部函数和闭包。
下面介绍下变量作用域:
>>> num = 7 #全局变量>>> def test1(): num = 2 #函数中,局部变量,与全局变量同名 print(num)>>> test1()2>>> num #全局变量值没有改变。7
Python中,可以读取全局变量的值,但是当局部变量与全局变量同名且需要改变时,Python为了保护全局变量,会自动生成一个局部变量。如果想要在函数中改变全局变量的值,需要加上global关键字
>>> def test2(): global num #global关键字说明函数中使用的是全局变量 num = 2 print(num)>>> num #没有调用test2()之前,全局变量num=77>>> test2()2>>> num #调用test2()之后,全局变量改变了2
当定义内部函数或者闭包时,有时需要改变函数中的变量,此时,该变量相对于内部函数或者闭包是全局的,如果想要直接改变该变量的值就会出错,如下:
>>> def test3(): x = 5 #相对test4()就是全局变量 def test4(): x **= 2 #上面的x =5被屏蔽掉了,Python重新生成了一个x,但没有初始值 return x return test4()>>> test3() #直接改变x的值会出错UnboundLocalError: local variable 'x' referenced before assignment
要想解决这种问题,有两种方法
第一种方法是:把变量值存储在列表中
>>> def test3(): x = [5] #因为列表不是存放在栈里面,所以变量不会被屏蔽掉 def test4(): x[0] **= 2 return x[0] return test4()>>> test3()25
第二种方法是:使用nonlocal关键字
>>> def test3(): x = 5 def test4(): nonlocal x #把x强制说成不是局部变量 x **= 2 return x return test4()>>> test3()25
零基础入门学习Python(10):函数
2 0
- 零基础入门学习Python(11):内嵌函数、闭包和变量作用域
- 《零基础入门学习Python》学习过程笔记【020函数的局部变量和全全局变量内部函数和闭包】
- 零基础入门学习Python(27):模块和包
- Python基础:11变量作用域和闭包
- python基础学习之函数(2)-内嵌函数和闭包
- 零基础入门-javaScript学习笔记之变量和作用域
- 零基础入门学习Python(10):函数
- 零基础入门学习Python(20):对象(5)类和对象的内置函数
- Python零基础入门之七变量与内置函数
- python-内嵌函数和闭包
- 【零基础入门学习Python笔记003】插曲之变量和字符串|课习题答案
- Python函数作用域和闭包
- python[变量作用域-函数-闭包-装饰器-生成器]
- 零基础入门学习Python(1)
- 《零基础入门学习Python》学习过程笔记【017函数】
- 《零基础入门学习Python》学习过程笔记【40类和对象的相关内置函数】
- 零基础学python-16.1 作用域快速入门
- 零基础入门学习Python
- 哈理工OJ 1621迷宫问题II(优先队列广搜)
- redis 学习手册之字符串类型strings操作命令
- 安卓布局自适应px适配
- Scala 类型: Type vs. Class(类型与类)
- 贝叶斯邮件过滤算法理论
- 零基础入门学习Python(11):内嵌函数、闭包和变量作用域
- sql2008SQL_server管理器出现shutting down 0x80041033解决办法
- C 标准库 memcpy and memmove 函数的实现
- 十大负面测试用例
- 微信开发之入门教程
- jquery获取密码输入框内的密码
- universal-image-loader设置圆角不显示(无效)的问题
- 基于注解和拦截器的权限控制
- 前台页面实现可选可编辑效果