Python函数
文章目录
一、函数的嵌套
函数嵌套的定义?
在函数内部还定义了其他的函数,或者调用了其他的函数。
#函数内部还定义了其他的函数
def max1(a,b):
def add1(a,b):
if a>b:
print(a-b)
else:
print(a+b)
return add1(a,b)
max1(100,99)
#函数内部调用其他的函数
def max1(a,b):
if a>b:
return a
else:
return b
def max2(a,b,c):
res = max1(a,max1(b,c))#调用了max1
print(res)
max2(100,99,96)
二、名称空间
名称空间:存放变量的空间 变量包括变量名 变量的绑定关系。
名称空间的分类:内置名称空间,全局名称空间(与内置名称空间一样,执行器打开就存在),局部名称空间(函数内部,调用临时调用,该函数执行完毕则其失效)。
名称空间的加载顺序,内置名称空间,全局名称空间,局部名称空间。执行时变量的查找顺序:该函数内部的局部名称空间 全局变量空间 内置变量空间
三、作用域
局部变量,全局变量
更改全局变量的值global关键字 如 global a a=2
局部变量:nonlocal a, a=1
四、函数对象
函数即对象,所以函数可以被引用,作为参数,作为返回值,作为容器参数等;
#作为容器参数
def get():
print("from get")
def put():
print("from put")
ll = [get,put]
五、闭包函数与装饰器
什么是闭包?
def outer(): name = "Albert" def inner(): print("my name is %s" %name)#引用了外部函数的作用域中的名字。 return inner f=outer()#通过调用外层函数来执行内部函数,打破层级限制。 f()
给函数传值的两种方式,第一种常规的通过参数的传值: def foo1(a,b): if a>b: print (a) else: print(b) foo1(8,9) 第二种:通过闭包的形式传值: def foo1(a,b): def foo2(): if a>b: print(a) else: print(b) return foo2 res=foo1(8,9) res()
装饰器:
#装饰器的简单理解就是用一个函数通过引入一个工具(装饰器)扩展其功能,其中这个工具就叫装饰器, 如下面函数中的index()通过引入了timer()这个装饰器之后,拓展了一个程序运行的小功能。 import time def index(): time.sleep(2) print("welcome to index page ") return 1 def home(name): time.sleep(2) print("welcome %s to home page" %name) def timer(func):#这个函数就是装饰器 def wrapper(*args,**kwargs): start_time=time.time() res = func(*args,**kwargs) end_time=time.time() return res return wrapper index=timer(index)#wrapper函数 home=timer(home)#wrapper函数 home(name="Albert") index() #装饰器的部分 我们为了简洁且容易识别,可用语法糖来标注,用法如下: import time def timer(func):#这个函数就是装饰器 def wrapper(*args,**kwargs): start_time=time.time() res = func(*args,**kwargs) end_time=time.time() return res return wrapper @timer #语法糖,相当于index=timer(index)=>wrapper函数,如果不需要装饰 前面加上"#"即可 def index():#被装饰的函数 time.sleep(2) print("welcome to index page ") return 1 @timer def home(name):#被装饰的函数,引用装饰器后拓展了函数的功能 time.sleep(2) print("welcome %s to home page" %name) home(name="Albert") index()
总结
def ab(x,y):
print(x,y)
def bc():
if x>y:
print(x)
else:
print (x-y)
return bc
res=ab(3,8)#执行过程当res(3,8)执行的时候,先找到变量地址res=ab(3,8),然后可见执行了ab(3,8),所以打印print(x,y)向下的def bc():体内的代码并不会执行,原因是这一步只执行def bc()语法的检测,这里的return bc只返回了函数的内存地址,没有执行。
res() 这一步的执行bc()函数。