笔记:
1、内嵌函数:函数内部新创建另一个函数
2、闭包:函数式编程的重要语法,如果在一个内部函数里,对外部作用域(但不是在全局作用域的变量)进行引用,那么内部函数就会被认为是闭包。
3、nonlocal:用于声明局部变量
 
测试题
0. 如果希望在函数中修改全局变量的值,应该使用什么关键字?
global 
 
1. 在嵌套的函数中,如果希望在内部函数修改外部函数的局部变量,应该使用什么关键字?
 nonlocal
 

2.Python的函数可以嵌套,但要注意访问的作用域问题哦,请问以下代码存在什么问题呢?

def outside():
print('I am outside!')
def inside():
print('I am inside!')
inside() inside()是内部函数,不能在外部调用
使用嵌套函数要注意一点就是作用域问题,inside()函数是内嵌在outside()函数中的,所以inside()是人妻,除了身为老公的outside()可以碰(调用),在外边或者别的函数体里是无法对其进行调用的。 3. 请问为什么代码A没有报错,但代码B却报错了?应该如何修改?
代码A:
def outside():
var = 5
def inside():
var = 3
print(var)
inside()
outside()
代码B:
def outside():
var = 5
def inside():
print(var)
var = 3
inside()
outside()
这里outside()函数里有一个var变量,但要注意的是,内嵌函数inside()也有一个同名的变量,Python为了保护变量的作用域,故将outside()的var变量屏蔽起来,因此此时是无法访问到外层的var变量的。
应该修改为:
def outside():
var = 5
def inside():
nonlocal var
print(var)
var = 8
inside()
outside()
4. 请问如何访问funIn()呢?
def funOut():
def funIn():
print('宾果!你成功访问到我啦!')
return funIn() funOut() 5. 请问如何访问funIn()呢?
def funOut():
def funIn():
print('宾果!你成功访问到我啦!')
return funIn
funOut()()

6. 以下是“闭包”的一个例子,请你目测下会打印什么内容?
def funX():
x = 5
def funY():
nonlocal x
x += 1
return x
return funY
a = funX()
print(a())
print(a())
print(a()) 6
7
8
有些鱼油可能会比较疑惑,这……怎么跟全局变量一样了?局部变量x不是应该在每次调用的时候都重新初始化了吗?! 其实大家仔细看看就明白了,当a = funX()的时候,只要a变量没有被重新赋值,funX()就没有被释放,也就是说局部变量x就没有被重新初始化。
所以当全局变量不适用的时候,可以考虑使用闭包更稳定和安全,你还可以参考 -> 游戏中的角色移动:闭包在实际开发中的作用 

小甲鱼Python第十九讲课后习题的更多相关文章

  1. 小甲鱼Python第十六讲课后习题--017函数

    函数的定义用def,函数名后要用冒号 函数的返回:函数中使用return   测试题: 0. 你有听说过DRY吗? DRY是指Don't Repeat Yourself ,特指在程序设计以及计算中避免 ...

  2. 小甲鱼Python第十八讲课后习题

    笔记: 1.函数与过程:过程(procedure)是简单的,特殊且没有返回值的:函数(Function)有返回值 Python严格来说只有函数没有过程 2.局部变量:在局部生效如在函数中定义的变量 3 ...

  3. 小甲鱼Python第二十二讲课后习题

    笔记: 斐波那契数列的两种实现方式:   迭代的方式: 自己写的: def fab(n): n1 =1 n2 =1 n3 =1 if n < 1: return -1 if n ==1: ret ...

  4. 小甲鱼Python第十二讲课后习题---013元组

    0. 请用一句话描述什么是列表?再用一句话描述什么是元组? 列表:一个大仓库,你可以随时往里边添加和删除任何东西.  元组:封闭的列表,一旦定义,就不可改变(不能添加.删除或修改). 1. 什么情况下 ...

  5. 小甲鱼python视频第九讲(课后习题)

    1.列表里可以存放什么东西? 可以存放任何的数据类型, list1 = ['我爱你','i love you',1314] print(list1) 2.向列表中添加元素 append(将参数作为一个 ...

  6. 小甲鱼Python第二十讲课后习题---021

    笔记: 1.lambda表达式的作用: 1)Python写一些执行脚本时,使用lambda就可以省下定义函数的过程,比如说我们只是需要写一个简单的脚本来管理服务器时间,我们就不需要专门定义一个函数然后 ...

  7. 小甲鱼Python第十讲课后题---

    0. 下边的列表分片操作会打印什么内容? >>> list1 = [1, 3, 2, 9, 7, 8]>>> list1[2:5] [2,9,7] 1.请问 lis ...

  8. 小甲鱼Python第十四课后习题

    字符串格式化符号含义    符   号    说     明      %c    格式化字符及其ASCII码[>>> '%c' %97        'a']      %s    ...

  9. 视觉slam十四讲课后习题ch3-7

    题目回顾: 设有小萝卜一号和小萝卜二号位于世界坐标系中,小萝卜一号的位姿为:q1=[0.35,0.2,0.3,0.1],t2=[0.3,0.1,0.1]^T (q的第一项为实部.请你把q归一化后在进行 ...

随机推荐

  1. VMware 设置网络

    在VMware上安装 系统完成后,设置虚拟网络 这里的VMware 版本为 14. 本文以window server 2016 为例. 在虚拟机上菜单栏中, 编辑  >> 虚拟网络编辑器 ...

  2. Linux记录-open-falcon开源监控系统部署

    参考https://book.open-falcon.org/zh_0_2/quick_install/prepare.html一.安装后端1.环境准备yum -y install redisyum ...

  3. EF CodeFirst系列(2)---CodeFirst的数据库初始化

    1. CodeFirst的默认约定 1.领域类和数据库架构的映射约定 在介绍数据库的初始化之前我们需要先了解领域类和数据库之间映射的一些约定.在CodeFirst模式中,约定指的是根据领域类(如Stu ...

  4. HTML(七)HTML 表单(form元素介绍,input元素的常用type类型,input元素的常用属性)

    前言 表单是网页与用户的交互工具,由一个<form>元素作为容器构成,封装其他任何数量的表单控件,还有其他任何<body>元素里可用的标签 表单能够包含<input> ...

  5. 阿里巴巴图标库iconfont上传svg后,显示不了图片

    AI里面选中图形,点对象-路径-轮廓化描边

  6. “Django用户认证系统”学习资料收集

    首推追梦人物——Django用户认证系统 待续……

  7. 获取reporting services导出pdf的url的方法

    public static string genRptUrl(string strRptServer, string strRptPath, string strRptName, ParameterV ...

  8. 通过命令修改mysql的提示符

    在cmd窗口操作mysql数据库的时候,前面的提示符永远都是mysql>,这个提示符可以通过命令修改. 在登录mysql时修改: mysql -uroot -p --prompt 提示符 登录后 ...

  9. django drf 基础学习3

    一 简述 这里来谈下一些基本原理 二 汇总 1 restful规范 1 根据method不同做不同的操作          request.method='          get(获取) 返回完整 ...

  10. MySql常见的数据类型

    ⒈整型 名称 字节数 tinyint 1 smallint 2 mediumint 3 int/integer 4 bigint 8 特点: 1.如果不设置无符号还是有符号,默认是有符号,如果想设置无 ...