函数嵌套
嵌套调用是在函数内又调用其他函数
def max(x,y):
return x if x > y else y
def max4(a,b,c,d):
res1=max(a,b)
res2=max(res1,c)
res3=max(res2,d)
return res3
print(max4(1,2,3,4))
嵌套定义是在函数内又定义其他函数
# def f1():
# print(‘f1‘)
# def f2():
# print(‘f2‘)
# def f3():
# print(‘f3‘)
# f3()
# f2()
# f1()
名称空间
名称空间分为三类:
1、内置名称空间
python解释器自带的名字,解释器启动的时候生效,关闭的的时候失效。
2、全局名称空间
文件级别的名字,在执行文件时生效,在文件结束或者文件执行期间被删除则失效
# x=1
# def func():
# name=‘egon‘
#
# del func
#
# print(‘===‘)
# print(‘===‘)
# print(‘===‘)
# print(‘===‘)
# print(‘===‘)
3、局部名称空间
存放函数内定义的名字(函数的参数以及函数内的名字都存放于局部名称空间)
在函数调用时临时生效,函数结束时则失效
# def func(x):
# y=2
#
# func(1)
加载顺序:内置名称空间>全局名称空间>局部名称空间
查找顺序:局部名称空间>全局名称空间>内置名称空间
# len=‘global‘ # 第三查找目标
# def f1():
# # len=1 # 第二查找目标
# def f2():
# # len=2 # 第一查找目标
# print(len)
# f2()
#
# f1()
作用域
全局作用域:包含内置名称空间与全局名称空间的名字
特点:
1、在任何位置都可以访问的到
2、该范围会伴随这个生命周期
局部作用域:包含局部名称空间的名字
特点:
1、只能在函数内使用
2、调用函数时生效,调用结束时失效
函数对象
因为函数是第一类的对象,函数我们可以像变量一样引用,当做数据传递
1、可以被引用
# x=1
# y=x
# def bar():
# print(‘from bar‘)
#
# f=bar
# f()
2、可以当做参数传入
# def bar():
# print(‘from bar‘)
#
# def wrapper(func): #func=bar
# func() #bar()
#
# wrapper(bar)
3、可以当做函数当中的返回值
# def bar():
# print(‘from bar‘)
# def foo(func): #func=<function bar at 0x00000225AF631E18>
# return func #return <function bar at 0x00000225AF631E18>
# f=foo(bar) #f=<function bar at 0x00000225AF631E18>
# # print(f)
# f()
4、可以当做容器类型的元素
# def get():
# print(‘from get‘)
# def put():
# print(‘from put‘)
# l=[get,put]
# # print(l)
# l[0]()
def auth():
print(‘登陆。。。。。‘)
def reigster():
print(‘注册。。。。。‘)
def search():
print(‘查看。。。。‘)
def transfer():
print(‘转账。。。。‘)
def pay():
print(‘支付。。。。‘)
dic={
‘1‘:auth,
‘2‘:reigster,
‘3‘:search,
‘4‘:transfer,
‘5‘:pay
}
def interactive():
while True:
print("""
1 认证
2 注册
3 查看
4 转账
5 支付
""")
choice=input(‘>>: ‘).strip()
if choice in dic:
dic[choice]()
else:
print(‘非法操作‘)
interactive()
闭包函数
定义在函数内部的函数,并且该函数包含对外部函数用域中名字的作用,该函数就成为闭包函数
闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
# def outter():
# name=‘egon‘
# def inner():
# print(‘my name is %s‘ %name)
# return inner
# f=outter()
作用域关系:在函数定义阶段就规定死勒,与调用位置无关
# def outter():
# x=2
# def inner():
# x=1 # f在定义时固定死了
# print(‘from inner‘,x)
# return inner
# f=outter
# def foo():
# x=1111 # 在此处调用也不会改变x的值
# f()
# foo()
1 db_path=‘db.txt‘ 2 def get_uname(): 3 while True: 4 uname=input(‘用户名>>:‘).strip() 5 if not uname.isalpha(): 6 print(‘\033[45m用户名必须为英文字母...\033[0m‘) 7 continue 8 with open(r‘%s‘ %db_path,‘r‘,encoding=‘utf-8‘) as f: 9 for line in f: 10 uinfo=line.strip(‘\n‘).split(‘,‘) 11 if uname == uinfo[0]: 12 print(‘\033[45m用户名已存在...\033[0m‘) 13 break 14 else: 15 return uname 16 def get_pwd(): 17 while True: 18 pwd1=input(‘请输入密码>>: ‘).strip() 19 pwd2=input(‘再次输入密码>>: ‘).strip() 20 if pwd1 == pwd2: 21 return pwd1 22 else: 23 print(‘\033[45m两次输入的密码不一致,请重新输入...\033[0m‘) 24 def get_bal(): 25 while True: 26 bal=input(‘请输入余额: ‘).strip() 27 if bal.isdigit(): 28 # bal=int(bal) 29 return bal 30 else: 31 print(‘\033[45m钱必须是数字,傻叉...\033[0m‘) 32 def file_hanle(uname,pwd,bal): 33 with open(r‘%s‘ %db_path,‘a‘,encoding=‘utf-8‘) as f: 34 f.write(‘%s,%s,%s\n‘ %(uname,pwd,bal)) 35 def register(): 36 uname=get_uname() #拿到合法的用户名 37 pwd=get_pwd() #拿到合法的密码 38 bal=get_bal() #拿到合法的余额 39 file_hanle(uname,pwd,bal) #写入文件 40 register()