问答题


1. 在嵌套的函数中,如果希望在内部函数修改外部函数的局部变量,应该使用什么关键字?

答:nonlocal 关键字。举例如下:

>>> def Fun1():x = 5def Fun2():nonlocal xx *= xreturn xreturn Fun2()>>> Fun1()
25

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

def outside():print('I am outside!')def inside():print('I am inside!')inside()

答:使用嵌套函数要注意一点就是作用域问题,inside() 函数是内嵌在 outside() 函数中的,所以 inside() 是内部函数,除了外部函数 outside() 可以调用,在外边或者别的函数体里是无法对其进行调用的。

正确的调用应该是:

def outside():print('I am outside!')def inside():print('I am inside!')inside()
outside()

需要注意内部函数定义以后要记得调用,否则白白定义了。

3. 请问为什么代码 A 没有报错,但代码 B 却报错了?应该如何修改?

代码 A:

def outside():var = 5def inside():var = 3print(var)inside()
outside()

代码 B:

def outside():var = 5def inside():print(var)var = 3inside()
outside()

答:仔细一看报错的内容是:UnboundLocalError: local variable ‘var’ referenced before assignment,说的是变量 var 没有被定义就拿来使用,肯定错啦!

这里 outside() 函数里有一个 var 变量,但要注意的是,内嵌函数 inside() 也有一个同名的变量,Python 为了保护变量的作用域,故将 outside() 的 var 变量屏蔽起来,因此此时是无法访问到外层的 var 变量的。

应该修改为:

def outside():var = 5def inside():nonlocal varprint(var)var = 8inside()
outside()

4. 请问如何访问 funIn() 呢?

def funOut():def funIn():print('宾果!你成功访问到我啦!')return funIn()

答:只需要直接调用 funOut() 即可:

funOut()
宾果!你成功访问到我啦!

5*. 请问如何访问 funIn() 呢?

def funOut():def funIn():print('宾果!你成功访问到我啦!')return funIn

答:区别于上一题,这里你就需要用 funOut()() 访问啦:

funOut()()
宾果!你成功访问到我啦!

当然你也可以“曲线救国”:

go = funOut()
go()
宾果!你成功访问到我啦!

6*. 以下是“闭包”的一个例子,请你目测下会打印什么内容?

def funX():x = 5def funY():nonlocal xx += 1return xreturn funYa = funX()
print(a())
print(a())
print(a())

答:会打印:

6
7
8

此处注意 a=fun(X) 也就是 a=fun(Y),所以每次调用 a(),x 的值不会初始化为5,而是一直累加。


0. 请使用lambda表达式将下边函数转变为匿名函数?

def fun_A(x, y=3):return x * y

答:

lambda x, y=3 : x * y

2. 感受一下使用匿名函数后给你的编程生活带来的变化?

答:a. Python写一些执行脚本时,使用匿名函数就可以省下定义函数过程,比如说我们只是需要写个简单的脚本来管理服务器时间,我们就不需要专门定义一个函数然后再写调用,使用匿名函数就可以使得代码更加精简。

b. 对于一些比较抽象并且整个程序执行下来只需要调用一两次的函数,有时候给函数起个名字也是比较头疼的问题,使用匿名函数就不需要考虑命名的问题了。

c. 简化代码的可读性,由于普通的屌丝函数阅读经常要跳到开头def定义部分,使用匿名函数函数可以省去这样的步骤。

3. 你可以利用filter()和lambda表达式快速求出100以内所有3的倍数吗?

答:

list(filter(lambda n : not(n%3), range(1, 100)))

【注】如果 lambda 表达式中有 if 语句,则一定需要有 else 语句,否则运行会报错。

4. 还记得列表推导式吗?完全可以使用列表推导式代替filter()和lambda组合,你可以做到吗?

答:例如将第3题转为列表推导式即:

[ i for i in range(1, 100) if not(i%3)]

6. 请目测以下表达式会打印什么?

def make_repeat(n):return lambda s : s * ndouble = make_repeat(2)
print(double(8))
print(double('FishC'))

答:会打印:
16
FishCFishC

动动手


1*. 请用已学过的知识编写程序,找出小甲鱼藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:

a) 每位密码为单个小写字母
b) 每位密码的左右两边均有且只有三个大写字母

答:代码如下:

str1 = '''ABSaDKSbRIHcRHGcdDIF'''countA = 0  # 统计前边的大写字母
countB = 0  # 统计小写字母
countC = 0  # 统计后边的大写字母
length = len(str1)for i in range(length):if str1[i] == '\n':continue"""|如果str1[i]是大写字母:|-- 如果已经出现小写字母:|-- -- 统计后边的大写字母|-- 如果未出现小写字母:|-- -- 清空后边大写字母的统计|-- -- 统计前边的大写字母"""if str1[i].isupper():if countB:countC += 1else:countC = 0countA += 1"""|如果str1[i]是小写字母:|-- 如果小写字母前边不是三个大写字母(不符合条件):|-- -- 清空所有记录,重新统计|-- 如果小写字母前边是三个大写字母(符合条件):|-- -- 如果已经存在小写字母:|-- -- -- 清空所有记录,重新统计(出现两个小写字母)|-- -- 如果该小写字母是唯一的:|-- -- -- countB记录出现小写字母,准备开始统计countC"""if str1[i].islower():if countA != 3:countA = 0countB = 0countC = 0else: if countB:countA = 0countB = 0countC = 0else:countB = 1countC = 0target = i"""|如果前边和后边都是三个大写字母:|-- 如果后边第四个字母也是大写字母(不符合条件):|-- -- 清空记录B和C,重新统计|-- 如果后边仅有三个大写字母(符合所有条件):|-- -- 打印结果,并清空所有记录,进入下一轮统计"""if countA == 3 and countC == 3:if i+1 != length and str1[i+1].isupper():countB = 0countC = 0else:print(str1[target], end='')countA = 3countB = 0countC = 0

