一、函数对象
函数是第一类对象:函数名指向的值可以被当中参数传递
1.1函数名可以被传递
指的是函数名可以被赋值给其他,加括号就可以调用
# name='wuxi'# x=name# print(x,id(x))def func(): print('from func')print(func)#内存地址print(id(func))f = funcprint(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,,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 ydef my_max(a,b,c,d): res=max(a,b) res2=max(res,c) res3=max(res2,d) return res3print(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=1def f1(): def f2(): print(x) return f2x=100def f3(func): x=2 func()x=10000f3(f1())
2.global、nonlocal
global在局部修改全局的不可变类型数据
x=12231name='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:局部修局部 如果想修改多个 逗号隔开