【Python020--内嵌函数和闭包】
一、内嵌函数&闭包
1、最好是访问全局变量而不是修改全局变量,修改全局变量Python会内部屏蔽(修改后,函数会内部创建一个和全局变量一抹一样的变量)
>>> count = 5
>>> def MyFun():
count = 10
print(10)
>>> MyFun()
10
>>> print(count)
5
>>>
---外部先定义了一个count的全局变量,然后MyFun()内部对count进行了修改,打印MyFun()函数发现,是修改后的count,但是在打印count变量,仍然是全局变量的值5,这说明函数内对全局变量的修改,会直接被屏蔽
2、global关键字(可以用global关键字进行修改)
>>> count =5
>>> def MyFun():
global count
count = 10
print(10)
>>> MyFun()
10
>>> print(count)
10
>>>
3、内嵌函数(内部函数):函数内部创建另外一个函数
>>> def fun1():
print('fun1正在被调用!')
def fun2():
print('fun2正在被调用!')
fun2()
>>> fun1()
fun1正在被调用!
fun2正在被调用!
4、闭包:
def FunX(x):
def FunY(y):
return x*y
return FunY
>>> FunX(8)(5)
40
>>> i = FunX(8)
>>> i
<function FunX.<locals>.FunY at 0x10598b400>
>>> i(5)
40
---闭包满足的两个条件:a、首先FunY是FunX的内部函数,并且FunY引用FunX的整个作用域 b、FunY引用FunX的变量x
---闭包的基本形式:
在函数FunX中,定义FunY,FunY只能引用FunX定义的变量,之后FunX函数返回FunY函数的名字
>>> def fun1():
x = 5
def fun2():
x *=x
return x
return fun2()
>>> fun1()
Traceback (most recent call last):
File "<pyshell#75>", line 1, in <module>
fun1()
File "<pyshell#74>", line 6, in fun1
return fun2()
File "<pyshell#74>", line 4, in fun2
x *=x
UnboundLocalError: local variable 'x' referenced before assignment
>>>
---报错的原因:(UnboundLocalError: local variable 'x' referenced before assignment)UnboundLocalError:赋值之前引用的局部变量'x',即:x是个局部变量,fun2赋值的时候x已经被屏蔽了,所以没办法引用
---解决方式:
A、采用数组这样的容器
>>> def fun1():
x = [5]
def fun2():
x[0] *=x[0]
return x[0]
return fun2()
>>> fun1()
25
B、采用nonlocal关键字,强制声明x不是一个局部变量
>>> def fun1():
x = 5
def fun2():
nonlocal x
x *=x
return x
return fun2()
>>> fun1()
25
二、练习题
1、闭包举例:
def fun1():
x = 5
def fun2():
nonlocal x
x +=1
return x
return fun2
a = fun1()
print(a())
print(a())
print(a())
'''执行结果:
6
7
8 '''
2、统计下边这个字符串中各个字符出现的次数并找到尘封送给大家的一句话
str1 = 'aabbc'
list1 = [] #建立空列表的目的:为了后面的if each not in list1:判断去重
for each in str1:
if each not in list1: #目的:把str1中的字符添加到list1中,避免重复比较,
if each == ' \n':
print ('\\n',str1.count(each)) #str1.count(each) 计算str1数组里面each的个数
else:
print(each,str1.count(each))
list1.append(each)
'''执行结果:
a 2
b 2
c 1
'''
'''对比没有list1[]和if each not in list1,来体现去重 '''
print('=======')
str2 = 'aabbc'
for each in str1:
if each == ' \n':
print('\\n',str2.count(each))
else:
print(each,str2.count(each))
'''执行结果:
a 2
a 2
b 2
b 2
c 1
'''
#对比的结果:前后两个执行结果可以得知:引入list1[]空列表以及后续的判断,目的都是为了统计的去重操作
3、请用已学过的知识编写程序,找出小甲鱼藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:
a)、每位密码为单个小写字母
b)、每位密码的左右两边有且只有三个大写字每
def findSecret(str1):
countA = 0 #统计前面的大写字母
countB = 0 #统计前面的小写字母
countC = 0 #统计后面的大写字母
length = len(str1)
for i in range(length):
if str1[i] == '\n':
continue
if str1[i].isupper(): #如果str1[i]是大写字母
if countB: #如果已经出现了小写字母
countC +=1 #统计后边的大写字母
else: #如果未出现小写字母
countC = 0 #清空后面的大写字母
countA +=1 #统计前面的大写字母
if str1[i].islower(): #如果str1[1]是小写字母
if countA != 3: #如果前面不是三个大写字母
countA = 0 #清空记录,重新统计
countB = 0
countC = 0
else: #如果前面是三个大写字母(满足条件)
if countB: #如果已经存在小写字母
countA = 0 #清空记录,重新统计
countB = 0
countC = 0
else: #如果只有一个小写字母
countB = 1 #标记一下countB
target = i #定位目标
if countA == 3 and countC ==3: #如果前后都是三个大写字母
if i+1 != length and str1[i+1].isupper():#如果第四个也是大写字母(不满足条件)
countB = 0 #清空记录B和C
countC = 0
else: #如果仅有三个大写字母(满足条件)
print(str1[target],end= '') #打印目标,结尾不换行
countA = 3
countB = 0 #清空记录B和C
countC = 0
return ''
str2 = '''dQmaKZSdqKNrnvJlcyVMKuNWmuoOeyKecgjXbmSqnpjwJEaDYoehEklEgJyiksGxdEKgfYRXQecRZgfe
AAAbCCC'''
print(findSecret(str2))
【Python020--内嵌函数和闭包】的更多相关文章
- 函数:内嵌函数和闭包 - 零基础入门学习Python020
函数:内嵌函数和闭包 让编程改变世界 Change the world by program 内嵌函数和闭包 接下来这两节课我们谈的话题可能会"比较高级",所以如果是零基础的朋友, ...
- (十九)python 3 内嵌函数和闭包
内嵌函数:函数里又嵌套一个函数 def fun1(): print('fun1()在被调用') def fun2(): print('fun2()在被调用') fun2() 闭包: 闭包是函数里面嵌套 ...
- 零基础入门学习Python(20)--函数:内嵌函数和闭包
知识点 global关键字 使用global关键字,可以修改全局变量: >>> count = 5 >>> def Myfun(): count = 10 prin ...
- 小甲鱼零基础python课后题 P21 020函数:内嵌函数和闭包函数
测试题 0.如果希望在函数中修改全局变量的值,应该使用什么关键字? 答:globe 1.在嵌套函数中,如果希望在内部函数修改外部函数的局部变量,应该使用什么关键字? 答:nonlocal 2.pyth ...
- Python21之内嵌函数和闭包
一.内嵌函数 内嵌函数指的是在一个函数体内部定义的函数,可以称它为函数的函数,也就是子函数,外部的函数称之为母函数,就类似局部变量和全局变量 子函数体内定义的变量只在其函数内部有效,但其内部可以调用母 ...
- Makefile---make内嵌函数及make命令显示 (九)
原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 这一节我们讲一下make的函数,在之前的章节已经讲到了几个函数:wildcard.patsubs ...
- Makefile所有内嵌函数
一.文本处理函数以下是GNU make内嵌的文本(字符串)处理函数.1 $(subst FROM,TO,TEXT) 函数名称:字符串替换函数—subst. 函数功能:把字串“TEXT”中的 ...
- 3.MVC框架开发(Razor内嵌函数)
1.建立没有返回值的Razor内嵌函数(但是能直接输出内容) 必须以@符号开头,没有返回值但能直接输出内容,比如: @helper showTitle(string strTitle){ ){ @(s ...
- Makefile学习(二)条件判断和内嵌函数
第七章:Makefile的条件执行 条件语句可是是两个不同的变量.或者变量和常量值的比较: 7.1例子: 对变量“CC”进行判断,其值如果是“gcc ”那么在程序连接时使用库“libgnu.so”或者 ...
随机推荐
- C#什么时候需要使用构造函数
只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就需要调用默认构造函数.除非类是 static 的,否则 C# 编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例 ...
- Installing IIS 8 on Windows Server 2012微软官方安装指导
from: https://www.iis.net/learn/get-started/whats-new-in-iis-8/installing-iis-8-on-windows-server-20 ...
- 设置一个div网页滚动时,使其固定在头部,当页面滚动到距离头部300px时,隐藏该div,另一个div在底部,此时显示;当页面滚动到起始位置时,头部div出现,底部div隐藏
设置一个div网页滚动时,使其固定在头部,当页面滚动到距离头部300px时,隐藏该div,另一个div在底部,此时显示: 当页面滚动到起始位置时,头部div出现,底部div隐藏 前端代码: <! ...
- Eureka (数学组合 + 斜率)
由于斜率的储存精度不够,所以使用最简分数表示记录. 合并同一个位置上的点,然后统计个数,利用公式先求出至少包含2个点的数量. 然后再是求某位之上的点与某一斜率的个数,那就是每边至少一个点的个数相乘. ...
- rabbitmq和redis用作消息队列的区别
将redis发布订阅模式用做消息队列和rabbitmq的区别: 可靠性redis :没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息将丢失,不会存在内存中:r ...
- flask 对URL进行安全验证
对URL进行安全验证 虽然我们已经实现了重定向会上一个页面的功能,但是安全问题不容忽视,鉴于referer和next容易被串篡改的特性,我们需要对这些值进行验证,否则会形成开放重定向漏洞 以URL ...
- 转:【专题三】自定义Web服务器
前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网络中的协议有了大致的了解的, 本专题将针对HTTP协议定义一个Web服务器,我们平常浏览网页通过在浏览器中输入一个网址就可以看到 ...
- golang学习笔记5 用bee工具创建项目 bee工具简介
golang学习笔记5 用bee工具创建项目 bee工具简介 Bee 工具的使用 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/instal ...
- php Allocator Jemalloc TCMalloc那个内存分配器比较好?
php Allocator Jemalloc TCMalloc那个内存分配器比较好? php一键安装脚本可以选择是否安装内存优化 You have 3 options for your Memory ...
- highchart 柱状图 分组样例
var chart = Highcharts.chart('container',{ chart: { type: 'column' }, title: { text: '月平均降雨量' }, sub ...