一、函数对象
函数是第一类对象:函数名指向的值可以被当中参数传递
1.1函数名可以被传递
指的是函数名可以被赋值给其他,加括号就可以调用

# name='wuxi' # x=name # print(x,id(x)) def func(): print('from func') print(func)#内存地址 print(id(func)) f = func print(f) f()#加()就可以调用函数
1.2.函数名可以被当做参数传递给其他函数

def func(): print('from func') def index(args): print(args) args() print('from index') # index(1) index(func)#指的是两个函数,一个函数调用另外一个函数,该函数内又有被调用函数的方法(加括号)
1.3.函数名可以被当做函数的返回值

def index(): print('index') def func(): print('func') return index#当做返回值 res = func() print(res) res()
1.4.函数名可以被当做容器类型的参数

def func(): print('func') print(func()) l = [1,2,func,func()] # [1,2,<function func at 0x000001F7D79899D8>,None] print(l)
循环打印项目功能提示信息 供用户选择 用户选择谁就执行谁

msg="""1 注册 2 登录 3转账""" def register(): username=input('姓名').strip() pwd=input('密码').strip() print('注册完成') def login(): print('login...') def transfer(): print('transfer...') l={ '1':register, '2':login, '3':transfer } while True: print(msg) choice=input('请输入你想进行的功能:>>>').strip() if choice in l: l.get(choice)()
二、函数的嵌套
2.1函数的嵌套调用
嵌套调用:意思就是一个函数里面有另外一个函数。调用该函数就能调用里面那个函数

def max(x,y): if x > y: return x else : return y def my_max(a,b,c,d): res=max(a,b) res2=max(res,c) res3=max(res2,d) return res3 print(my_max(1,2,32,4))
2.2函数的嵌套定义:
def f1(): def f2(): def f3(): print('from f3') f3() f2() f1()
三、名称空间和作用域
3.1什么是名称空间?
#名称空间:存放名称与值绑定关系的地方,三种名称空间,(之前遗留的问题x=1,1存放于内存中,那名
字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方)
3.2名称空间的三种分类?

1.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间中了) len max min 2.全局名称空间:文件级别的代码 x = 1 if 1 ==1 : y = 2 print(y) while True: z = 3 x,y,z都会放到全局名称空间 if for while 无论嵌套多少层 它们内部所创建的名字都是全局名称空间的 3.局部名称空间:函数体内创建的名字都属于局部名称空间 username
3.3名称空间的加载顺序?
python test.py #1、python解释器先启动,因而首先加载的是:内置名称空间 #2、执行test.py文件,然后以文件为基础,加载全局名称空间 #3、在执行文件的过程中如果调用函数,则临时产生局部名称空间
3.4名字的查找顺序(总体方向)
局部名称空间--->全局名称空间--->内置名称空间 #需要注意的是:在全局无法查看局部的,在局部可以查看全局的,如下示例
3.5名称空间的生命周期?

内置名称空间:只要python解释器已启动立马创建 关闭python解释器的时候内置名称空间自动销毁
全局名称空间:只要你右键运行py文件会自动创建 py文件程序运行结束自动销毁
局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)
四、作用域
#1、作用域即范围 - 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效 - 局部范围(局部名称空间属于该范围):临时存活,局部有效 #2、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关,如下 x=1 def f1(): def f2(): print(x) return f2 x=100 def f3(func): x=2 func() x=10000 f3(f1())
2.global、nonlocal
global在局部修改全局的不可变类型数据
x=12231 name='wuxi' def func(): global x,name x = 44444444 name = 'qqqqqqqqq' # func() func() print(x) print(name)
nonlocal 局部修改局部
def func(): x = 1 def index(): nonlocal x x = 2 # print(x) index() print(x) func()
global:局部修改全局 如果想修改多个 逗号隔开
nonlocal:局部修局部 如果想修改多个 逗号隔开