命名关键字参数、函数对象、函数嵌套、名称空间与作用域和闭包函数。
一、命名关键字参数:在定义函数时,*与**之间参数称之为命名关键字参数
特点:在调用函数时,命名关键字参数必须按照key=value的形式传值
二、函数对象
函数是第一类对象:指的是函数的内存地址可以像一个变量值一样去使用
def foo(): #foo=函数的内地址
print('from foo')
1、变量值可以被引用
x = 1
y = x
f = foo
print(f)
f()
2、变量值可以当作参数传给另外一个函数
def bar(x):
print(x)
x()
bar(foo)
3、变量值可以当作函数的返回值
def func(x):
return x
f = func(foo)
print(f)
4、变量值可以当作容器类型的元素
l = [foo,]
print(l)
l[0]()
三、函数嵌套
函数的嵌套调用:在一个函数内部又调用其他函数
def max2(x,y):
if x>y:
return x
else:
return y
def max4(a,b,c,d):
res1 = max2(a,b)
res2 = max2(res1,c)
res3 = max2(res2,c)
return res3
print(max4(1,2,3,4))
函数的嵌套定义:在函数内又定义了其他函数
def func():
def foo():
print('from foo')
foo()
x = 1
print(x)
func()
******************************************************
from math import pi
def circle(radius,action):
def cal_perimeter():
return 2*pi*radius
def cal_area():
return pi*(radius**2)
if action == 1:
res = cal_perimeter()
elif action ==2:
res = cal_area()
return res
res = circle(10,1)
print(res)
四、名称空间与作用域
(1)名称空间相关
1、名称空间Namespaces:指的就是存放名字与值内存地址绑定关系的地方(内存空间)
x = 1
2、名称空间分为三大类
内置名称空间:存放的是python解释器自带的名字
产生:python解释器的启动则产生
销毁:python解释器关闭则销毁
全局名称空间:在顶级定义的名字
产生:执行python程序是产生
销毁:python程序执行完毕后则销毁
局部名称空间:在函数内定义的名字
产生:在函数调用时临时产生
销毁:在函数调用完毕后则销毁
三种名称空间的产生的先后顺序:内置->全局->局部
查找名字的顺序:从当前位置往外一层一层查找
如果当前在局部名称空间:局部->全局->内置
如果当前在全局名称空间:全局->内置
def foo():
len = 222
print(len)
len = 111
foo()
x = 0
def f1():
x=1
def f2():
x = 2
def f3():
x=3
print(x)
f3()
f2()
f1()
(2)作用域:指的是作用范围
全局作用域:包含内置于全局名称空间的名字
特点:全局存活,全局有效
局部作用域:包含局部名称空间的名字
特点:临时存活,局部有效
!!!作用域关系是在函数定义阶段就已经固定死了,与调用位置无关
示范一:
def f1():
print(xxx)
xxx = 111
def f2():
xxx = 222
f1()
f2()
示范二:
xxx = 111
def f1():
print(xxx)
yyy = 222
print(yyy)
f1()
五、闭包函数
闭:封闭,指的是该函数是定义一个函数内部的函数
包:该内部函数包含对外层函数名字的引用
def outter():
x = 1
def inner():
print('from inner',x)
return inner
f = outter
def foo():
x = 111111111
f()
foo()
为函数体传值的两种方式:
def foo():
print('hello %s' %name)
方式一:直接以参数的形式传入
def foo(name)
print('hello %s'%name)
foo('egon')
foo('egon')
foo('egon')
方式二:闭包函数
def outter(name):
def foo():
print('hello %s'%name)
return foo
f = outter('egon')
f()
f()
f()
f1 = outter('alex')
f1()
f1()
f1()