第020讲:函数:内嵌函数和闭包 | 学习记录(小甲鱼零基础入门学习Python)

(标答出处: 鱼C论坛)
《零基础入门学习Python》

测试题:

0.如果希望在函数中改变全局变量的值,应该使用什么关键字?

global

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

  nonlocal

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

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

outside函数可以调用inside函数,但是不能直接从从外面或者别的函数体里调用

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()
 

因为代码B中,local variable ‘var’ referenced before assignment,说的是变量var没有被定义就拿来使用,所以报错
outside()函数中有一个var,inside()函数中也有一个var,python为了保护变量的作用域,故将outside()的var变量屏蔽起来,因此此时是无法访问到外层的var变量的

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

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

funOut(),因为返回的是funIn()函数

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

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

这里需要用funOut()()访问
或者go = funOut() ,然后访问go()

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
当a=funX()的时候,只要a变量没有被重新赋值,funX()就没有被释放,也就是说局部变量x就没有被重新初始化,
所以当全局变量不适用的时候,可以考虑使用闭包更稳定和安全

动动手:
0.统计下边这个长字符串中各个字符出现的次数并找到小甲鱼送给大家的一句话

str1 = '拷贝过来的字符串'
list1=[]
for each in str1:
    if each not in list1:
        if each == '\n':
            print('\\n',str1.count(each))
        else:
            print(each,str1.count(each))
        list1.append(each)

1.请用已经学过的只是编写程序,找出小甲鱼藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:
a)每位密码为单个小写字母
b)没为密码的左右两边均有且只有三个大写字母

str1='拷贝过来的字符串'
countA=0
countB=0
countC=0
length=len(str1)
for i in range(length):
    if str1[i]=='\n':
        cotinue
    if str1[i].isupper():
        if countB==1:
            countC +=1
            countA=0
        else:
            countA+=1
        continue
    if str1[i].islower() and countA==3:
        countB=1
        countA=0
        target=i
        continue
    if str1[i].islower() and countC==3:
        print(str1[target],edn='')

猜你喜欢

转载自blog.csdn.net/qq_38970783/article/details/84488526