【Python】小甲鱼课后习题第20、21讲--函数(中)相关推荐

  1. 【Python】小甲鱼课后习题第17、18、19讲--函数(上)

    问答题 0. 你有听说过DRY吗? 答:DRY 是程序员们公认的指导原则:Don't Repeat Yourself. 快快武装你的思维吧,拿起函数,不要再去重复拷贝一段代码了! 1. 都是重复一段代 ...

  2. 小甲鱼课后作业_【第九讲勤思课后作业】二元一次方程组的解法巩固加油站

    ☝点击蓝字关注我们 二元一次方程组解法 巩固|第9讲 二元一次方程组解法:核心是消元 两种消元方法:代入消元法和加减消元法 技巧类解法:系数轮换法和换元法 以下为第9讲勤思班作业的视频讲解 第九讲的巩 ...

  3. python小课文件_[Python]小甲鱼Python视频第030课(文件系统:介绍一个高大上的东西)课后题及参考解答...

    # -*- coding: utf-8 -*- """ Created on Fri Mar 8 15:49:32 2019 @author: Administrator ...

  4. python小甲鱼笔记

    提示:python小甲鱼笔记 文章目录 前言 〇.函数 1.常用基本函数 2.常用表函数 3.常用子函数 4.输入.输出 5.字符串函数 5.快捷键 一.常用函数案例 1.文本输出 2.猜数 if 实 ...

  5. Python小甲鱼学习笔记31-35

    31永久存储pickle模块 一.pickle模块 0.pickle的实质是什么?   a.将对象数据以二进制形式保存在文件中   b.将对象数据以二进制形式从文件中读取   输入输出二进制流 1.使 ...

  6. python 小甲鱼小游戏_Python 小甲鱼教程 Easygui 篇

    Python 小甲鱼教程 Easygui 篇 终于有点实质性可以看到摸到的界面了,搜了一下虽然easygui用的不多,但是作为一个起步,z,----,先了解一下吧,e,毕竟道理想通. 下面按照小甲鱼的 ...

  7. 我要大学答案-大学生都在用的小程序 课后习题答案|实验报告|考研资料|期末真题~

    我要大学答案-大学生都在用的小程序 课后习题答案|实验报告|考研资料|期末真题~ 小程序信息 分类:教育学习.信息查询 所属平台:微信 体验方式 使用手机微信APP扫描页面上方二维码体验: 在手机微信 ...

  8. python语言程序设计课后习题(嵩天老师)

    嵩天老师的python语言程序设计课后习题记录 用以记录自己写过的题 四位玫瑰数 四位玫瑰数是4位数的自幂数.自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身.‪‬‪‬‪‬‪‬‪ ...

  9. (第二版)零基础入门Python小甲鱼-笔记-第三章-p5

    (第二版)零基础入门Python小甲鱼-笔记-第三章-p5 变量和字符串(下) 上节课讲了有些字符比如换行符.TAB制表符还有单引号.双引号等等...可以通过转义字符来实现,今天来谈谈原始字符串 1. ...

最新文章

  1. JQuery的插入操作滚动条显示返回顶部
  2. boost::sort模块实现提供多种分布的灵活随机数生成器的测试程序
  3. 微型计算机10053拆装,微型计算机的程序设计概要1.ppt
  4. 【Elasticsearch】 es include_type_name unless the include_type_name parameter is set to true
  5. android开发:Android 中自定义属性(attr.xml,TypedArray)的使用
  6. 程序设计实习MOOC / 程序设计与算法(二)第二周测验(2018春季)
  7. bug人生--状态在编程中的使用
  8. applet java_在浏览器中运行java applet
  9. QQ群排名霸屏:快速上排名方法
  10. 层次分析matlab例题,层次分析法例题
  11. C语言输出菱形不是梦
  12. 关于国外硕博士论文搜索和下载的讨论
  13. 给互联网创业公司的8个建议
  14. 逻辑思维训练——假设法
  15. 【背包DP】【2018.9.20普及组模拟】T3(WOJ 3975)保护羊村
  16. 利用html标记制作静态网页,使用HTML制作网页《静态网页制作》.ppt
  17. 解决WIN10打开XBOX闪退问题(2022)
  18. 树莓派4B无线鼠标延迟解决办法
  19. python学习之文件
  20. 国标GB28181协议视频监控平台EasyGBS设备播放断流现象的排查分析及解决

热门文章

  1. [Matlab]切比雪夫Ⅰ型滤波器设计:低通、高通、带通和带阻(2)
  2. dreamweavercs5创建php,Dreamweaver cs5创建CSS规则的方法
  3. java文件恢复软件,文件恢复软件 免费-文件恢复软件 免费版
  4. 求职-在线测评-图形找规律
  5. 【梯度下降法】Python 梯度下降法拟合正弦曲线 多项式函数傅里叶函数
  6. Python复习系列:Python基础知识(三)
  7. 解决:运行pytest时,报错:'TestCaseFunction' object has no attribute 'get_marker'
  8. Windowns 离线安装WSL2
  9. [附源码]计算机毕业设计Python+uniapp基于安卓的校园二手书籍交易APP1yh1y(程序+lw+APP+远程部署)
  10. Linux常用shell语法和命令