1、函数对象
2、函数嵌套
3、名称空间和作用域
4、闭包函数
>>>>>>>>>>函数对象<<<<<<<<<<
在python中、函数是第一对象,是第一等公民
本质:函数可以当变量使用
def func: # func = 函数的内存地址
print('from func')
1、可以赋值
f = func
print( f ) = print(func) func 对应的内存地址
f() = 'form func'
2、可以当作参数传给另外一个函数
def func: # func = 函数的内存地址
print('from func')
def foo(x) : # 把 func 传给了 x
print(x)
x()
foo(func)
3、可以当作函数的返回值
def func: # func = 函数的内存地址
print('from func')
def foo(x):
return x
res = foo(func)
print(x)>>>>>>> func 的内存地址
4、可以当作容器类型的元素
l = [ func,]
print( l ) # func 的内存地址
l[0]() # from func
小例子:银行ATM机的框架 用函数搭建
##=全局程序定义阶段
def withdraw():
print(‘取款程序’)
def tranfer():
print('转账程序‘)
def check_balabnce():
print('查询余额程序’)
def save():
print('存款程序‘
)
若想添加功能, 可直接在上面新建函数,添加代码实现
##=调用程序阶段
func_dic = {
'1':['提款’,withdraw],
'2':['转账',tranfer],
'3':['查询余额',check_balance]
'4':['存款',save]
while True:
print('0 退出‘)
for k ,v in func_dic .items():
print(k,v[0])
choice = input('>>>>:).strip()
if choice == '0':
break
if choice in func_dic:
func_dic[choice][1]()
else:
print('输入错误’)
>>>>>>>>>>函数嵌套<<<<<<<<<<
函数嵌套调用 小例子:比大小
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,d)
return res3
print(max4(11,22,99,56))>>>>>>>>99
函数嵌套定义
def f1():
x = 10
def f2():
print('from f2)
print(x) >>>>> 10
print(f2)
f(1)
print(x)>>>>不会找到
print(f2) >>>>不会找到
>>>>>>>>>>名称空间和作用域<<<<<<<<<<
1、namespaces名称空间 :存放名字 的地方
内置名称空间:存放内置的名字。python自带的
生命周期:python解释器启动则产生,关闭则销毁
全局名称空间:存放的是顶级的名字
生命周期:运行python文件时则产生,python文件运行完毕则销毁
局部名称空间:存放的是函数内的名字 不调用函数就没有
生命周期:调用函数则产生,函数调用完毕则销毁
x =10
def foo(m)
m = 111
n = 222
foo() >>>>>>111
##=核心:名字的访问优先级
基于当前所在位置向外查找
函数内---外层函数---全局---内置
案例1
len = 10
def func():
len = 20
print(len)
func() >>>>20
print(len) >>>>>10
案例2
def f1():
x = 111
def f2():
x=222
print(x)
f(2)
x = 444
f(1)>>>>>>>666
=名称空间与作用域的关系是在定义阶段(扫描语法)确立的 与调用位置无关 调用时间无关
x = 111
def f1(): ##= f1()已经被定义了
print(x)
def f2():
x = 222
f1()
f2() >>>> 111
x = 111
def f1():
print(x)
x =222 >>>> 再print的下面 会报错
f1()
作用域
全局作用域:内置名称空间+全局名称空间
特点:全局存活,全局有效
局部作用域:局部名称空间
特点:临时存活 局部有效
global 和 nonlocal 的用法
l = [] l 是可变类型,所以可以直接添加或删除
def func():
l.append(111)
func()>>>>>
print(l)>>>>>['111']
对于不可变类型
x = 111
def func():
global x 全局更改 global
x = 222
func()
print(x) >>>>>222
x = 111
def f1():
x = 222
def f2():
nonlocal x # 声明变量来自于外层函数,不是全局
x = 333
f2()
print(x)
f1()>>>333
print(x)>>>111
>>>>>>>>>>闭包函数<<<<<<<<<<
闭:指的是该函数是定义在函数内的函数
包:指的就算该函数引用了一个外层函数作用域的名字
def outter():
x =111
def wrapper():
print(x)
return wrapper 此处不能加 ()
f = outter()
print(f)
def foo():
x =222
f()
foo()
小案例 为函数体代码传参
一、直接用参数传
def wrapper(x):
print(x)
wrapper(111)
wrapper(222)
二、闭包函数传参
def outter(x):
def wrapper():
print(x)
return wrapper
f1 = outter(111)
f1()
f2 = outter(222)
f2()
None of us is oerfect forever