小甲鱼《零基础学习Python》课后笔记(二十):函数——内嵌函数和闭包

时间:2022-06-17
本文章向大家介绍小甲鱼《零基础学习Python》课后笔记(二十):函数——内嵌函数和闭包,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

首次使用makedown进行博客书写,使用起来感觉也不难,主要是功能需要比较少,不过编写出来的文章很美观。 测试题 0.如果希望在函数中修改全局变量的值,应该使用什么关键字? 使用global关键字。使用global关键字使函数内的局部变量修改为全局变量。

>>> number = 1  
>>> def fun1():  
	number = 3  
	print(number)  
	  
	      
>>> fun1()  
3  
>>> print(number)  
1  
>>> def fun1():  
	    global number  
	    number = 3  
	    print(number)  
	  
	      
>>> fun1()  
3  
>>> print(number)  
3  

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

使用nonocal关键字。

>>> def outside():  
	    number = 4  
	    def inside():  
	        nonlocal number  
	        number *= number  
	        return number  
	    return inside()  
	  
>>> outside()  
16  

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

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

函数嵌套中,内部函数只能在外部函数的范围内调用,改为:

def outside():  
	print('I am outside!')  
	def inside():  
		print('I am inside!')  
	  
	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()  

因为代码B中var没有定义就使用print打印var,外层函数的var变量内层函数不能访问。 4.请问如何访问funIn()呢?

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

直接调用funOut函数即可:

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

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

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

得加一个小括号:

>>> print(funOut())  
<function funOut.<locals>.funIn at 0x0000021DADD9E9D8>  
>>> type(funOut())  
<class 'function'>  
>>> funOut()()  
宾果!你成功访问到我啦  

我觉得funOut函数返回的funIn类似C语言中的函数名,是一个地址。 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。只要认为funX()函数返回的是funY()的地址就能理解了,a()只不过是调用funY()。