【Python】小甲鱼课后习题第20、21讲--函数(中)
问答题
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讲--函数(中)相关推荐
- 【Python】小甲鱼课后习题第17、18、19讲--函数(上)
问答题 0. 你有听说过DRY吗? 答:DRY 是程序员们公认的指导原则:Don't Repeat Yourself. 快快武装你的思维吧,拿起函数,不要再去重复拷贝一段代码了! 1. 都是重复一段代 ...
- 小甲鱼课后作业_【第九讲勤思课后作业】二元一次方程组的解法巩固加油站
☝点击蓝字关注我们 二元一次方程组解法 巩固|第9讲 二元一次方程组解法:核心是消元 两种消元方法:代入消元法和加减消元法 技巧类解法:系数轮换法和换元法 以下为第9讲勤思班作业的视频讲解 第九讲的巩 ...
- python小课文件_[Python]小甲鱼Python视频第030课(文件系统:介绍一个高大上的东西)课后题及参考解答...
# -*- coding: utf-8 -*- """ Created on Fri Mar 8 15:49:32 2019 @author: Administrator ...
- python小甲鱼笔记
提示:python小甲鱼笔记 文章目录 前言 〇.函数 1.常用基本函数 2.常用表函数 3.常用子函数 4.输入.输出 5.字符串函数 5.快捷键 一.常用函数案例 1.文本输出 2.猜数 if 实 ...
- Python小甲鱼学习笔记31-35
31永久存储pickle模块 一.pickle模块 0.pickle的实质是什么? a.将对象数据以二进制形式保存在文件中 b.将对象数据以二进制形式从文件中读取 输入输出二进制流 1.使 ...
- python 小甲鱼小游戏_Python 小甲鱼教程 Easygui 篇
Python 小甲鱼教程 Easygui 篇 终于有点实质性可以看到摸到的界面了,搜了一下虽然easygui用的不多,但是作为一个起步,z,----,先了解一下吧,e,毕竟道理想通. 下面按照小甲鱼的 ...
- 我要大学答案-大学生都在用的小程序 课后习题答案|实验报告|考研资料|期末真题~
我要大学答案-大学生都在用的小程序 课后习题答案|实验报告|考研资料|期末真题~ 小程序信息 分类:教育学习.信息查询 所属平台:微信 体验方式 使用手机微信APP扫描页面上方二维码体验: 在手机微信 ...
- python语言程序设计课后习题(嵩天老师)
嵩天老师的python语言程序设计课后习题记录 用以记录自己写过的题 四位玫瑰数 四位玫瑰数是4位数的自幂数.自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身. ...
- (第二版)零基础入门Python小甲鱼-笔记-第三章-p5
(第二版)零基础入门Python小甲鱼-笔记-第三章-p5 变量和字符串(下) 上节课讲了有些字符比如换行符.TAB制表符还有单引号.双引号等等...可以通过转义字符来实现,今天来谈谈原始字符串 1. ...
最新文章
- JQuery的插入操作滚动条显示返回顶部
- boost::sort模块实现提供多种分布的灵活随机数生成器的测试程序
- 微型计算机10053拆装,微型计算机的程序设计概要1.ppt
- 【Elasticsearch】 es include_type_name unless the include_type_name parameter is set to true
- android开发:Android 中自定义属性(attr.xml,TypedArray)的使用
- 程序设计实习MOOC / 程序设计与算法(二)第二周测验(2018春季)
- bug人生--状态在编程中的使用
- applet java_在浏览器中运行java applet
- QQ群排名霸屏:快速上排名方法
- 层次分析matlab例题,层次分析法例题
- C语言输出菱形不是梦
- 关于国外硕博士论文搜索和下载的讨论
- 给互联网创业公司的8个建议
- 逻辑思维训练——假设法
- 【背包DP】【2018.9.20普及组模拟】T3(WOJ 3975)保护羊村
- 利用html标记制作静态网页,使用HTML制作网页《静态网页制作》.ppt
- 解决WIN10打开XBOX闪退问题(2022)
- 树莓派4B无线鼠标延迟解决办法
- python学习之文件
- 国标GB28181协议视频监控平台EasyGBS设备播放断流现象的排查分析及解决
热门文章
- [Matlab]切比雪夫Ⅰ型滤波器设计:低通、高通、带通和带阻(2)
- dreamweavercs5创建php,Dreamweaver cs5创建CSS规则的方法
- java文件恢复软件,文件恢复软件 免费-文件恢复软件 免费版
- 求职-在线测评-图形找规律
- 【梯度下降法】Python 梯度下降法拟合正弦曲线 多项式函数傅里叶函数
- Python复习系列:Python基础知识(三)
- 解决:运行pytest时,报错:'TestCaseFunction' object has no attribute 'get_marker'
- Windowns 离线安装WSL2
- [附源码]计算机毕业设计Python+uniapp基于安卓的校园二手书籍交易APP1yh1y(程序+lw+APP+远程部署)
- Linux常用shell语法和命令